环境:linux使用者直接用终端机即可,windows使用者可用WSL或是建一个linux的虚拟机
先开启一个c语言档
$ vim test.c
在档案内输入:
void set_to_87(int *p){ *p = 87;}
方法一
先产生一个object file(2进位的格式)gcc -Og -c test.c
再用objdump
去观看组合言(解读2进位的test.o,转换成文字)objdump -d test.o
输出:
test.o: file format elf64-x86-64Disassembly of section .text:0000000000000000 <set_to_87>: 0: c7 07 57 00 00 00 movl $0x57,(%rdi) 6: c3 retq
方法二
直接让gcc产生出组合语言:
gcc -Og -S test.c
这时会产生出test.s(文字档)
cat test.s
输出
.file "test.c" .text .globl set_to_87 .type set_to_87, @functionset_to_87:.LFB0: .cfi_startproc movl $87, (%rdi) ret .cfi_endproc.LFE0: .size set_to_87, .-set_to_87 .ident "GCC: (Debian 10.2.1-6) 10.2.1 20210110" .section .note.GNU-stack,"",@progbits
解读组合语言
void set_to_87(int *p){ *p = 87;}
test.o: file format elf64-x86-64Disassembly of section .text:0000000000000000 <set_to_87>: 0: c7 07 57 00 00 00 movl $0x57,(%rdi) 6: c3 retq
可以看到指令只有两个,这个functio被呼叫时,p
的值会放在register%rdi
里
movl $0x57,(%rdi)
就是把0x57(87)放到%rdi
所指向的记忆体位置的意思
retq
则是return
的意思