在macOS運行匯編需要的工具有g(shù)cc,nasm,gdb。gcc和nasm系統(tǒng)都自帶了,不過系統(tǒng)自帶的nasm太老了,不能用,我用的macOS High Sierra,用在終端用命令nasm -v
查看一下系統(tǒng)nasm的版本號,看到類似
NASM version 0.98.40 (Apple Computer, Inc. build 11) compiled on Aug 7 2017
用nasm -hf
查看支持的格式,后面幾行顯示如下:
valid output formats for -f are (`*' denotes default):
* bin flat-form binary files (e.g. DOS .COM, .SYS)
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf ELF32 (i386) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
obj MS-DOS 16-bit/32-bit OMF object files
win32 Microsoft Win32 (i386) object files
rdf Relocatable Dynamic Object File Format v2.0
ieee IEEE-695 (LADsoft variant) object file format
macho NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X object files
可以看到其不支持macho64格式,沒法用。我們還是用Homebrew另行安裝吧,用下面命令安裝nasm,順便把gdb一并裝上
brew install nasm gdb
因為系統(tǒng)已經(jīng)有了nasm,如果你直接輸入nasm用的仍是系統(tǒng)自帶的舊nasm,解決辦法有多種,其中一種辦法是使用全路徑/usr/local/bin/nasm
,我們看一下新安裝的nasm的版本號,
/usr/local/bin/nasm -v
可以看到
NASM version 2.13.02 compiled on Nov 30 2017
但是每次都打這么長有點太麻煩了吧,可以起個別名:
alias nasm='/usr/local/bin/nasm'
把這行放到你的Shell啟動文件里,省得每次都輸入了。
環(huán)境安裝完了,我們寫一個功能等價下面C程序的匯編程序,編譯執(zhí)行并反匯編。
C語言代碼
int main() {
return 0;
}
是的,比Hello world程序還簡單。
新建一個文件test.s
global _main
_main:
mov rax, 0
ret
使用下面的方式生成可執(zhí)行文件
nasm -f macho64 test.s
gcc -o test test.o
我們執(zhí)行./test
運行一下,沒有任何輸出。
現(xiàn)在我們用gdb反匯編一下我們剛生成的文件
gdb test
進(jìn)入反匯編環(huán)境,會有提示符
(gdb)
我們輸入disas main
并回車
(gdb) disas main
Dump of assembler code for function main:
0x0000000100000fb2 <+0>: mov $0x0,%eax
0x0000000100000fb7 <+5>: retq
End of assembler dump.
(gdb)
嗯,看起來是有些像。其實,還可以更像一些,輸入并回車
(gdb) set disassembly-flavor intel
這一步是把反匯編的格式調(diào)整稱為Intel的格式。
重新輸入之前的disas main
命令
(gdb) disas main
Dump of assembler code for function main:
0x0000000100000fb2 <+0>: mov eax,0x0
0x0000000100000fb7 <+5>: ret
End of assembler dump.
更接近我們的匯編代碼,以后的教程都會用這種風(fēng)格。
使用Ctrl+D組合鍵退出反匯編環(huán)境。
好了,我們的環(huán)境看起來運作正常,下次繼續(xù)耍。