ibm-pc匯編語言程序設(shè)計(沈美明第二版)第五章高級匯編語言技術(shù)_第1頁
ibm-pc匯編語言程序設(shè)計(沈美明第二版)第五章高級匯編語言技術(shù)_第2頁
ibm-pc匯編語言程序設(shè)計(沈美明第二版)第五章高級匯編語言技術(shù)_第3頁
ibm-pc匯編語言程序設(shè)計(沈美明第二版)第五章高級匯編語言技術(shù)_第4頁
ibm-pc匯編語言程序設(shè)計(沈美明第二版)第五章高級匯編語言技術(shù)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、匯編語言程序設(shè)計匯編語言程序設(shè)計北京理工大學(xué)北京理工大學(xué) 電子工程系電子工程系馬永鋒馬永鋒編輯ppt第五章第五章 高級匯編語言技術(shù)高級匯編語言技術(shù)5.1 宏的定義和引用宏的定義和引用5.2 宏參數(shù)的特殊運算符宏參數(shù)的特殊運算符5.3 與宏有關(guān)的偽指令與宏有關(guān)的偽指令5.4 重復(fù)匯編偽指令重復(fù)匯編偽指令5.5 條件匯編偽指令條件匯編偽指令編輯ppt5.1 宏的定義和引用宏的定義和引用 宏宏是用來代表一個具有特定功能的程序段,它只需在源程序中定義一是用來代表一個具有特定功能的程序段,它只需在源程序中定義一次,但可在源程序中引用多次。只要在編寫程序時需要它,就可以直接次,但可在源程序中引用多次。只要

2、在編寫程序時需要它,就可以直接使用它。使用它。(1)宏的定義)宏的定義 在使用宏之前,必須先定義宏。定義宏一般格式如下:宏名宏名 MACRO 形參形參1, 形參形參2, ;宏的定義體宏的定義體 ENDM 在書寫宏定義時,必須遵照下列規(guī)定:編輯ppt宏的定義宏的定義 MACRO和ENDM是二個成對出現(xiàn)的關(guān)鍵字,分別表示宏定義的開始和結(jié)束; MACRO和ENDM之間的部分是宏的定義體,它是由指令、偽指令或引用其它宏所組成的程序片段,是宏所包含的具體內(nèi)容; “宏名”是由程序員指定的一個合法的標(biāo)識符,它代表該宏; 宏名可以與指令助憶符、偽指令名相同。在這種情況下,宏指令優(yōu)先,而同名的指令或偽指令都失效

3、; 在ENDM的前面不要再寫一次宏名,這與段或子程序定義的結(jié)束方式不同; 在宏定義的首部可列舉若干形式參數(shù)(也稱啞元),參數(shù)之間要用逗號分隔。編輯ppt宏的定義宏的定義例:定義一個把例:定義一個把16位數(shù)據(jù)寄存器壓棧的宏。位數(shù)據(jù)寄存器壓棧的宏。PUSHRMACROPUSHAXPUSHBXPUSHCXPUSHDXENDM例:定義二個字存儲變量相加的宏。例:定義二個字存儲變量相加的宏。MADDMMACRO OPRD1, OPRD2MOV AX, OPRD2ADD OPRD1, AXENDM編輯ppt(2)宏的引用)宏的引用 在源程序中,一旦定義了某宏,那么,在該程序的任何位置都可直接引用該宏,而不

4、必重復(fù)編寫相應(yīng)的程序段。引用宏的一般格式如下:宏名宏名 實參實參1, 實參實參2, 其中:實參的位置要與形參的位置要對應(yīng),但實參個數(shù)可以與形參個數(shù)不相等。當(dāng)實參的個數(shù)多于形參的個數(shù)時,多出的實參被忽略;當(dāng)實參的個數(shù)少于形參的個數(shù)時,沒有實參對應(yīng)的形參用“空”來對應(yīng)。 在宏展開時,所得到的指令必須是合法的匯編指令,否則,匯編程序?qū)o出出錯信息。編輯ppt(3)宏參數(shù)的傳遞)宏參數(shù)的傳遞 引用宏時,參數(shù)是通過引用宏時,參數(shù)是通過“實參實參”替換替換“形參形參”的方式來實現(xiàn)傳遞的。的方式來實現(xiàn)傳遞的。參數(shù)形式靈活多樣,參數(shù)可以是常數(shù)、寄存器、存儲單元和表達式,還參數(shù)形式靈活多樣,參數(shù)可以是常數(shù)、寄

