您的位置:首页 > 理论基础

Linux内核及分析 第一周 计算机是如何工作的?

2016-02-28 22:47 239 查看










C语言代码:

int g(int x)

{

return x + 5;

}

int f(int x)

{

return g(x);

}

int main(void)

{

return f(5) + 1;

}

反汇编代码:

g:

pushl %ebp 将ebp的值压栈,同时esp向下移动4个字节

movl %esp, %ebp ebp也指向esp指的位置

movl 8(%ebp), %eax 将ebp变址寻址8即向上移动8个字节,栈中的内容为 8,将8赋值给eax

addl $5, %eax eax = 8+3 = 11

popl %ebp ebp指向栈中值指向的位置,同时esp向上移动4个字节

ret esp向上移动4个字节,同时eip指向栈中值的位置

f:

pushl %ebp 将ebp的值压栈,同时esp向下移动4个字节

movl %esp, %ebp ebp也指向esp指的位置

subl $4, %esp esp向下移动4个字节

movl 8(%ebp), %eax 将ebp变址寻址8即向上移动8个字节,栈中的内容为 8,将8赋值给eax

movl %eax, (%esp) 将8放入esp指向的位置

call g 将eip的值(call指令的下一条)压入esp指向的位置,同时esp向下移动4个字节,eip指向g

leave ebp指向esp指向的位置,ebp指向栈中值的位置,esp向上移动4个字节

ret esp向上移动4个字节,同时eip指向栈中值的位置

main:

pushl %ebp 将ebp的值(0)压栈,同时esp向下移动4个字节

movl %esp, %ebp ebp也指向esp指的位置

subl $4, %esp esp向下移动4个字节

movl $5, (%esp) 将5放入esp指向的位置

call f 将eip的值压入esp指向的位置,同时esp向下移动4个字节,eip指向f

addl $1, %eax eax = 11 + 1 = 12

leave ebp指向esp指向的位置,ebp指向栈中值的位置,esp向上移动4个字节

ret main函数之前的eip的值(由操作系统定)

总结:计算的工作中将寄存器的地址和寄存器中的值压入堆栈中,通过寄存器指针变化和操作对数值进行操作计算,从而得到结果。

作者: 王雪铖

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: