環境:linux使用者直接用終端機即可,windows使用者可用WSL或是建一個linux的虛擬機
先開啟一個c語言檔
$ vim test.c
在檔案內輸入:
void set_to_87(int *p)
{
*p = 87;
}
gcc -Og -c test.c
objdump
去觀看組合言(解讀2進位的test.o,轉換成文字)objdump -d test.o
輸出:
test.o: file format elf64-x86-64
Disassembly 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, @function
set_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-64
Disassembly 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
的意思