5、存器、存儲單元和表達式,還可以是指令的操作碼??梢允侵噶畹牟僮鞔a。例:定義二個字存儲變量相加和相減的宏。例:定義二個字存儲變量相加和相減的宏。方法1:定義二個宏,分別實現(xiàn)存儲變量的加操作和減操作MADDM MACRO OPRD1, OPRD2MOVAX, OPRD2ADDOPRD1, AXENDMMSUBM MACRO OPRD1, OPRD2MOVAX, OPRD2SUBOPRD1, AXENDM方法2:定義一個宏,把存儲變量的“加”和“減”操作合并在一起MOPMMACRO OP, OPRD1, OPRD2MOVAX, OPRD2OPOPRD1, AXENDM其中:參數(shù)OP是一個對應(yīng)于操作碼

6、的形式參數(shù)。編輯ppt(4)宏與子程序的區(qū)別)宏與子程序的區(qū)別宏和子程序都是為了簡化源程序的編寫,提高程序的可維護性,但是它們宏和子程序都是為了簡化源程序的編寫,提高程序的可維護性,但是它們二者之間存在著以下本質(zhì)的區(qū)別:二者之間存在著以下本質(zhì)的區(qū)別:在源程序中,通過書寫宏名來引用宏,而子程序是通過CALL指令來調(diào)用;匯編程序?qū)晖ㄟ^宏擴展來加入其定義體,宏引用多少次,就相應(yīng)擴展多少次,所以,引用宏不會縮短目標(biāo)程序;而子程序代碼在目標(biāo)程序中只出現(xiàn)一次,調(diào)用子程序是執(zhí)行同一程序段,因此,目標(biāo)程序也得到相應(yīng)的簡化;宏引用時,參數(shù)是通過“實參”替換“形參”來實現(xiàn)傳遞的,參數(shù)形式靈活多樣,而子程序調(diào)用時

7、,參數(shù)是通過寄存器、堆?;蚣s定存儲單元進行傳遞的;宏引用語句擴展后,目標(biāo)程序中就不再有宏引用語句。運行時,不會有額外的時間開銷,而子程序調(diào)用指令存在于目標(biāo)程序之中,執(zhí)行調(diào)用指令需要時間??傊?,當(dāng)程序片段不長,速度是關(guān)鍵因素時,可采用宏來簡化源程序,但當(dāng)程序片總之,當(dāng)程序片段不長,速度是關(guān)鍵因素時,可采用宏來簡化源程序,但當(dāng)程序片段較長,存儲空間是關(guān)鍵因素時,可采用子程序來簡化源程序和目標(biāo)程序。段較長,存儲空間是關(guān)鍵因素時,可采用子程序來簡化源程序和目標(biāo)程序。編輯ppt5.2 宏參數(shù)的特殊運算符宏參數(shù)的特殊運算符(1)(1) 連接運算符連接運算符 &在宏定義中,如果形式參數(shù)與其它字符連接

8、在一起,或形式參數(shù)出現(xiàn)在字符串之中,那么,就必須使用連接運算符連接運算符(&)。例:定義一個轉(zhuǎn)移宏JUMP,其一個參數(shù)決定轉(zhuǎn)移類別,另一個參數(shù)指定轉(zhuǎn)移目標(biāo)。宏定義:宏定義:JUMPMACRO COND, here J&CONDhereENDM宏調(diào)用:宏調(diào)用: JUMP Z, THERE JUMP NZ HERE宏展開:宏展開: + JZ THERE + JNZ HERE編輯ppt宏參數(shù)的特殊運算符宏參數(shù)的特殊運算符(2)(2)字符串整體傳遞運算符)字符串整體傳遞運算符 字符串整體傳遞運算符是一對尖括號,用它括起來的內(nèi)容將作為一個字符串來進行形式參數(shù)的整體替換。在宏引用時,如果實

