為什么使用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