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)