了解寄存器和内存模型以后,就可以来看汇编语言到底是什么了。下面是一个简单的程序example.c
。
int add_a_and_b(int a, int b) {
return a + b;
}
int main() {
return add_a_and_b(2, 3);
}
gcc 将这个程序转成汇编语言。
$ gcc -S example.c
上面的命令执行以后,会生成一个文本文件example.s
,里面就是汇编语言,包含了几十行指令。这么说吧,一个高级语言的简单操作,底层可能由几个,甚至几十个 CPU 指令构成。CPU 依次执行这些指令,完成这一步操作。
example.s
经过简化以后,大概是下面的样子。
_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
可以看到,原程序的两个函数add_a_and_b
和main
,对应两个标签_add_a_and_b
和_main
。每个标签里面是该函数所转成的 CPU 运行流程。
每一行就是 CPU 执行的一次操作。它又分成两部分,就以其中一行为例。
p