PoEdu培训第二次考试
文章类别: 培训作业 0 评论

PoEdu培训第二次考试

文章类别: 培训作业 0 评论

程序是如何运行的 试卷二

1. 计算机能够精确表示所有数值: B

A:     对
B:     错 

2. 假设内存中地址引脚10个,数据引脚8个,那么当前内存的大小为______。

答: 1KB

3. 以下说法正确的是:ABC

A:     32位系统的内存地址是32位
B:     32位内存地址的寻址能力为0xFFFF FFFF
C:     32位系统能管理的地址是4294967295个
D:     64位系统没有指针

4. 下面存储介质中断电后数据即消的是:A B

A:     内存
B:     寄存器
C:     软盘
D:     硬盘

5. 以下哪个说法是错误的: A

A:     虚拟内存存在于内存中
B:     数据压缩可能会导致文件体积变大
C:     磁盘缓存和读入内存操作同步执行
D:     函数共用能节约内存

6. 源代码到可执行文件要经过_ _____, _____的过程。

答:
编译器编译    
链接器链接

7. 任何的程序都需要加载进入______后才能被CPU执行。

答: 内存

最好写成 物理内存.

8. 请写出函数调用的汇编过程:

答:
示例代码: 
int main () {
    printf(“Hades”);
    return 0;
}

程序反汇编代码大致如下:

    ; Hades的字符串地址我们假设为 0x0011BBEA
    push 0011BBEA 
    ; 调用 printf 函数, 假设这个函数地址为 0x0023ADEC
    call printf
    ; 为什么是4? 我个人认为, 是因为我们push了一个字符串的地址, 
    ; 这里因为到了函数最后了, 所以进行栈内存的释放.  
    ; 如果我们上边加上一句 int a
    ; 我想这代码要变成  add esp, 8
    add esp, 4 
    ; 这句汇编码我查询过,
    ; 效果等同于 mov eax, 0 
    ; 就是将 eax 清零.
    ; 但是xor eax, eax不另外占用空间, 而mov因为有个0, 所以会占用空间多一点...
    ; 为什么会存在我没有深究, 反正写了几个测试程序反汇编都有这一句.
    ; 不知道是不是将eax的值给ret回去了.
    xor eax, eax  
    ret 

printf 反汇编代码大致如下:

; 保存ebp esp
push ebp
mov ebp, esp
; ....
; 中间过程不再写...
; ....
; 清空printf函数的栈内存; 恢复到上边mov指令执行时候esp的值
add esp, x
pop ebp
ret
    汇编码解释:
        1)将 “Hades” 的内存地址入栈. 
        2) 调用 printf 函数.
        3) 在printf函数内, 保存栈底ebp.
            也就是说, 在main函数内的所有局部变量等信息封存, 保存当前函数的运行上下文.
        4) 保存完成ebp后, 将栈底指向当前栈顶, 保护操作完成.
        5) 进行函数调用, 各种局部变量入栈, 然后各种call
        6) 函数执行完成, 进行esp平衡复原, 就是释放当前函数的栈内存
        7) 出栈ebp, 恢复main函数的执行上下文
        8) 程序顺序执行到 xor eax, eax
    在整个运行过程中, 
        esp始终指向当前函数栈内存的"顶端", 也就是当前函数中 局部变量/传递的参数/执行完跳转地址 的最后入栈的地址,
        ebp始终指向当前函数栈内存的"底端", 也就是当前函数中 局部变量/传递的参数/执行完跳转地址 的最开始入栈的地址.
        eip则始终指向我们CPU即将执行的下一句指令的地址.

9. 操作系统使用哪几个命令操作硬件:

in 寄存器, 端口
out 端口, 寄存器
回复