複製鏈接
請複製以下鏈接發送給好友

宏彙編程序

鎖定
宏彙編程序(MASM)是具有宏加工功能的彙編程序。可以用它定義含參數的程序段,在使用的位置上調用它們,彙編時將進行(指令)展開,把宏定義所預先定義的指令目標代碼插在該位置上。
中文名
宏彙編程序
外文名
macroassembler
簡    稱
MASM
領    域
計算機
釋    義
具有宏加工功能的彙編程序
作    用
縮短源代碼、擴充指令集等

宏彙編程序彙編與彙編程序

圖1 彙編程序的功能示意圖 圖1 彙編程序的功能示意圖
彙編語言編寫的源程序也需要翻譯成目標程序才能被機器執行。這個翻譯過程稱為彙編,完成彙編任務的程序稱為彙編程序,見圖1。
彙編程序是最早也是最成熟的一種系統軟件。它除了能夠將彙編語言源程序翻譯成機器語言程序這一主要功能外,還能夠根據用户的要求自動分配存儲區域 (包括程序區、數據區、暫存區等 );自動地把各種進位制數轉換成二進制數,把字符轉換成 ASCII 碼,計算表達式的值等;自動對源程序進行檢查,給出錯誤信息 (如非法格式,未定義的助記符、標號,漏掉操作數等 )等。具有這些功能的彙編程序又稱為基本彙編 (或小彙編 ASM) 。 [1] 

宏彙編程序宏彙編程序

在基本彙編的基礎上,進一步允許在源程序中把一個指令序列定義為一條宏指令的彙編程序,就叫做宏彙編 (MASM)程序 。它包含全部 ASM 功能,還增加了宏指令、結構、記錄等高級彙編語言功能。 [1] 
宏彙編程序的主要特點是在彙編程序中增加宏加工功能。它允許用户方便地定義和使用宏指令,適用於程序中多處出現、具有一定格式、可以通過少數參數調節改變的程序段落的場合。採用這種方法不僅減少程序的長度,增加可讀性,而且程序段落的格式需要改變時,只須改動定義處,而不必改動每一使用處。 [2] 
宏彙編程序不僅包含一般彙編程序的功能,而且用了高級程序使用的數據結構,是一種接近高級程序的彙編程序。例如它提供了記錄、結構和字符串操作;具有宏處理、條件彙編及磁盤操作系統DOS功能調用等多種功能;程序的開發以及調試手段也比較完善。

宏彙編程序使用宏彙編的原因

在編制彙編語言程序過程中,有些功能段需要多次重複使用,所不同的只是參與操操作數。為了減少編程的工作量,通常採用兩種方法:
(1)將程序段編寫為獨立的子程序;
(2)將程序段定義成宏。

宏彙編程序宏(指令)的用途

(1)縮短源代碼;
(2)擴充指令集;
(3)更改某些指令助記符的意義(宏指令的優先級高於指令和偽指令)。

宏彙編程序

宏是計算機軟件系統中一個廣泛存在的概念。從辦公軟件OFFICE到程序開發語言C等等,可以把某項要操作的某一個過程定義為宏。具體到在彙編語言中,宏也是彙編的主要特點之一,它是與子程序類似但又獨具特色的另外一種簡化源程序的方法。
編程語言中,宏是源程序中一段有獨立功能的程序代碼,宏也可以稱為宏指令、宏操作。宏的使用需要經過三個步驟:宏定義、宏調用和宏展開。首先進行宏定義;然後進行宏調用;最後,彙編時由 MASM 進行宏擴展。

宏彙編程序宏定義

宏定義語句MACRO和子程序定義語句PROC一樣都是偽指令。宏定義需要一對 偽指令MACRO和ENDM完成。宏定義的格式如下:
宏名字 MACRO [啞元1,啞元2,…]
...
語句串
...
ENDM
説明:宏定義並不產生目標代碼,只是用來説明“宏名字”與一段源代碼之間的聯繫。其中啞元1,啞元2,…是虛擬參數或形式參數,用逗號分隔。虛參或形參可不設置。
例如:定義鍵盤輸入宏指令INPUT:
INPUT MACRO
MOV AH,01H
INT 21 H
ENDM
需注意的是,起名時,不要和彙編語言的指令名、保留字相同。

宏彙編程序宏調用

在程序中使用宏時,只要寫出宏名字[實參]即可。宏調用的格式為:宏指令名 [實參1,實參2,…,實參n]。
例如,從鍵盤輸入一個字符,判斷是否為“一“號,不是則繼續輸入,是結束。(利用前面定義的宏)。
MODEL SMALL
STACK 100H
CODE
START:
INPUT
CMP AL,‘-‘
JNE START
RETSYS
END START

宏彙編程序宏展開

宏展開將宏指令語句用宏定義中宏體的程序段目標代碼替換。彙編源程序時,宏彙編程序將對每條宏指令語句進行宏展開,用實參替代相應的形參,對宏體目標代碼作相應改變。圖2為一個宏展開的例子。
圖2 圖2

宏彙編程序常用指令

宏彙編程序宏定義偽指令 (MACRO/ENDM)

格式:
宏指令名 MACRO
(宏定義體 )
ENDM
MACRO 是宏定義符, 它將一個宏指令名定義為宏定義體中包含的程序段。 ENDM 表示宏定義結束,前面不需要有宏指令名。進行一次宏定義,以後就可以多次用宏指令名進行宏調用。但是必須先定義,後調用。宏定義允許嵌套,即宏定義體中可以包含另一個宏定義,而且宏定義體中也可以有宏調用,但是也必須先定義,後調用。

宏彙編程序聲明宏體內局部標號的偽指令

LOCAL 的作用是聲明宏體中的局部標號,以免在宏擴展時,同一個標號在源程序中多次出現,從而產生標號多重定義的錯誤。 LOCAL 偽指令必須位於宏體內其他所有語句 (包括註釋 )之前,其格式為:
LOCAL 局部標號 [ ,…]
例如,下面的宏指令完成將寄存器中的一位十六進制數轉換為相應的 ASCII 碼,由於宏體中出現局部標號,因此必須使用 LOCAL 偽指令對宏體中的局部標號進行聲明。
HEXTOASC MACRO REG
LOCAL NUM
CMP REG, 0AH
JC NUM
ADD REG, 07H
NUM : ADD REG , 30H
ENDM [1] 

宏彙編程序清除宏定義的為指令(PURGE)

宏指令名可以和源程序中的其他變量名、標號、指令助記符、偽操作名相同,此時宏指令的優先級別最高,使其他同名的指令或偽操作無效。為了使這些指令或偽指令恢復功能,服從機器指令的定義,宏彙編程序提供了偽操作PURGE,用來在適當的時候取消宏定義。
PURGE偽指令的一般格式是:
PURGE 宏定義名[,...]
方括號表示PURGE可以取消多個宏定義,宏名之間用逗號隔開。如宏定義:
SUB MACRO VARX,VARY,RESULT
...
ENDM
宏調用:SUB X,Y,Z
PURGE SUB
“PURGE SUB”語句後的SUB恢復減法功能。
參考資料
  • 1.    楊立.微機原理及應用:中國鐵道出版社,2009
  • 2.    (美)歐文 著,温玉傑 等譯.Intel 彙編語言程序設計(第五版):電子工業出版社,2007