9、參內(nèi)包含逗號、空格等間隔符,則必須使用該操作符,以保證實參的完整性。如果實參是某個具有特殊含義的字符,為了使它只表示該字符本身,也需要用該運算符括起來。 假設(shè)有下面定義字符串的宏DEFMSG,DEFMSG MACRO MSG DB &MSG, 0DH, 0AH, $ ENDM 那么,使用和不使用該運算符的引用宏及其宏擴展如下所示:DEFMSG 1 DB Are you ready?, 0DH, 0AH, $ DEFMSG Are you ready?1 DB Are, 0DH, 0AH, $編輯ppt宏參數(shù)的特殊運算符宏參數(shù)的特殊運算符(3)(3)字符轉(zhuǎn)義運算符)字符轉(zhuǎn)義運算符 在引用

10、宏時,如果實參中含有特殊字符,而又要該特殊字符當(dāng)作普通字符來出來,那么,就必須在該特殊字符前加上字符轉(zhuǎn)義運算符“!”。DEFMSG 90):1DB Input one number(90):, 0DH, 0AH, $DEFMSG 90):1DB Input one number(90):, 0DH, 0AH, $ 在第一個引用宏的語句中,匯編程序會把第一個“”字符與字符“”字符前面加了字符轉(zhuǎn)義運算符“!”,所以,匯編程序會把第一個“”當(dāng)作“大于號”字符來處理,而把最后面的字符“”當(dāng)作是與前面“”相比配的結(jié)束符。編輯ppt宏參數(shù)的特殊運算符宏參數(shù)的特殊運算符(4)(4)計算表達式運算符)計算表達

11、式運算符 在引用宏時,使用計算表達式運算符“%”表示把其后面表達式的結(jié)果當(dāng)作實參進行替換,而不是該表達式的整個式子。DEFMSG %200+23-1001DB 123, 0DH, 0AH, $DEFMSG (200+23-100)1DB (200+23-100), 0DH, 0AH, $ 前者是先計算出表達式200+23-100的值,然后再把該值作為參數(shù)進行替換,而后者是把表達式(200+23-100)當(dāng)作一個字符串來進行參數(shù)替換。編輯ppt5.3 與宏有關(guān)的偽指令與宏有關(guān)的偽指令(1)(1)局部標(biāo)號偽指令)局部標(biāo)號偽指令 LOCAL 在宏定義體中,如果存在標(biāo)號,則該標(biāo)號要用偽指令LOCAL說

12、明為局部標(biāo)號,否則,當(dāng)在源程序中,有多于一次引用該宏時,匯編程序在進行宏擴展后將會給出:標(biāo)號重復(fù)定義的錯誤。 偽指令LOCAL的一般格式如下:LOCAL 標(biāo)號1, 標(biāo)號2, 偽指令LOCAL必須是偽指令MACRO后的第一條語句,在MACRO和LOCAL之間也不允許有注釋和分號標(biāo)志。 匯編程序在每次進行宏擴展時,總是把由LOCAL說明的標(biāo)號用一個唯一的符號(從?0000到?FFFF)來代替,從而避免標(biāo)號重定義的錯誤。編輯ppt與宏有關(guān)的偽指令與宏有關(guān)的偽指令例:編寫求一個求絕對值的宏。解:方法1:ABSMACRO word1CMPword1, 0JGEnextNEGword1next:ENDM

13、假設(shè)對宏ABS有以下兩次引用,ABSBXABSAL 匯編程序?qū)@示“標(biāo)號重復(fù)定義”的錯誤,我們需要用下面的方法定義該宏。編輯ppt與宏有關(guān)的偽指令與宏有關(guān)的偽指令方法2:ABSMACRO word1LOCAL nextCMPword1, 0JGEnextNEGword1next:ENDM假設(shè)有下面兩次宏ABS的引用,ABSBX匯編程序?qū)λ鼈冞M行宏擴展時,將得到下列程序片段:ABSBX1CMPBX, 01JGE?00001NEGBX1 ?0000:編輯ppt與宏有關(guān)的偽指令與宏有關(guān)的偽指令 偽指令LOCAL在子程序中也可起作用,但它的作用與宏定義的作用是不同的,有關(guān)該偽指令在子程序和宏定義中功能

