版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
依第『章富」匯編技術(shù)
第3章布被匯編技木
8.1宏匯編
8.2重復(fù)匯編和條件匯編
8.3匯編語言與高級語言的混合編程
8.1宏匯編w
8.1.1宏指令的定義、調(diào)用和展開
1.宏定義偽指令
宏的概念與過程很相似,也是用一個宏名字來代替源程序中
經(jīng)常需要用到的一個程序模塊(代碼段),宏定義語句格式與過程
定義語句格式也相似。
格式:
宏名MACRO[形式參數(shù)表]
;;宏體
ENDM;宏定義結(jié)束
功能:定義一個宏。
依第』章卷級匯編技術(shù)圖£
說明:
①宏名必須是惟一的,它代表著所定義的宏體的內(nèi)容,在
其后面的源程序中,可通過該名字來調(diào)用宏。
②形式參數(shù)表是用逗號(或空格,或制表符)分隔的一個或
多個形式參數(shù)。它是可選項。選用了形式參數(shù)時,所定義的宏
稱為帶參數(shù)的宏。當(dāng)調(diào)用宏時,需用對應(yīng)的實際參數(shù)去取代,
以實現(xiàn)向宏中傳遞信息。
③宏體可以是匯編語言所允許的任意指令和偽指令語句序
列,它決定了宏的功能。在宏體中還可以定義或調(diào)用另一個宏,
這就是宏嵌套。
④宏一經(jīng)定義,就像為指令系統(tǒng)增加了新的指令一樣,在
程序中就可像指令一樣通過宏名對它進(jìn)行任意次的調(diào)用,故又稱
為宏指令或宏調(diào)用。要注意的是,宏定義必須放在第一條調(diào)用它
的指令之前,一般都將它放在程序的開頭。
2.宏的調(diào)用與展開
(1)在匯編語言源程序中,為了使在源程序中不重復(fù)書寫需
要多次使用的程序段,可以用一條宏指令來代替,由匯編程序
在匯編時產(chǎn)生所需要的代碼。
例如,為了實現(xiàn)ASCII碼與BCD碼之間的相互轉(zhuǎn)換,往往需
要把AL中的內(nèi)容左移4位或右移4位,可以用80x86的指令來實現(xiàn)。
若要左移4位,可用:
MOVCL,4
SALAL,CL
若要多次使用,就可以用一條宏指令來代替,宏定義是:
SHIFTMACRO
MOVCL,4
SALAL,CL
ENDM
這樣,以后凡要使AL中的內(nèi)容左移4位,就可以用這條宏
指令SHIFT來代替。
―二FF-
宏定義中,SHTFT是宏指令名,MACRO是宏定義的定義
符,ENDM是宏定義的結(jié)束符,這兩者必須成對出現(xiàn)。
宏匯編一般由可執(zhí)行的指令語句和管理語句(即由偽指令構(gòu)
成的語句)所構(gòu)成。經(jīng)宏定義后,就可以引用宏指令,這稱作宏
調(diào)用。宏匯編程序遇到這樣的調(diào)用時,就用對應(yīng)的宏體來代替
這條宏指令,以產(chǎn)生目的代碼,這稱作宏展開。
(2)宏定義不但能使源程序的書寫簡潔,而且由于宏指令具
有接收參量的能力,所以功能就更靈活。
例如,上述的宏指令只能使AL中的內(nèi)容左移4位。若每次使
用時,要移位的次數(shù)不同,或要使不同的寄存器移位,就不方便
了。但是,若在宏定義中引入?yún)⒘?,就可以滿足上述要求。
例8?1定義滿足不同移位次數(shù)要求的宏。
SHIFTMACROX
MOVCL,X
SALCL,CL
ENDM
其中,X是一個形式參量(此處用來代表移位次數(shù))。在調(diào)用時可
把實際要求的移位次數(shù)作為實在參量代入。如
SHIFT4
就可以用實在參量4代替在宏定義體中出現(xiàn)的形式參量X,從而
實現(xiàn)左移4位的功能。
依第『章富」匯編技術(shù)
又如:
SHIFT6
就可以左移6次。這樣,就可以由調(diào)用時的實在參數(shù)來規(guī)定任意
的移位次數(shù)。
-Jc
£人第8章富像匯編技術(shù)血
例8-2定義滿足使用不同寄存器實現(xiàn)移位要求的宏,可
入一個形式參量Y。
SHIFTMACROX,Y
MOVCL,X
SALY,CL
ENDM
用形式參量Y來代替需要移位的寄存器。只要在調(diào)用時,把要移
位的寄存器作為實在參量代入,就可以對任一個寄存器實現(xiàn)指
定的左移次數(shù)。
SHIFT4,AL
SHIFT4,BX
£三第9章富像匯編技術(shù)
在匯編這些宏指令時,分別產(chǎn)生以下指令語句,宏匯編
序在每一條由宏展開產(chǎn)生的指令前冠以加號“+”:
+MOVCL,4
+SALAL,CL
+MOVCL,4
+SALBX,CL
+MOVCL,6
+SALDLCL
第一條宏指令使AL左移4位;第二條宏指令使16位寄存器
BX左移4位;第三條宏指令使DI左移6位。
Ml
(3)形式參量不僅可以出現(xiàn)在操作數(shù)部分,也可以出現(xiàn)在操
作碼部分。
例8-3用宏指令定義操作碼。
SHIFTMACROX,Y,Z
MOVCL,X
S&ZY,CL
ENDM
其中第三個形式參量Z代替操作碼中的一部分。若在宏定義
體中的形式參量沒有適當(dāng)?shù)姆指舴?,則不被看作為形式參量,
調(diào)用時也不被實在參量所代替。
例如,上例中的操作碼部分S&Z中,若Z與S之間沒有分隔,
則此處的Z就不被看作形式參量。要定義它為形式參量,必須在
其前面加上符號所以S&Z中Z就被看作是形式參量。若有以
下調(diào)用:
SHIFT4,AL,AL
SHIFT6,BX,AR
SHIFT8,SLHR
在匯編這些宏指令時,分別產(chǎn)生以下指令語句。
+MOVCL,4
+SALAL,CL
+MOVCL,6
+SARBX,CL
+MOVCL,8
+SHRSLCL
這里的SHIFT宏指令可以對任一個寄存器進(jìn)行任意的移位
操作(算術(shù)左移、算術(shù)右移、邏輯右移、可移任意指定的位數(shù))。
?一一“一JUh一
依第『章富」匯編技術(shù)
8.1.2宏操作符
主要的宏操作偽指令有:
1)MACRO
格式:
宏指令名MACRO〈形式參量表>
;宏體
ENDM
心孚章富像匯編技術(shù)衣£
宏指令名是-個宏定義調(diào)用的依據(jù),也是不同宏定義方
分的標(biāo)志,是必須要有的。對于宏指令名的規(guī)定與對標(biāo)識符的規(guī)
定是一致的。宏定義中的形式參量表是任選的,可以沒有形式參
量,也可以有若干形式參量。若有一個以上的形式參量時,它們
之間必須用逗號分隔。對形式參量的規(guī)定與對標(biāo)識符的規(guī)定是一
致的。形式參量的個數(shù)沒有限制,只要一行限制在152個字符以
內(nèi)就行。在調(diào)用時的實在參量多于1個時,也要用逗號分隔,它
們與形式參量在順序上相對應(yīng)。但I(xiàn)BM宏匯編并不要求它們在數(shù)
量上必須一致。若調(diào)用時的實在參量多于形式參量,則多余的部
分被忽略;若實在參量少于形式參量,則多余的形式參量變?yōu)?/p>
2)PURGE
一個宏指令名,可以用偽指令PURGE來取消,然后就可以重新定義
格式:
PURGE宏指令名
功能:取消多個宏定義。
金晨第『章存秋匯編於術(shù)瓶
3)REPT
格式:
REPT〈表達(dá)式〉
;指令體
ENDM
功能:重復(fù)執(zhí)行在它的指令體部分所包含的語句。重復(fù)執(zhí)
行的次數(shù),由表達(dá)式的值所決定。
依第『章富」匯編技術(shù)
例8.4
X=0
REPT10
X=X+1
DBX
ENDM
實現(xiàn)的功能是把1到10分配給10個連續(xù)的內(nèi)存單元。
.;..i^ggsfef
-Jc
4)IRP
格式:
IRP形式參量,〈參數(shù)表〉
■:;指令體
ENDM
功能:重復(fù)執(zhí)行指令體部分所包含的語句,重復(fù)的次數(shù)由
參數(shù)表中的參數(shù)的個數(shù)決定(參數(shù)表中的參數(shù)必須用兩個尖括號
括起來,參數(shù)間用逗號分隔),且每重復(fù)一次,依次用參數(shù)表中
的參數(shù)來代替形式參量。
例8£
IRPX,<1,2,3,4,5,6,7,8,9,10>
DBX
ENDM
因為參數(shù)表中的參數(shù)個數(shù)為10,故指令體部分重復(fù)執(zhí)行10
次。例8-4中的指令體部分只有一條偽指令DBX,其中X為形式
參量。在第一次執(zhí)行時用參數(shù)表中的第一個參數(shù)1代替形式參量,
就為DB1;第二次執(zhí)行時,用參數(shù)表中的第二個參數(shù)2代替形式
參量,就為DB2;……所以例8-4也是把1到10分配給10個連續(xù)
的內(nèi)存單元。
5)IRPC
格式:
IRPC形式參量,字符串(或〈字符串〉)
:;指令體
ENDM
功能:重復(fù)執(zhí)行指令體部分所包含的語句。重復(fù)執(zhí)行的次
數(shù),取決于字符串中的字符個數(shù),每次重復(fù)時,依次用字符串
的字符代替形式參量。
IRPC偽指令與IRP偽指令很類似,只是用字符串(此字符串
可以包括在兩個三角括號中,也可以不包括)代替了IRP指令中的
參數(shù)表。
例8-6
IRPCX,<ABCDEF>
DBX
ENDM
實現(xiàn)的功能是:把字符A到F分配給內(nèi)存中的6個連續(xù)單元。
以上MACRO、REPT、IRP和IRPC4個宏定義的偽指令都
必須以偽指令ENDM作為它的結(jié)束符。
有兩點需要特別指出:
①宏定義也可以像程序設(shè)計語言中的標(biāo)準(zhǔn)函數(shù)一樣,構(gòu)成
一個標(biāo)準(zhǔn)函數(shù)庫,供其他源程序使用。以文件的形式組織若干個
宏定義即形成宏程序庫。程序設(shè)計中使用了宏程序庫中的宏定義
時,在源程序中應(yīng)使用INCLUDE偽指令。宏匯編程序在匯編源
程序時,當(dāng)遇到該偽指令,就把INCLUDE偽指令所包含的宏程
序庫中的文件掃描一遍,如同在程序中使用自己定義的宏一樣,
在后面的程序中就可以對宏庫中的宏定義直接進(jìn)行宏調(diào)用了。
②與子程序一樣,宏定義也可以嵌套。宏定義的嵌套有兩
種方式:宏定義嵌套和宏定義內(nèi)嵌套宏調(diào)用。在一個宏定義中
包含了另一個宏定義,則稱為宏定義嵌套;在一個宏定義的宏
體內(nèi)有宏調(diào)用,則稱為宏定義內(nèi)嵌套宏調(diào)用。在宏定義內(nèi)嵌套
宏調(diào)用中,被調(diào)用的宏指令必須是已定義的。宏定義嵌套常用
于產(chǎn)生一些新的宏定義,而宏定義內(nèi)嵌套宏調(diào)用則可以使宏定
義簡化,功能單一,便于通過組合的方法實現(xiàn)一個功能較為復(fù)
雜的宏定義。
8.1.3LOCAL偽指令
如果宏定義中含有變量名或標(biāo)號,且在同一源程序中又多
次被宏調(diào)用,那么宏匯編程序在宏展開時,產(chǎn)生多個相同的變
量名或標(biāo)號,這就不能滿足變量名和標(biāo)號在同一程序中必須惟
一的要求,從而產(chǎn)生匯編出錯,即產(chǎn)生uERRORA2005:
SYMBOLISMULTIDEFINED”的錯誤。為達(dá)到在宏定義中使用
變量名和標(biāo)號,又能避免這個錯誤的目的,可在宏定義中使用
局部符號偽指令LOCAL對變量名或標(biāo)號進(jìn)行說明。
c第『章富」匯編技術(shù)
格式:
LOCAL〈符號表〉
功能:對在符號表中的每個符號,在匯編時每擴展一次便
建立一個“??xxxx”惟一的符號,保證匯編時生成名字的惟一
性。
說明:
(1)符號表是在宏定義中定義的變量名和標(biāo)號,多個符號之
間用逗號分隔。
(2)LOCAL偽指令指定的變量名和標(biāo)號自動生成格式為
8.1.4宏和過程的比較
宏和過程都可用來簡化源程序,并可使程序多次對它們進(jìn)行
調(diào)用,從而使程序結(jié)構(gòu)簡潔清晰,符合結(jié)構(gòu)化程序設(shè)計風(fēng)格。
因此,對于那些需重復(fù)使用的程序模塊,既可用過程也可用宏
來實現(xiàn)。
宏和過程的主要區(qū)別在于:
(1)宏操作可以直接傳遞和接收參數(shù),它不需通過棧等其他
媒介來進(jìn)行,因此編程比較容易。而過程不能直接帶有參數(shù),
當(dāng)過程之間需要傳遞參數(shù)時,必須通過棧、寄存器或存儲器來
進(jìn)行,所以相對于宏而言,它的編程要復(fù)雜一些。
(2)宏調(diào)用只能簡化源程序的書寫,縮短源程序長度,它并
沒有縮短目標(biāo)代碼的長度,匯編程序處理宏指令時,是把宏體
插入到宏調(diào)用處,所以目標(biāo)程序占用內(nèi)存空間并不因宏操作而
減少。而過程(子程序)調(diào)用卻能縮短目標(biāo)程序的長度,因為過程
在源程序的目標(biāo)代碼中只有一段,無論主程序調(diào)用多少次,除
了增加CALL和RET指令的代碼外,并不增加子程序段代碼。
(3)引入宏操作并不會在執(zhí)行目標(biāo)代碼時增加額外的時間開
銷。相反,過程調(diào)用由于需要保護(hù)和恢復(fù)現(xiàn)場及斷點,因而有
額外的時間開銷,會延長目標(biāo)程序的執(zhí)行時間。
若在一個源程序中多次調(diào)用一段程序,則可用子程序,也
可以用宏指令來簡化源程序。用子程序的方法,匯編后產(chǎn)生的
目標(biāo)代碼少,即目標(biāo)程序占用的內(nèi)存空間少,節(jié)約內(nèi)存空間。
但是,子程序在執(zhí)行時,每調(diào)用一次都要先保護(hù)斷點,通常在
程序中還要保護(hù)現(xiàn)場。同樣,在返回時,先要恢復(fù)現(xiàn)場,然后
恢復(fù)斷點(返回)。這些操作都額外增加了時間,因而執(zhí)行時間
長,速度慢。而宏指令恰好相反,它的目標(biāo)程序長,占用的內(nèi)
存單元多,但在執(zhí)行時不需要保護(hù)斷點、現(xiàn)場以及恢復(fù)、返回
等這些額外操作,因而執(zhí)行時間短,速度快。
c第『章富」匯編技術(shù)衣£■
晶
所以,當(dāng)要代替的程序段較短,速度是主要矛盾時,通常
用宏指令。而當(dāng)要代替的程序段較長,額外操作所附加的時間
不明顯,節(jié)省存儲空間是主要矛盾時,通常用子程序。宏指令
是機器的指令系統(tǒng)中沒有的,但又可以作為一條指令使用。所
以,從形式上看,宏指令擴充了機器的指令系統(tǒng)。
8.2重復(fù)匯編和條件匯編
8.2.1重復(fù)匯編
在匯編程序設(shè)計中,經(jīng)常要連續(xù)地重復(fù)相同的或幾乎完全
相同的代碼序列,這時可以使用重復(fù)偽指令。
1.重復(fù)偽指令
宏匯編語言提供的重復(fù)偽指令包括REPT、IRP、IRPC,其
格式、功能及使用說明在8.1.2節(jié)中已講述,這里不再贅述。
2.重復(fù)偽指令應(yīng)用舉例
例8?7使用不同重復(fù)偽指令定義10個數(shù)據(jù),使其內(nèi)容分別
為0,1,…,9o
第一種方法,使用REPT偽指令:
COUNT=0
REPT10
DBCOUNT
COUNT=COUNT+1
ENDM
第二種方法,使用IRP偽指令:
IRPX,<0,1,2,3,4,5,6,7,8,9>
DBX
ENDM
第三種方法,使用IRPC偽指令:
IRPCX0123456789
DBX
ENDM
依第『章富」匯編技術(shù)
以上三種方法具有同樣的功能,匯編后產(chǎn)生的代碼如下
+DB0
+DB1
+DB2
+DB3
+DB4
+DB5
+DB6
+DB7
+DB8
+DB-9
-Jx
依第『章富」匯編技術(shù)
例8-8下面兩條重復(fù)偽指令具有相同的功能。
(1)IRP指令:
IRPREG,<AX,BX,CX,DX>
POPREG
ENDM
-Jx
依第『章富」匯編技術(shù)
(2)IRPC指令:
IRPCRABCD
POPR&X
ENDM
匯編后它們產(chǎn)生的代碼如下:
+POPAX
+POPBX
+POPCX
+POPDX
-Jc
8.2.2條件匯編
條件匯編偽指令可使匯編程序根據(jù)某種條件對某部分源程
序有選擇地進(jìn)行匯編,在形式上和高級語言中的條件語句類似,
但實質(zhì)不同。條件匯編語句是一種說明性語句,其功能由匯編
系統(tǒng)實現(xiàn);而一般高級語言的條件語句是執(zhí)行性語句,其功能
由目標(biāo)程序?qū)崿F(xiàn)。
條件匯編語句通常在宏定義中使用,使得宏定義的適用范
圍更廣。一般情況下,使用條件匯編語句可使一個源文件產(chǎn)生
幾個不同的源程序,它們可有不同的功能。
依第『章富」匯編技術(shù)
格式:IF條件
語句序列1
[ELSE
語句序列2]
ENDIF
功能:當(dāng)條件為真(滿足)時執(zhí)行匯編語句序列1,否則執(zhí)行
匯編語句序列2。
-Jx
說明:“條件”為IF偽指令說明符的一部分,ELSE偽指令
及其后面的語句序列2是可選擇部分,表示條件為假(不滿足)時
的情況。如果屬于非完全分支的判斷,就不用這部分。整個條
件匯編最后必須用ENDIF偽指令來結(jié)束。語句序列1和語句序列
2中的語句是任意的,也可為條件匯編語句。
以下5組條件匯編開始語句均可選用ELSE語句,以便匯編條
件為假時執(zhí)行語句序列2,但一個IF語句只能有一個ELSE與之對
應(yīng)。
1)是0否條件語句
語句有:IF和IFE。
①IF語句。
格式:IF表達(dá)式
功能:表達(dá)式值非0,則條件為真,執(zhí)行匯編語句序列1。
②IFE語句。
格式:IFE表達(dá)式
功能:表達(dá)式值為0,則條件為真,執(zhí)行匯編語句序列1。
依第『章富」匯編技術(shù)
2)掃描1否條件語句
語句有:IF1和IF2。
①IF1語句。
格式:IF1
功能:匯編處于第一次掃描時條件為真。
②IF2語句。
格式:IF2
功能:匯編處于第二次掃描時條件為真。
.;..i^ggsfef
-Jc
3)符號有定義否條件語句
語句有:IFDEF和IFNDEF。
①IFDEF語句。
格式:IFDEF符號
功能:符號已被定義或已由EXTRN偽指令說明,則條件為真。
②IFNDEF語句。
格式:IFNDEF符號
功能:符號未被定義或未由EXTRN偽指令說明,則條件為真。
4)空否條件語句
語句有:IFB和IFNB。
①IFB語句。
格式:IFBv參數(shù)〉
功能:參數(shù)為空格,則條件為真。尖括號不能省略。
②IFNB語句
格式:IFNBv參數(shù)〉
功能:參數(shù)不為空格,則條件為真。尖括號不能省略。
5)字符串比較條件語句
語句有:IFIDN和IFDEF。
①IFIDN語句。
格式:IFIDNv字符串1>,v字符串2>
功能:字符串1與字符串2相同,則條件為真。
②IFDIF語句
格式:IFDIFv字符串1>,〈字符串2>
功能:字符串1與字符串2不相同,則條件為真。
說明:這兩條語句只能在宏定義中使用,檢查傳送給兩個
參數(shù)的實參是否相同。
例8-9將輸入及輸出字符的DOS功能調(diào)用放在一個宏定義
中,通過判斷參數(shù)為0還是非0值來選擇是執(zhí)行匯編輸入還是輸
出的DOS功能。
所編制的程序描述如下,其中含有條件匯編的語句。
INOUTMACROX
IFX
MOVAH,2
INT21H;輸出DL中的字符
ELSE
MOVAH,1
INT21H;輸入一個字符到AL
ENDIF
ENDM
注:二
當(dāng)宏調(diào)用為INOUTO時,表明傳遞給參數(shù)X的值為0,此時IFX
的條件為假,因此匯編程序只匯編ELSE與ENDIF之間的語句,
這樣,對該宏調(diào)用來說,實際上是執(zhí)行下面的兩條指令:
MOVAH,1
INT21H
而當(dāng)宏調(diào)用為INOUT1時,實際上是執(zhí)行這樣兩條指令:
MOVAH,2
INT21H
8.3匯編語言與高級語言的混合編程
8.3.1調(diào)用協(xié)議
匯編程序和匯編語言常常以在線匯編語言代碼的形式,通過
過程同高級語言,如C/C++、BACIC、PASCAL及FORTRAN一
起使用。需要指出的是,這里盡管講的是使用Microsoft匯編語言
過程,但只要提供兼容的調(diào)用協(xié)議,大多數(shù)其他語言也能夠使用。
在與高級語言接口時,匯編程序使用兩種調(diào)用協(xié)議:一是用
于C/C++語言的C語言調(diào)用協(xié)議,二是用于BASIC、PASCAL和
FORTRAN語言的PASCAL語言調(diào)用協(xié)議。調(diào)用協(xié)議語言在
MODEL語句中或與PROC語句相聯(lián)系的OPTION指示符中指定。
除用這以外還可以用矣全以短歲旨定O
I.c語言調(diào)用協(xié)議
C語言調(diào)用協(xié)議從右到左壓入?yún)?shù),像它們在參數(shù)表里放的
那樣,帶著放在棧上的參數(shù)從匯編語言過程返回,返回結(jié)果或
者放在AX中或者放在DX:AX中。在BP、DI、SLDS、SS和
方向標(biāo)志位被改動之前應(yīng)使用匯編語言過程保存起來。這些寄
存器是高級語言能用到的。圖8-1給出了C語言調(diào)用協(xié)議下近調(diào)
用和遠(yuǎn)調(diào)用的棧。
(SP)
(SP)
圖8-1使用C語言調(diào)用協(xié)議時的棧內(nèi)容
(a)近程調(diào)用;(b)遠(yuǎn)程調(diào)用
對棧內(nèi)參數(shù)的訪問由C語言調(diào)用協(xié)議提供,如例8-10所示。
帶*號的語句是匯編程序加上的,以保持與C語言調(diào)用協(xié)議的一
致。注意搞清楚BP的內(nèi)容如何被壓入棧中,以及BP是如何被
裝入SP值以訪問由C語言程序放在棧中的參數(shù)這兩個問題。
C第『章富」匯編技術(shù)
例8-10
.LISTALL
.MODELSMALL,C
SSSPROTOC,A:SWORD,A:SWORD
.CODE
SSSPROCC,A:SWORD,B:SWORD
PUSHBP;保存BP
MOVBP,SP;棧地址存入BP
MOVAX,A;使用參數(shù)A
ADDAX,B;使用參數(shù)B
POPBP;恢復(fù)BP
RET00000H
SSSENDP
■■?----??
一Y帶7?提
根據(jù)C語言調(diào)用協(xié)議編寫的匯編語言過程通過指令I(lǐng)NVOKE
而被調(diào)用。INVOKE用來替代標(biāo)準(zhǔn)的CALL指令。INVOKE遵循
C語言調(diào)用協(xié)議,允許匯編語言程序訪問C語言程序和函數(shù)。
INVOKE指令被用來訪問例8-10中的過程,例如,INVOKESSS,
20,30實現(xiàn)把30加上20后,結(jié)果放入AX中并返回。INVOKE與
CALL的不同之處,按照調(diào)用協(xié)議的要求,INVOKE指令必須將
參數(shù)從棧中全部移出。INVOKE指令的語法要求過程名后必須跟
著全部的參數(shù),參數(shù)間用逗號隔開。
2.INVOKE指令的使用
用PUSH把參數(shù)壓入堆棧,如果不小心把參數(shù)個數(shù)搞錯了,
就會使堆棧不平衡,從而使程序從堆棧中取出錯誤的返回地址,
引起不可預(yù)料的后果。所以有必要用一條語句來完成自動檢驗
的任務(wù)。INVOKE語句是能自動將所有的參數(shù)壓入棧中,并檢測
參數(shù)個數(shù)、類型是否正確,使用CALL來調(diào)用的一個宏指令。
INVOKE在匯編程序中調(diào)用子程序時,其參數(shù)的傳遞是通過
堆棧來進(jìn)行的。例如,MessageBox。函數(shù)在USER32.INC文件中
是這樣聲明的:
MESSAGEBOX(HWNDHWND,LPCTSTRLPTEXT,
LPCTSTRLPCAPTION,UINTUTYPE),
在匯編程序中可這樣調(diào)用它:
PUSHUTYPE
PUSHLPCAPTION
PUSHLPTEXT
PUSHHWND
CALLMessageBox
PUSH為匯編語言中的進(jìn)棧指令。上面語句的原理是先將函
數(shù)所需要的參數(shù),壓入到堆棧中去,然后再用CALL指令來調(diào)用
該函數(shù)。
需要注意的是,在上述的參數(shù)進(jìn)棧過程中,是從左到右依
次壓入的,即最右面的參數(shù)是最后一個進(jìn)堆棧,采用的是
PASCAL規(guī)則。引入INVOKE語句后,就可自動的將所調(diào)用子程
序中的參數(shù)壓入堆棧中,而無須編程者用手工壓入。所以上面
的代碼就可以變?yōu)?/p>
INVOKEMessageBox,NULL,addrszText,addrszCaption,
MBOKo
addr是用來把變量參數(shù)的地址傳遞給被調(diào)用的函數(shù)(注意,是所
指變量在內(nèi)存中的地址,而不是變量中的值),它只能在
INVOKE語句中使用。
3.PASCAL語言調(diào)用協(xié)議
PASCAL語言調(diào)用協(xié)議用于BASIC、PASCAL和FORTRAN
語言,在WINDOWS中,它也被用于訪問WINDOWS庫文件
(WINH.LIB)中的函數(shù)。PASCAL語言調(diào)用協(xié)議與C語言調(diào)用協(xié)議
的差異在于:參數(shù)是自左至右壓入棧中。如果用在匯編語言過程
中時,PASCAL語言調(diào)用協(xié)議也需要保存寄存器SI、DLDS和SS
的內(nèi)容。方向標(biāo)志位在登錄時要被清零,并以清除狀態(tài)被返回。
和在C語言調(diào)用協(xié)議中一樣,INVOKE語句也用于由匯編語言進(jìn)
出高級語言過程。
這一點在匯編語言同WINDOWS一起使用時格外重要,以
INVOKEMessageBeep,-1為例,如果WINH.LIB庫文件已被程
序裝載,則該指令使揚聲器發(fā)出“嘀”的一聲。其他參數(shù)也可
與MessageBeep一起使用,從而由WINDOWS發(fā)出各種失敗提示
音。在C語言程序中,通過在C語言程序的開頭使用指令
#INCLUDE<WINDOWS.H>,就可以訪問WINDOWS應(yīng)用程序
接口(API)。
―二FF-
依第『章富」匯編技術(shù)
存儲器
參數(shù)1
參數(shù)2
CS(返回地址)
IP(返回地址)
BP(BP)
圖8-2使用PASCAL語言調(diào)用協(xié)議時棧內(nèi)容
-Jx
圖8-2給出了從PASCAL中調(diào)用函數(shù)時的棧,注意:所有這
些語言調(diào)用的函數(shù)都被認(rèn)為是遠(yuǎn)程調(diào)用,BP給出了存儲參數(shù)的
棧的地址。最右邊的參數(shù)的地址為BP+6,這一點與C語言調(diào)用
協(xié)議正好相反。同C語言調(diào)用協(xié)議一樣,隱蔽的指令將BP壓入
棧,并將SP寫入BP。
第7章富您匯編技術(shù)布更
4.數(shù)據(jù)類型
表8?1各種數(shù)據(jù)類型的比較
MASM數(shù)據(jù)類型C語言數(shù)據(jù)類型PASCAL數(shù)據(jù)類型
BYTEunsignedchar—
SBYTEchar—
WORDunsignedshortSTRING*1
SWORDshortintINTEGER
DWORDunsignedlong—
SDWORDlongLONG(&)
REAL4floatSINGLE(!)
REAL8doubleDOUBLE(#)
REAL10longdouble
8.3.2與C語言的接口
例8-H本例給出了一個被C語言程序調(diào)用的過程,該過程
使用MODEL語句指示內(nèi)存模型(本例為小模型)和相應(yīng)的調(diào)用協(xié)
議語言(C語言)。PROTO語句把本過程作為外部函數(shù)聲明,并指
定了全部與本過程相關(guān)的參數(shù)的大小和名稱。本過程被作為一
個近程調(diào)用
.MODELSMALL,C
XIPROTOC,1:SWORD,F:SWORD
.CODE
C第『章富」匯編技術(shù)
XIPROCC,1:SWORD,LSWORD
FILDPI;取出
FADDST,ST(0);計算2Xpi
MOVAX,1;取1
MOVTEMP,AX
FILDTEMP;取1
FMUL;計算2XpiXl
MOVAX,F;取F
MOVTEMP,AX
FILDTEMP;取F
FMUL計算2XpiXlXf
FISTPTEMP保存結(jié)黑
依第『章富」匯編技術(shù)
MOVAX,TEMP;取結(jié)果用以返回C
RET
XIENDP
TEMPDW?;暫存區(qū)
END
-Jx
本過程使用數(shù)值協(xié)處理器計算電抗值,使用公式Xl=2兀1F。
其中,參數(shù)F和1從C語言程序中傳送到匯編語言過程中,返回值
(XI)作為一個字長的整型變量由AX傳回C語言程序。通過BP+4
和BP+6給出的地址,可以從棧中取出1和F的數(shù)據(jù)。本例中的
MOVAX,1指令,若轉(zhuǎn)換為代碼應(yīng)為MOVAX,[BP+4],通過
該指令可從棧中取出1值。
例8-12本例給出了主模塊的C語言調(diào)用順序,該程序喉力
打印出電感系數(shù)為4H,頻率為1000Hz的電抗值。注意:本程序
中的計算結(jié)果被變換為整型。
#include<stdio.h>
externintxl(int1,intf);
voidmainQ
printf(nTheinductivereactanceof4Hat1000Hzis%d\n”,
xl(4,1000));
8.3.3與PASCAL語言的接口
1.有關(guān)的PASCAL語句和調(diào)用約定
PASCAL語言沒有提供CALL調(diào)用語句。PASCAL主程序?qū)?/p>
匯編語言子程序的調(diào)用是通過外部過程和外部函數(shù)調(diào)用的形式
來實現(xiàn)的。為了保證調(diào)用的正確實施,PASCAL主程序和被調(diào)
用的匯編語言子程序都要遵從一定的調(diào)用約定。PASCAL語言
中的過程和函數(shù)有所不同。
1)過程方式
在PASCAL程序中,對要調(diào)用的匯編語言過程必須預(yù)先采用
PROCEDURE說明語句加以定義說明。PROCEDURE語句的格式
為:
PROCEDURE過程名(參數(shù)表):過程屬性;
這樣,PROCEDURE語句將向PASCAL編譯程序提供如下信息:
(1)被調(diào)用的過程名;
(2)此過程是內(nèi)部過程還是外部過程;
(3)過程的參數(shù)名和類型;
(4)是“數(shù)值參數(shù)”還是“引用參數(shù)”。
由于匯編語言子程序是單獨編寫和匯編的,它相對PASE
主程序而言總是外部的。所以,其“過程屬性”為EXTERN。
并且,過程名必須在匯編語言程序中用PUBLIC偽指令加以說明。
第(3)項的過程參數(shù)名和類型是符合PASCAL要求的變量標(biāo)識符
和數(shù)據(jù)類型。在進(jìn)行PASCAL過程調(diào)用時,過程參數(shù)也是通過棧
來進(jìn)行傳遞的。第(4)項的“數(shù)值參數(shù)”和“引用參數(shù)”涉及到
是傳遞參數(shù)變量值,還是傳遞參數(shù)變量地址的問題。當(dāng)一個變
量是數(shù)值參數(shù)時,主程序把此變量的值入棧,即傳遞給被調(diào)用
過程;否則,主程序把此變量的地址入棧。作為引用參數(shù)的變
量,在PROCEDURE語句中須用VAR或VARS來加以說明。兩者
的區(qū)別在于:對由VAR說明的參數(shù),主程序須將其變量地址的
偏移量入棧;而對由VARS說明的參數(shù),除變量地址的偏移量外,
主程序還要將此變量地址的段地址入棧。語句:
PROCEDUREADDP(A,B:INTEGER;VARC:INTEGER):EXTERN;
定義了一個有3個參數(shù)的外部過程ADDP。其中,變量A和B是整
型數(shù)值參數(shù),而變量C是整型引用參數(shù);一旦匯編語言過程在
PASCAL主程序中經(jīng)由PROCEDURE語句定義說明后,PASCAL
主程序就可以采用相應(yīng)的過程調(diào)用語句來調(diào)用此匯編語言過程了,
過程調(diào)用語句的格式為
過程名(參數(shù)表)
對上面的ADDP過程,其相應(yīng)的過程調(diào)用語句為
ADDP(A,B,C)
其中,A,B,C是PASCAL主程序中的整型變量。
在被調(diào)用的匯編語言子程序中,PASCAL對過程的要求基;
(1)由于寄存器SP不能用于一般的尋址方式,通常用BP來存
取傳遞的調(diào)用參數(shù)。所以,在過程程序開始時要先把BP的原有
內(nèi)容入棧保存,并在返回PASCAL主程序之前恢復(fù)內(nèi)容。另外,
若要在子程序中改變DS和SS等寄存器的內(nèi)容,也須加以保存和
恢復(fù)。
(2)由于是外部過程,在返回PASCAL主程序時應(yīng)采用長返
回指令,即進(jìn)行段間返回。
(3)在返回時,應(yīng)取消棧參數(shù),即主程序傳遞給此過程的所
有調(diào)用參數(shù)。
依第『章富」匯編技術(shù)
下面是用匯編語言編寫的ADDP過程程序,在程序中,
PUBLIC指令將過程名ADDP存放。
CODESEGMENT
ASSUMECS:CODE
ADDPPROCFAR
PUBLICADDP
PUSHBP
MOVBP,SP
PUSHAX
《泉第『章富像匯編技術(shù)
PUSHBX
MOVAX,[BP+10]
ADDAX,[BP+8]
MOVBX[BP+6]
MOV[BX],AX
POPBX
POPAX
POPBP
RET6
ADDPENDP
過程的FAR屬性使得后面的RET指令成為長返回指令。RET
指令中的整數(shù)用于消去棧參數(shù),它在返回后將自動加入到SP寄
存器中。程序的“RET6”指令執(zhí)行前后棧內(nèi)容的變化如圖8-3所
Zj\O
當(dāng)ADDP過程的C變量為VARS引用參數(shù)時,相應(yīng)的匯編語
言程序有所不同。由于C的段地址,A和B的地址由[BP+10]和
[BP+8]變?yōu)椋跙P+12]和[BP+10]。同時,“RET6”變?yōu)椤癛ET8”。
除此之外,由于C變量不是當(dāng)前DS寄存器所指數(shù)據(jù)段中的變量,
對它的存取方式也與前不同,如圖8-4所示。
依第『章富」匯編技術(shù)
.
r
YVVVYfQD\______—
—A的內(nèi)容—八八人入入(>JL)xxxxx
Y-B的內(nèi)容—
6
執(zhí)行“RET6”
-C的偏移量一_______________________>
I
-返回段地址CS-
(SP)-?—返1可偏移量IP—
圖8-3棧變化
-Jxr^S
依第『章富」匯編技術(shù)
圖8-4C變量為VARS引用參數(shù)時的堆棧結(jié)構(gòu)
C第『章富」匯編技術(shù)
CODESEGMENT
ASSUMECS:CODE
ADDPPROCFAR
PUBLICADDP
PUSHBP
MOVBP,SP
PUSHAX
PUSHBX
PUSHES
MOVAX,[BP+12]
《泉第『章富像匯編技術(shù)
ADDAX,[BP+10]
LESBX,[BP+6]
MOVES:[BX],AX
POPES
POPBX
POPAX
POPBP
RET8
ADDPENDP
CODEENDS
2)函數(shù)方式
函數(shù)方式同過程方式很相似。在PASCAL程序中,對要調(diào)用
的匯編函數(shù)也必須預(yù)先加以說明。不過,此時采用的是
FUNCTION說明語句,而不是PROCEDURE說明語句。
FUNCTION語句的格式為
FUNCTION函數(shù)名(參數(shù)表):函數(shù)類型;函數(shù)屬性;
在FUNCTION語句中,除增加了一個“函數(shù)類型”外,其余同
PROCEDURE語句一樣?!昂瘮?shù)類型”符合PASCAL要求的數(shù)據(jù)
類型的語句。如:
FUNCTIONADDF(A,B:INTEGER):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:明代藩府編刻醫(yī)學(xué)方書研究
- 課題申報參考:面向新工科的本科跨學(xué)科教育組織生成樣態(tài)與耦合機制研究
- 部編版三年級下冊語文昆蟲備忘錄1教學(xué)課件
- 2025年個人與個人間土地承包權(quán)入股合同范本
- 二零二五年度工業(yè)廢品回收利用押金合同范本3篇
- 勞動薪資合同
- 二零二五年度特色民宿居間租賃管理合同3篇
- 二零二五年度汽車金融合同標(biāo)的研究3篇
- 2025年個人自建房屋安全風(fēng)險評估與整改合同3篇
- 2025年度苗圃定向育苗與綠色家居建材合同范本4篇
- 2024-2025學(xué)年北京石景山區(qū)九年級初三(上)期末語文試卷(含答案)
- 第一章 整式的乘除 單元測試(含答案) 2024-2025學(xué)年北師大版數(shù)學(xué)七年級下冊
- 春節(jié)聯(lián)歡晚會節(jié)目單課件模板
- 中國高血壓防治指南(2024年修訂版)
- 糖尿病眼病患者血糖管理
- 抖音音樂推廣代運營合同樣本
- 教育促進(jìn)會會長總結(jié)發(fā)言稿
- 北師大版(2024新版)七年級上冊數(shù)學(xué)第四章《基本平面圖形》測試卷(含答案解析)
- 心理調(diào)適教案調(diào)整心態(tài)積極應(yīng)對挑戰(zhàn)
- 噴漆外包服務(wù)合同范本
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
評論
0/150
提交評論