如何使用 NASM 來學習組合語言
1. 為何不使用 MASM 來學習?
因為 MASM 不具備跨平台的特性,僅能在 Intel
機器上執行,而且有商業性使用限制,寫出來的程式碼除非有買微軟的軟體和微軟簽約才能發佈,對於使用者是一個負擔。網路上有眾多版本,越新的版本功能越多,但對新手使用也越不方便,所以為何要去惹這個麻煩。最後你不能研究或拿到它的原始碼,因為他不提供競爭對手任何改進空間,對於以後要深入深究編譯器和系統結構,又是一層問題,因此在使用上能避免使用的話盡量避免。
2. 我已經用了 MASM ,怎樣轉換?
它們一樣使用 Intel 的語法,所以照常使用就可以了。但是假指令跟 Macro 部份要請仔細閱讀使用手冊,因為多少有點出入。
3. 如何安裝?
到 http://sourceforge.net/project/showfiles.php?group_id=6208
下載你所要的版本。
(a) Windows 98/XP 要下載 nasm-2.00-win32.zip ,抓下來解壓縮到 c:\nasm
執行就可以了。
(b) Linux 下使用套件管理程式,並尋找 nasm 。
4. 如何使用?
(a) Linux 下開啟終端機然後直接執行 nasm 指令。
(b) Windows 下請到 (開始)->(執行) 並鍵入 cmd 來進入終端機,然後至 c:\nasm
目錄使用程式。(如果 cmd 不會用的話,請去查指令)
5. 如何編輯檔案?
使用 Notepad 或是其他純文字編輯軟體
6. 寫出第一個 Hello World
(a) Linux
將檔案存入 a.asm (程式碼部份)
SECTION .DATA
hello: db 'Hello world!',10
helloLen: equ $-hello
SECTION .TEXT
GLOBAL _start
_start:
; Write 'Hello world!' to the screen
mov eax,4 ; 'write' system call
mov ebx,1 ; file descriptor 1 = screen
mov ecx,hello ; string to write
mov edx,helloLen ; length of string to write
int 80h ; call the kernel
; Terminate program
mov eax,1 ; 'exit' system call
mov ebx,0 ; exit with error code 0
int 80h ; call the kernel
然後執行 nasm -f elf -o a.o a.asm && ld a.o ,
將 a 加上可執行屬性,然後執行 ./a
(b) Windows
將檔案存入 a.asm (程式碼部份)
org 0100H
jmp _start
hello db 'Hello world!',13,10,'$' ; end at $
_start:
; Write 'Hello world!' to the screen
mov ah,9 ; write code 9 for print
mov dx,hello ; string to write
int 21h ; call the kernel
; Terminate program
mov ah,04ch ; 'exit' system call
int 21h ; call the kernel
然後在 c:\nasm\ 目錄下執行 nasm.exe a.asm -o a.com ,
a.com 檔就是執行檔。
7. 如何 Debug ?
(a) Windows 下建議使用 SoftICE 或 Debug (VS 內建的也可)。
(b) Linux 下建議使用 Nemiver 或 GNU Debugger。
8. 題外話:如何更上一層樓?
官方說法是「有恆心有毅力,總有一天會成功」,個人說法是「當書堆到整間臥室都是之後,把垃圾全部扔掉剩下來的就是了」,不負責任說法是「當你想偷開正妹視訊都懶得開的時候」。