14、的主要差異如下表所列。偽指令LOCAL在子程序和宏中的比較在子程序中在宏定義中語句的位置在所有指令之前在所有指令之前偽指令的作用說明局部變量說明局部標(biāo)號偽指令的格式可用一條偽指令來說明多個局部變量,也可連續(xù)用多條偽指令來說明可用一條偽指令來說明多個局部標(biāo)號,也可連續(xù)用多條偽指令來說明調(diào)用或引用子程序的不同調(diào)用,其局部變量名保持不變在每次宏引用的擴展時,將會自動產(chǎn)生出一個唯一的局部標(biāo)號編輯ppt與宏有關(guān)的偽指令與宏有關(guān)的偽指令(2) (2)取消宏定義偽指令)取消宏定義偽指令PURGE 偽指令PURGE的一般格式如下:PURGE宏名宏名1, 宏名宏名2, 該偽指令通知匯編程序取消“宏名1, 宏名2

15、, ”宏名表中的宏定義。 在此語句后,如果還有這些宏的引用語句,則匯編程序不會把它們當(dāng)作宏引用來進行擴展,并且還將顯示出錯信息。(3)中止宏擴展偽指令)中止宏擴展偽指令 EXITM偽指令EXITM的一般格式如下:EXITM 該偽指令書寫在宏定義體中,用來告訴匯編程序:如果遇到該偽指令,那么,立即中止對該偽指令之下語句的擴展。如果在嵌套的內(nèi)層宏中遇到了該偽指令,則退出到宏嵌套的外層。 在一般情況下,偽指令EXITM與條件偽指令一起使用,以便在不同的條件下挑選出不同的語句。編輯ppt5.4 重復(fù)匯編偽指令重復(fù)匯編偽指令 在編寫源程序時,有時會出現(xiàn)連續(xù)相同或相似的語句(組)。當(dāng)出現(xiàn)這種情況時,可利用

16、重復(fù)偽指令來重復(fù)語句,從而達到簡化程序的目的。 重復(fù)匯編偽指令所定義的重復(fù)塊是宏的一種特殊形式,也是由偽指令ENDM來結(jié)束重復(fù)塊。用重復(fù)匯編偽指令定義的重復(fù)塊也可帶有參數(shù),并在匯編過程中參數(shù)被實參代替,但重復(fù)塊不會被命名,不能在程序的其它地方引用。(1)偽指令)偽指令REPT 偽指令REPT的作用是把一組語句重復(fù)指定的次數(shù),該重復(fù)次數(shù)由偽指令后面的數(shù)值表達式來確定。其一般使用格式如下:REPT數(shù)值表達式重復(fù)的語句組ENDM編輯ppt重復(fù)匯編偽指令重復(fù)匯編偽指令例:定義例:定義100個初值為個初值為32的字節(jié)單元,該存儲單元的起始符號地址為的字節(jié)單元,該存儲單元的起始符號地址為Table。方法1

17、:用偽指令REPT來實現(xiàn)Table LABEL TYPEREPT100DB 32ENDM 上述重復(fù)塊的匯編結(jié)果如下:上述重復(fù)塊的匯編結(jié)果如下:Table LABEL TYPEDB 32DB 32DB 32;上述字節(jié)定義重復(fù)100次編輯ppt重復(fù)匯編偽指令重復(fù)匯編偽指令例:定義例:定義100個初值分別為個初值分別為1,2,100的字節(jié)單元,該存儲單元的起始符的字節(jié)單元,該存儲單元的起始符號地址為號地址為Table。Table LABEL TYPECOUNT = 1REPT100DB COUNTCOUNT = COUNT + 1ENDM 上述重復(fù)塊的匯編結(jié)果相當(dāng)于:Table LABEL TYPE

18、DB 1DB 2DB 100編輯ppt重復(fù)匯編偽指令重復(fù)匯編偽指令例:計算1+2+1000,并把其值存入寄存器AX。方法1:用偽指令REPT來實現(xiàn)MOVAX, 0COUNT = 1REPT1000ADD AX, COUNTCOUNT = COUNT + 1ENDM 上述重復(fù)塊的匯編結(jié)果與下面程序段相一致:MOVAX, 0ADD AX, 1ADD AX, 2ADD AX, 1000 雖然上面這些語句的執(zhí)行能完成本例所指定的功能,但它是用1000條加法指令來直接計算的,這1000條指令無疑會大大增加目標(biāo)代碼的長度。編輯ppt重復(fù)匯編偽指令重復(fù)匯編偽指令方法2:用循環(huán)指令LOOP來實現(xiàn)MOVAX,

19、0MOVCX, 1000again:ADDAX, CXLOOPagain 偽指令REPT與循環(huán)指令起作用的時期和方式是截然不同的,主要差異見下表:偽指令REPT循環(huán)指令LOOP起作用的時期匯編程序把源文件翻譯成目標(biāo)文件時期程序的執(zhí)行時期起作用的方式把被重復(fù)的指令(組)直接重復(fù)寫入目標(biāo)文件通過反復(fù)執(zhí)行同一指令(組)來實現(xiàn)重復(fù)重復(fù)次數(shù)對目標(biāo)文件的影響由于重復(fù)次數(shù)決定著被重復(fù)指令(組)寫入目標(biāo)文件的次數(shù),所以,改變重復(fù)次數(shù)一定會改變目標(biāo)文件的字節(jié)數(shù)由于重復(fù)的指令數(shù)與重復(fù)次數(shù)無關(guān),所以,改變重復(fù)次數(shù)不會改變目標(biāo)文件的字節(jié)數(shù)編輯ppt重復(fù)匯編偽指令重復(fù)匯編偽指令 (2)偽指令)偽指令I(lǐng)RP 偽指令I(lǐng)RP

20、的作用是用每個參數(shù)創(chuàng)建一組語句,其重復(fù)次數(shù)由偽指令后面參數(shù)表中參數(shù)的個數(shù)來確定。其一般使用格式如下:IRP形式參數(shù)形式參數(shù), 重復(fù)的語句組重復(fù)的語句組ENDM例:把16位通用寄存器之值相加,并把結(jié)果存入寄存器AX。解:由于16位通用寄存器名是一些不同的符號,不能用計數(shù)的方法來依次訪問它們,所以,我們需要用偽指令I(lǐng)RP來實現(xiàn)。IRPREG, ADD AX, REGENDM編輯ppt重復(fù)匯編偽指令重復(fù)匯編偽指令 (3) 偽指令偽指令I(lǐng)RPC 偽指令I(lǐng)RPC的作用與IRP相似,其實參表是一個字符串,并對字符串中的每個字符創(chuàng)建一組語句,所以,其重復(fù)次數(shù)是由該字符串中的字符數(shù)來確定。IRPC形式參數(shù),

21、字符串重復(fù)的語句組ENDM例:把16位數(shù)據(jù)寄存器之值相加,并把結(jié)果存入寄存器DI。解:由于16位數(shù)據(jù)寄存器是AX、BX、CX和DX,它們的名稱中只有第一個字符不同,所以,可以用偽指令I(lǐng)RPC來實現(xiàn)。XORDI, DIIRPCREG, ABCDADD DI, REG&X;符號&是連接運算符ENDM編輯ppt5.5 條件匯編偽指令條件匯編偽指令(1) 條件匯編偽指令的功能條件匯編偽指令的功能條件匯編偽指令的一般格式如下:IFnnnn條件表達式語句組1ELSE語句組2ENDIF其中:IFnnnn是表偽指令,“”內(nèi)的語句是可選的。 條件匯編偽指令是在匯編程序把源程序轉(zhuǎn)換成目標(biāo)程序時起作用,其一般含義是:若條件匯編偽指令后面的“條件表達式”為真,那么,語句組1將被匯編;否則,語句組2將被匯編(如果含有ELSE偽指令)。編輯ppt條件條件匯編偽指令匯編偽指令偽指令含義IF exp若表達式exp的值不為0,則語句組1包含在目

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論