汇编语言汇总

一段C高级语言程序

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

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

经过GCC编译,简化后核心代码

_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

其中,

push   %ebx

push是cpu指令,%ebx是运算子

push: 在stack顶部增加空间
pop: 在stack顶部回收空间
mov: 在寄存处器中写入值
add: cpu进行相加操作
ret: 中止当前函数,回收栈

所以上述汇编代码的执行顺序和意义如下

_add_a_and_b:
   push   %ebx                      //4.stack中增加4个字节空间,用来存放即将存在ebx寄存器中的值   (4 bytes)
   mov    %eax, [%esp+8]    //5. 向栈底移动 8 bytes,取出值 2 ,放到 eax 寄存器中
   mov    %ebx, [%esp+12]  //6.向栈底移动 12 bytes,取出值 3 ,放到 ebx 寄存器中
   add    %eax, %ebx           //7.把 eax ebx中的值相加,计算 2 + 3 
   pop    %ebx                      //8.释放第4步中创建的栈空间(4 bytes),把计算结果写入ebx寄存器中
   ret                                     //9.回收自身函数的栈空间

_main:
   push   3                            //1.stack压入3   (4bytes)
   push   2                            //2.stack压入2   (4 bytes)
   call   _add_a_and_b        //3.调用add函数
   add    %esp, 8                  //10.回收 第1、2步创建的空间
   ret                                     //11.回收自身函数的栈空间

参考链接:http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html

你可能感兴趣的:(汇编语言汇总)