MASM有豐富的偽指令。必須搞清這些偽指令的功能及用法,才能編寫出高質量的匯編語言源程序。
MASM的偽指令可分為變量定義語句、符號定義語句、段定義語句、段分配語句、過程定義語句、群定義語句、結構定義語句、記錄定義語句等。
本節重點討論前五種偽指令語句,這些語句在程序中比較重要,使用頻繁。
4.3.1 變量定義語句
變量定義語句用來定義字節、字或雙字等變量。變量定義語句有兩種不同的格式。
1.格式1
[變量名]DB/DW/DD/DF/DQ/DT表達式
功能:為變量分配1個字節/字/雙字/長字/四字/十字節的存儲單元,并給它們賦值。格式1又可分為以下幾種具體用法:
2.格式2
格式2用于定義重復變量。
4.3.2 符號定義語句
編制源程序時,經常將常數或表達式等用一特定符號表示,這時需要用符號定義語句。符號定義語句不占用內存,有兩種基本格式。
1.等值語句(EQU)
格式:符號EQU表達式
功能:將表達式的值賦給EQU左邊的符號。
例如:COUNT EQU 5;COUNT等于5
NUMEQU 13+6-2;NUM等于表達式的值
等值語句在匯編時不產生任何目標代碼,也不占用存儲單元。但在同一個程序中,不能對已定義的符號重新定義。
2.等號語句
格式:符號 表達式
等號語句與EQU語句有同樣的功能,區別在于等號語句定義的符號允許重新定義,使用更加方便靈活。
4.3.3 段定義語句
在匯編程序設計中,需要將存儲器分成若干段,CPU訪問存儲器時,憑借段寄存器對各段進行訪問。通常用段定義語句(SEGMENT/ENDS)來定義各種類型的邏輯段。在MASM5.0以上的匯編語言版本中,有完整定義偽指令和簡化段定義兩種。
1.完整的段定義語句
1)段定義語句
格式:段名SEGMENT[定位類型][,組合類型][,字長選擇][,類別]
任何一個邏輯段從SEGMENT語句開始,以ENDS語句結束。偽指令名SEGM ENT和ENDS是本語句的關鍵字,不可以默認,并且總是成對出現的。語句中段名是必選項,定位類型、組合類型、字長選擇、分類名為可選項。
(1)段名(SEG NAME)
用戶自己選定,不能省略,一個段開始與結尾用的段名應一致。
(2)定位類型(ALIGN TYPE)
定位類型表示對段的起始邊界的要求,可有以下五種選擇:
①PAGE(頁):表示本段從一頁的邊界開始,一頁為256個字節,所以PAGE定義的邊界其地址能整除256,這樣段的首地址的最后八位二進制數一定為‘0’(即以00H結尾)。
②PARA(節):表示本段從一個節的邊界開始,一節為16個字節,所以段的起始地址最后四位二進制數一定為‘0’(即以0H結尾)。PARA通常隱含,即未定義定位類型時,其定位類型為PARA。
③DWORD(雙字):表示本段從4的倍數地址開始。
④WORD(字):表示本段從偶數地址開始,該地址的最低位應為0。
⑤BYTE(字節):表示本段可從任何地址開始定位。
(3)組合類型(COMBINE TYPE)
組合類型用來對各個邏輯段之間的連接方式提出要求,可供選擇的參數有以下六種:
①NONE:表示該段與其他同名段不進行連接,獨立存于存儲器中。如果語句中省略組合類型,則MASM把它作為NONE處理。
②PUBLIC:該段可與其他模塊中的同名段在滿足定位類型的前提下,由低地址到高地址連接起來,組合成一個較大的邏輯段。
③COMMON:該段與其他模塊中的同名段采用覆蓋方式在存儲器中定位,即它們具有相同的段首地址,共享同一個存儲區,而共享存儲器的長度由同名段中最大的段確定。段的內容為所連接的最后一個模塊中的內容,以及沒有覆蓋到的前面COMMON段的部分內容。
④MEMORY:定義該段與其他模塊中的同名段具有相同的首地址,采用覆蓋方式在存儲器中進行連接。與COMMON的不同處是:帶有MEMORY參數的邏輯段覆蓋在其他同名段的最高地址。