zoukankan      html  css  js  c++  java
  • 汇编学习笔记(7)-NASM环境搭建(nasm with vs2017)

    前言

      前面已经提到了为什么从MASM转到NASM,并且也简单的介绍了一下MASM和NASM在伪指令和程序结构上的差异,现在就来搭建一下NASM的编译、开发、调试环境吧。

      参考资料:

                          http://blog.csdn.net/duweix/article/details/19911967

                          http://blog.csdn.net/cashey1991/article/details/6773927

                          http://www.mouseos.com/assembly/nasm02.html

                          http://www.linuxidc.com/Linux/2013-01/78271.htm

    WINDOWS

      nasm的安装配置

        nasm的安装包可以在nasm的官方网站下载到最新的版本,注意安装的时候最好是右键管理员安装。

        这之后你可以在CMD中输入 nasm -v 查看nasm的版本,我安装完之后nasm命令是未识别的,所以我手动添加了一下环境变量(如何添加环境变量请自行百度)

        环境变量配置正确之后在cmd中输入 nasm -v  就可以看到nasm 显示了它的版本信息。

      这个时候已经可以使用nasm直接编译汇编代码的,如果只是想编译二进制的代码那么其实这个时候环境搭建就完成了,但是纯二进制的代码在windows 10 上运行调试都很麻烦的。我能想到的一个办法就是以前提到过的,装个虚拟机用磁盘工具写到引导扇区,开机直接运行但是这样调试困难。

      所以还是编译成exe在windows上直接运行吧,这样就可以借助各种调试工具了。但是编译成exe其实也有一个麻烦的地方就是好多中断不能使用, 以后CPU的内存管理啊,cpu的模式切换等等都没法使用,并且屏幕输出很麻烦。但是没关系,先编译成exe把程序逻辑调好,其他的只是接口的调用而已很方便集成的。

        nasm可以通过 -f 指令指定要汇编的目标平台,可以使用 nasm -hf 查看支持的平台模式,默认是纯二进制的

        所以你要编译纯二进制的文件的话,只需使用如下命令

        nasm xx.asm

        windows 32 为进程

        nasm -f win32 helloworld.asm     

        windows 64 为进程

        nasm -f win64 helloworld.asm 

      

      visual stdio的安装

        没办法啊要编译windows的应用vs是躲不过去的, 我安装的是最新的vs2017.怎么装请自行百度咯。

      编译调试

        如何编译成exe参考 http://blog.csdn.net/duweix/article/details/19911967

        主要是两条命令

        1. 先将asm变成.obj文件

          nasm -f win32 helloworld.asm

        2. 将obj文件和c库链接成exe  (cl.exe 是visual stduio的链接器在visual studio路径下的某个目录,或者也可以启动VS 的CMD 直接调用)

          cl.exe helloworld.obj /link libcmt.lib 

      链接博文z中的asm其实是调用了c的print函数在控制台输出了内容。博文中的示例汇编代码 我在公司的vs2008 环境下编译没问题,但是回家用vs2017就出现了找不到链接地址的情况。不知道是不是库不对。反正我没细究。不用print就是。

      

      编译成的exe怎么调试呢?当然使用vs2017啦,当然也可以用windbg,厉害一点的用IDA也是可以的,反正就是各种反汇编调试工具。应为我们本来就是写的汇编,反汇编出来的结果和我们写的代码是一模一样的,所以调试很方便。

     

        这里说一下vs2017具体的调试步骤

        文件 =》打开 =》 项目

        

        直接打开exe

        

        如下图

        

        然后右键 =》调试=》 单步调试

        

        他可能会提示你没找到PDB文件或者没有源代码什么什么的,没关系按确定,然后把反汇编窗口显示出来

        

        你也可以把寄存器窗口显示出现,这样就能看到寄存器的变化。

         

        注意一点: 调试一开始可能不是停在了你汇编开始的位置,而是停在了C库的某个位置,这个时候你  F10 运行几步就会到你代码的开始位置了。

       nasm with vs2017

         前面的步骤已经可是开发编译调试了,但是你写汇编可能用一个文本编辑器 ,编译链接手动敲命令,vs只有在调试的时候才用到太可惜了。

        接下来就是我自己摸索出来的在vs2017集成环境中开发编译调试汇编程序。

        1. 新建一个 C++ 空项目

        2. 右键属性 =》常规 =》配置项目改成 生成文件

          

        3. 然后选择NMake标签 生成命令写上nmake,没错就是利用了windows的nmake工具,windows的nmake和linux下的make是一样的东西,所以同样也需要一个makefile

          

        4. 新建一个makefile文件,内容如下

    # 目标程序的名称,就是定义各一个宏定义,用来指定程序的名字,所以这个 hello.exe 是可以任意替换的,所编写啥
    EXE = hello.exe
    
    # 需要用到的模块 这也是定义个一个宏变量OBJS, hello.obj 实际指的是 hello.asm 汇编文件
    # 所以如果你的汇编文件叫 helloword.asm 你就写 helloword.obj
    # 如果你的程序需要多个汇编文件也是支持的名字用空格隔开即可,也可以用 表示换行,比如
    #OBJ = hello.obj
    #    print.obj
    #    input.obj
    OBJS
    = hello.obj

    #编译的平台32?64
    FORMAT = win32 # 链接命令, 就是链接上面所指定的所有的obj,这个不用改 $(EXE) :$(OBJS) cd Debug cl.exe $(OBJS)
    /link libcmt.lib # 编译.asm成.obj,这是指定obj由asm编译而来,并是哟个下边的编译指令,所以可以看出我这里编译的都是32位的 .asm.obj: nasm -f $(FORMAT) $< -o Debug$*.obj #清除临时文件 clean : del*.obj

          具体makefile的语法规则可参考前言中给出的链接,上面这个是我研究了好久好不容易写出来的makefile,当然也只是研究了个皮毛出来而已。大家将就着试试。

        5. 接下来就可以按F5运行调试,记得打开 反汇编窗口和寄存器窗口。

         

        这是我写的一个例子: https://files.cnblogs.com/files/alwaysking/asm.zip

    LINUX

        linux下没啥继承环境,所以基本就只有敲命令咯

        参考: http://www.linuxidc.com/Linux/2013-01/78271.htm

        1. 先将汇编文件编译成.o文件对应的就是windows下的.obj,注意linux32要要选择编译成 elf32格式 64位要选择编译成 elf64

          nasm -f elf32 hello.asm

        2. 使用GCC将.o文件编译成可执行文件

          gcc -o hello hello.o

        

        make是linux下的项目编译工具,我也简单的写了一个makefile文件    

    # 目标名称
    EXE=hello
    # 需要用到的模块 这也是定义个一个宏变量OBJS, hello.obj 实际指的是 hello.asm 汇编文件
    # 所以如果你的汇编文件叫 helloword.asm 你就写 helloword.obj
    # 如果你的程序需要多个汇编文件也是支持的名字用空格隔开即可,也可以用 表示换行,比如
    OBJS = hello.o 

    #编译的平台32?64
    FORMAT = elf32

    # 连接命令这个不用改
    All:$(OBJS) gcc
    -o $(EXE)
    # 编译对应的asm成.o文件,这个也不用改
    $(OBJS) $(OBJS):
    %.o: %.asm
      nasm
    -f
    $(FORMAT) $< -o $@
    # 清理操作
    .PHONY:clean
    clean:
      rm
    -rf *.o Test @echo "Clean done!"
    
    
    
    
    
    

      

  • 相关阅读:
    Linux下并发网络设计之I/O复用
    嵌入式系统 Boot Loader
    linux下curl编程
    c语言中-----分配内存函数
    关于typedef之四种用途 和 两个陷进
    Libcurl安装及编译
    linux线程之pthread_join和pthread_detach
    Linux系统源码安装过程中的prefix选项
    linux之线程之互斥
    linux之线程
  • 原文地址:https://www.cnblogs.com/alwaysking/p/7789282.html
Copyright © 2011-2022 走看看