一段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