匯編學習筆記(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

 

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM