最簡單的一個 Assembly 程式
March 24th, 2008 by Chuan-Hsien Lin
Last Modified on March 25th, 2008
本篇介紹寫一個最簡單的 Assembly 程式,首先你得有 Assembler 以及 Linker,才能將你的組合語言程式組譯及連結成執行檔,本文中是使用 Microsoft 的 MASM 6.11。
本範例是以使用 DOS INT 21h/AH=02h 中斷去顯示一個字元 'A' 來作為練習,接下來使用文字編輯軟體將下列幾行程式編寫並存檔成 test.asm,
.MODEL TINY
.CODE
ORG 100h
begin: mov dl, 41h
mov ah, 02h
int 21h
.STACK
END begin
然後執行 ml /AT test.asm 就會將程式組譯並且連結成執行檔了,
C:\masm>ml /AT test.asm
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993. All rights reserved.
Assembling: test.asm
Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992
Copyright (C) Microsoft Corp 1984-1992. All rights reserved.
Object Modules [.obj]: test.obj/t
Run File [test.com]: "test.com"
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]:
可以看的出來已經產生出 object file 以及 .COM 格式的執行檔了,
C:\masm>dir test*
Volume in drive C is system
Volume Serial Number is 9488-6570
Directory of C:\masm
2008/03/24 ?? 05:17 218 test.asm
2008/03/24 ?? 05:32 6 TEST.COM
2008/03/24 ?? 05:32 123 test.obj
3 File(s) 347 bytes
0 Dir(s) 5,750,042,624 bytes free
這就來執行看看,果然執行成功,正常顯示出我們欲顯示的字元 'A'。
C:\masm>test
A
但是別高興的太早了,因為你可以發現剛剛的程式一執行後就當掉停住了,一動也不動,這是因為 DOS 下執行的程式,都還需要呼叫一個 DOS INT 21h/AH=4ch 這個中斷來告訴 DOS 作業系統該程式已經結束了,這樣執行完程式後,才會把控制權交還給 DOS,所以完整的程式如下:
.MODEL TINY
.CODE
ORG 100h
begin: mov dl, 41h
mov ah, 02h
int 21h
mov ah, 4ch
int 21h
.STACK
END begin
這次執行果然程式正常結束,而且返回 DOS 的提示符號下,可以繼續別的動作了,
C:\masm>test
A
C:\masm>
附帶一提,可以看到 .COM 格式的執行檔可真是小巧精美,以上的程式只佔用 10 bytes 空間呢!下面即在 Cygwin 的環境下來顯示該執行檔內容。
$ od -t x1 test.com
0000000 b2 41 b4 02 cd 21 b4 4c cd 21
0000012
關於 DOS INT 21h/AH=4ch 的介紹,可以參考 Ralf Brown's Interrupt List 裡的 http://www.ctyme.com/intr/rb-2974.htm 這篇文章。