美文网首页汇编语言
macOS环境汇编语言教程(一):环境搭建

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

作者: redexpress | 来源:发表于2017-12-24 22:39 被阅读500次

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

    相关文章

      网友评论

      • shawn7com:macOS 10.14,gdb 8.1。
        gdb disas main 提示“ not in executable format: File format not recognized”,不知道啥原因,改用lldb, disas -n main ,但是lldb不能设置指令格式~

      本文标题:macOS环境汇编语言教程(一):环境搭建

      本文链接:https://www.haomeiwen.com/subject/lxtkgxtx.html