在 Linux 下“看汇编 / 反汇编”,通常分几种场景:看自己写的 C 的汇编、看二进制文件的汇编、看运行时的汇编。下面按实用角度讲。
gcc -S test.c
生成 test.s,里面就是汇编。
想看得更清楚:
gcc -S -O0 -masm=intel test.c
-O0:不优化,好读-masm=intel:Intel 语法(默认是 AT&T)gcc -o test test.c
objdump -d test
常用:
objdump -d -M intel test
只看 main:
objdump -d -M intel test | grep '<main>:' -A 30
gcc -g -O0 test.c -o test
gdb ./test
disassemble main
或者:
disas /m main
/m 会把源码和汇编对应起来,非常好用。
set disassembly-flavor intel
stepi
或者:
si
看寄存器:
info registers
Linux 默认是 AT&T:
mov %eax, %ebx
意思是:把 eax 放到 ebx
Intel:
mov ebx, eax
推荐新手用 Intel:
objdump -M intel
set disassembly-flavor intel
strace ./test
gdb ./test
catch syscall
objdump:反汇编nm:看符号readelf:ELF 结构gdb:动态调试radare2 / ghidra:逆向神器int add(int a, int b) {
return a + b;
}
AT&T 汇编:
add:
push %ebp
mov %esp, %ebp
mov 8(%ebp), %eax
add 12(%ebp), %eax
pop %ebp
ret
Intel 汇编:
add:
push ebp
mov ebp, esp
mov eax, [ebp+8]
add eax, [ebp+12]
pop ebp
ret
如果你愿意,可以告诉我:
我可以直接给你一份“最小可练手示例”。