指令格式
匯編指令的代碼格式(Instruction Format)也稱為機器代碼(Machine Code)格式。它由操作碼和地址碼組成:
其中,mod reg r/m
表示尋找操作數的方法,'位移量'表示相對基地址的偏移量,而立即數
表示操作數本身。
1、數據傳送指令的助記符MOV
功能是將數據從一個位置傳送到另一個位置:
mov dest,src ;dest <-- src
其中src表示要傳送的數據,稱為源操作數(Source);dest表示數據將要傳送到的位置,稱為目的操作數(Destination)。
2、將16位寄存器BX的數據傳送到AX寄存器的指令:
mov ax,bx ;指令功能:AX <-- BX
語句格式
匯編語言每條語句占據一行,每行不超過132個字符(MASM6.0是512字符)。
匯編語言的語句由分隔符分成的四個部分組成,有兩種格式,分包是處理器指令和匯編程序偽指令。
1、執行性語句--表達處理器指令的語句:
標號: 處理器指令助記符 操作數,操作數 ;注釋
2、說明性語句--表達匯編程序命令的語句:
名字 偽指令助記符 參數,參數,,...... ; 注釋
匯編語言的自定義標志符(Identifier)有如下規則:
一般由31個字母、數字及規定的特殊符號組成。
不能以數字開頭。
不能使用匯編語言中的關鍵字(Key Word)和保留字等。
匯編語言大小寫不敏感,程序中一般使用小寫字母形式,功能注釋、文字說明通常采用大寫字母形式。
注意:MASM也支持續行符“\”,表示本行內容與上一行內容屬於同一個語句。
源程序框架
匯編語言編程時也常將源程序分成代碼段、數據段或堆棧段。
MASM各版本支持多種匯編語言源程序格式,MASM 6.x版本的簡化段定義源程序格式,程序模板如下:
;example.asm in DOS
.model small ;定義程序的存儲模型(small表示小型模型)
.stack ;定義堆棧段(默認是1KB空間)
.data ;定義數據段
...... ;數據定義(待填)
.code ;定義代碼段
.startup ;程序執行起始,同時設置數據段寄存器DS執行程序的數據段
...... ;主程序(執行填)
.exit ;程序執行結束,返回DOS
...... ;子程序(指令待填)
end ;匯編結束
針對代碼中出現的字段,下面會詳細的講述。
- 存儲模型
存儲模型(Memory Model)決定程序的規模,也確定進行子程序調用、指令轉移和數據訪問的默認屬性。
當使用簡化段定義的源程序格式時,必須有存儲模型.MODEL語句,且位於所有簡化段定義語句之前。其格式為:
.model 存儲模型,語言類型
.MODEL語句確定了程序采用的存儲模型,MASM有7種可以選擇:
運行於DOS下的應用程序可以根據需要選擇前六種模型。FLAT模型只用於32位Windows程序中。
- 邏輯段
堆棧段定義偽指令.STACK創建一個堆棧段,段名是:STACK。堆棧段名可用@STACK預定義操作符表示。
數據段定義偽指令.DATA創建一個數據段,段名是:_DATA。數據段名可用@DATA預定義操作符表示。
代碼段定義偽指令.CODE創建一個代碼段,后可選一個標識符型參數指定該代碼段的段名。如果沒有給出段名,則采用默認段名,默認的代碼段名是:_TEXT。代碼段名可用@CODE預定義操作符表示。
- 執行開始
MASM 6.0引入的.STARTUP指令指明了本程序開始執行的位置,並同時使數據段寄存器DS等於用.DATA偽指令定義的數據段的段基地址。
如果不使用.STARTUP指令,通常可以用如下兩條語句代替:
start: mov ax,@data ;@DATA表示數據段的段地址,先傳送給AX寄存器
mov ds,ax ;設置DS等於AX,即數據段的段地址
標號start也可以使用其他標志符,需要利用最后結束的END指令作為參數來指明開始執行的位置。
- 程序終止
程序的終止有兩種意義上的終止,一種是程序的終止,一種是源程序的匯編結束。
1、程序執行終止使用.exit實現,其實是調用4CH號功能實現:
mov ah,4ch ;DOS功能調用的4CH號
int 21h ;主要以第21H號中斷的形式使用
2、源程序的匯編結束表示將源程序翻譯成目標模板代碼的過程,並不是程序的終止。
end start ;前面使用start標號的結束方式
例:現在我們用上述程序格式,編寫一個在屏幕上顯示信息的程序。將這段代碼內容填入程序開始執行指令之后,就形成了完整的MASM匯編語言的源程序。
;hello.asm(文件名)
.model small
.stack
.data
msg db'Hello,Assembly!',13,10,'$' ;定義要顯示的字符串
.code
.startup
mov dx,offset msg ;指定字符串在數據段的偏移地址
mov ah,9 ;AH賦值9
int 21h ;利用功能調用顯示信息
.exit
end
注意:DOS功能9號調用要求以字符“$”結尾,無法顯示“$”本身。
其中8086支持255個中斷,即中斷0-中斷255。在DOS系統中主要分配21H號中斷。
下面羅列在DOS中使用的基本功能: