汇编学习笔记(6)-从MASM至NASM

为什么使用NASM

  1.开源

  2. masm环境搭建麻烦

  3. 似乎MASM已经不能编译纯二进制文件了..(听说)

  4. 因为我学汇编开始的目的是希望汇编程序能在裸机上跑,所以我选择了nasm

NASM 与 MASM的些许差别

  这里有一篇文章说的很不错: http://blog.csdn.net/Lirx_Tech/article/details/42340619

  还有这个解释的比较详细:https://www.cnblogs.com/jiu0821/p/4422464.html

  偶然发现了一个nasm学习的网站: http://www.mouseos.com/assembly/nasm01.html

  nasm的官方文档https://www.nasm.us/doc/nasmdoc1.html

总结一些差别

  1. 没有DUP指令了, 代替的是times 指令

    DW 256 DUP(?)   就变成了   times 256 db 0

  2. 在汇编指令中的标号就代表一个立即数,所以如果是需要应用标号位置的内存需要加上[]

    mov  ax, data        变成   mov ax,[data]

  3. 数组访问

     mov ax,  arr[bx]    变成 mov     ax, [arr + bx] ; 

  4. 地址的段前缀写在[]中

    mov ax, es: arr[bx + di + 9H]  变成 mov ax, [es: arr + bx + di + 9H]

  5. 段的表示

    NASM使用关键字section来定义段,后面跟一个段的名称(用户自取),接下来跟一些段的属性定义

  使用NASM规则的标准段,是指section .data、section .text、section .bss,这三种标准段都默认包含有vstart=0的含义,因此段内的指令以及标号的汇编地址都是段内偏移地址,并且在加载程序的时候会自动使cs指向.text、ds指向.bss、es指向.data而无需人手工来执行对段寄存器赋值的步骤.

    还有就是一个section允许重名,重名的section会被合并,也就是说

    SECTION a
      var1    db    0x01
    SECTION b
      MOV   AX, var1
    SECTION a
      var2    db   0x02

    这样的定义 var1 和 var2 在内存上是连续的。

  6. NASM 以 global 代替 end

      

原文地址:https://www.cnblogs.com/alwaysking/p/7670324.html