2008年3月26日 星期三

最簡單的一個 Assembly 程式

最簡單的一個 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 這篇文章。

沒有留言: