读懂汇编
1 什么是汇编?
计算机能运行的是二进制的指令,如00000011
,为了解决可读性和方便编辑的问题,就诞生了汇编语言,所以汇编语言是二进制指令的文本形式,与二进制指令一一对应,如00000011
代表ADD
,二进制与汇编语言都是最底层的低级语言。
由CPU指令和指令对应的运算子构成一条汇编语句,如:
mov %ebx, [%esp+12]
add %eax, %ebx
汇编 assembling 的过程,是由汇编器将汇编语言 assembly language (asm) 编译成二进制。
2 汇编程序的运行过程
int add_a_and_b(int a, int b) {
return a + b;
}
int main() {
return add_a_and_b(2, 3);
}
通过 gcc -S example.c
将C程序得到简化的汇编程序:
_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
Stack 与 帧 的概念
mov 指令:
push 指令:
add 指令:
pop 指令:
ret 指令:
即时编译 JIT code 的编写
以 AVX512 为例
reference:http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html