macOS环境汇编语言教程(一):环境搭建

在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组合键退出反汇编环境。
好了,我们的环境看起来运作正常,下次继续耍。

推荐阅读更多精彩内容