在macOS运行汇编需要的工具有gcc,nasm,gdb。gcc和nasm系统都自带了,不过系统自带的nasm太老了,不能用,我用的macOS High Sierra,用在终端用命令nasm -v
查看一下系统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
因为系统已经有了nasm,如果你直接输入nasm用的仍是系统自带的旧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启动文件里,省得每次都输入了。
环境安装完了,我们写一个功能等价下面C程序的汇编程序,编译执行并反汇编。
C语言代码
int main() {
return 0;
}
是的,比Hello world程序还简单。
新建一个文件test.s
global _main
_main:
mov rax, 0
ret
使用下面的方式生成可执行文件
nasm -f macho64 test.s
gcc -o test test.o
我们执行./test
运行一下,没有任何输出。
现在我们用gdb反汇编一下我们刚生成的文件
gdb test
进入反汇编环境,会有提示符
(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
这一步是把反汇编的格式调整称为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.
更接近我们的汇编代码,以后的教程都会用这种风格。
使用Ctrl+D组合键退出反汇编环境。
好了,我们的环境看起来运作正常,下次继续耍。