假设一个C语言源文件包含如下函数定义:
long mult2(long, long);
void multstore(long x, long y, long *dest){
long t = mult2(x, y);
*dest = t;
}
在命令行上使用"-S"选项, 就能看到C语言编译器产生的汇编代码
linux> gcc -Og -S main.c
(对于C++只需将gcc换成g++即可)
这样做后会有一个main.s汇编文件出现在当前文件夹下
- 汇编代码文件包含各种声明, 包括下面几行:
multstore:
pushq %rbx
movq %rdx, %rbx
call mult2
movq %rax, (%rbx)
popq %rbx
ret
上面代码中每个缩进的行都代表一条机器指令.
比如pushq指令表示应该将寄存器%rbx的内容压入程序栈中
现在我们知道, 所有的cpp/c源文件都是要经过编译才能转化为可执行文件.exe
在它转化为可执行文件之前还需要将汇编文件.s经过汇编器转化为.o的二进制格式的目标代码文件.
上面的汇编文件转化为二进制后再进行16进制转换后就是
53 48 89 d3 e8 00 00 00 00 48 89 03 5b c3
能否反过来根据机器代码产生一种类似与汇编代码的格式呢?
在Linux系统中, 带'-d'命令行标志的程序OBIDUMP可以充当反汇编器的角色
linux> objdump -d mstore.o
- 此外, 一些关于机器代码和它的反汇编表示的特性值得注意:
- 反汇编器知识基于机器代码文件中的字节序列来确定汇编代码. 无需访问该程序的源代码或汇编代码
- 反汇编器使用的指令命名规则与GCC生成的汇编带啊使用的有细微的差别.无伤大雅.