码迷,mamicode.com
首页 > 其他好文 > 详细

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

时间:2016-02-29 00:13:32      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

技术分享

技术分享

技术分享技术分享

 

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

 

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

标签:

原文地址:http://www.cnblogs.com/20135105wangxc/p/5225876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!