zoukankan      html  css  js  c++  java
  • 汇编学习笔记(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

          

  • 相关阅读:
    卸载office密钥的命令
    断言的使用
    stm32的NVIC是什么?
    STM32 Cube mx 安装
    不用移位计算获得高位数据
    分组数据
    Vue Router
    存储过程
    js 中 json.stringfy()将对象、数组转换成字符串
    js中 json对象的转化 JSON.parse()
  • 原文地址:https://www.cnblogs.com/alwaysking/p/7670324.html
Copyright © 2011-2022 走看看