2008年1月12日 星期六

如何使用 NASM 來學習組合語言

如何使用 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. 題外話:如何更上一層樓?

官方說法是「有恆心有毅力,總有一天會成功」,個人說法是「當書堆到整間臥室都是之後,把垃圾全部扔掉剩下來的就是了」,不負責任說法是「當你想偷開正妹視訊都懶得開的時候」。

沒有留言:

張貼留言