CPU 指令

表白:黑白圣堂血天使,天剑鬼刀阿修罗。 
讲解对象:/CPU 指令
作者:融水公子 rsgz
汇编教程

汇编教程 http://www.rsgz.top/post/91.html

我们通过函数来理解一下。下面是一个简单的函数

int add_a_and_b(int a, int b) {
   return a + b;
}

int main() {
   return add_a_and_b(2, 3);
}

gcc编译器可以将这个程序转化成汇编语言。发现转换之后的汇编语言就是一行行的指令,CPU只要执行这一行行的指令就可以完成函数的操作了,汇编会用标签add_a_and_b和main代替两个函数

_add_a_and_b:
   push   %ebx
   mov    %eax, [%esp+8]
   mov    %ebx, [%esp+12]
   add    %eax, %ebx
   pop    %ebx
   ret  

_main:
   push   3
   push   2
   call   _add_a_and_b
   add    %esp, 8
   ret

分析:执行的顺序是这样的。

_main:       //栈为_main建立一个帧,地址写入ESP 寄存器
   push   3     //ESP 寄存器减去整型3的四个字节,push指令把3放入main帧里面
   push   2     //ESP 寄存器减去整型2的四个字节,push指令把2放入main帧里面 累积减了8字节
   call   _add_a_and_b  //call指令用来调用函数,建立add_a_and_b帧

--------------------------------------------------------------
_add_a_and_b:  //栈为add_a_and_b建立一个帧,地址写入ESP 寄存器
   push   %ebx   //ESP 寄存器减去四字节,EBX 寄存器里面的值,写入_add_a_and_b这个帧 ,累计减去12字节
   mov    %eax, [%esp+8]  //ESP 寄存器里面地址加8字节,对应的是2,将2写入 EAX 寄存器
   mov    %ebx, [%esp+12] //ESP 寄存器里面地址加12字节,对应的是3,将3写入 EBX 寄存器
   add    %eax, %ebx      //两个运算子相加,并将结果写入第一个运算子
   pop    %ebx            //ESP 寄存器里面地址加4字节,加法已经做完了,EBX 寄存器用不到了
   ret         //ret指令终止当前函数的执行,当前函数的帧将被回收

--------------------------------------------------------------
   add    %esp, 8  // ESP 寄存器地址手动加8个字节,等于说之前的12字节都收回来了
   ret   //ret指令退出main函数

最后我继续画一个画画吧

===

公众号:小雪妃

谢谢大家的支持!可以点击我的头像,进入我的空间浏览更多文章呢。建议大家360doc[www.360doc.com]注册一个账号登录,里面真的有很多优秀的文章,欢迎大家的到来。
---

(0)

相关推荐