版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第 六 章,高級編程技術(shù),6.1 移位指令及循環(huán)移位指令,6.2 串操作指令,6.3 宏指令,習(xí) 題 6,所謂高級編程技術(shù),是指在匯編語言程序設(shè)計中,如果我們把移位及循環(huán)移位指令、串操作指令和宏指令巧妙地應(yīng)用到匯編語言程序設(shè)計中,將大大提高編程質(zhì)量和編程效率。 本章主要介紹這三類指令:移位及循環(huán)移位指令、串操作指令和宏指令的功能,并通過大量例子說明其應(yīng)用。,6.1 移位指令及循環(huán)移位指令,移位指令完成對操作數(shù)的移位操作。分為一般移位和循環(huán)移位指令。移位操作也是將操作數(shù)倍增和減半的有效方法。,6.1.1 移位指令,(1)邏輯左移指令 【指令格式】 SHL D,COUNT D為通用寄存器或存儲器操
2、作數(shù)。 COUNT表示移位的次數(shù)。 移位一次,COUNTR=1; 移位多次,COUNT=CL (CL中為移位的次數(shù))。,【功能】對給定的目的操作數(shù)D(位16位)左移COUNT次。最高位移入CF中,最低位補零。 其操作示意圖如圖6-1所示。,圖6-1 邏輯左移指令操作示意圖,例如:如下邏輯左移指令: SHL AL,1 MOV CL,3 SHL CX,1 SHL DX,CL SHL ALFADI,1 SHL ALFADI,CL,說明:本指令影響標(biāo)志位:OF、PF、SF,ZF。CF決定移入的最高位。,本指令主要用于向左移位操作。但因為左移一位相當(dāng)于權(quán)值提高一級,故本指令又常作有、無符號數(shù)的倍增操作。
3、 但請注意,在左移一次后,當(dāng)新的操作數(shù)最高位與CF不相同時,則OF置1,表明有符號數(shù)操作產(chǎn)生溢出,不再符合倍增關(guān)系。對無符號數(shù),當(dāng)移位后使CF置1,則不再符合倍增關(guān)系。,例如: AL=01000010B(66)/(+66) 左移一位后: AL=10000100(132)/ (124),CF=0,OF=1 上例表明,對無符號數(shù),移位后CF=0,故移位前后數(shù)間符合倍增關(guān)系(66*2=132);而對有符號數(shù),移位后OF=1發(fā)生了溢出,所以移位前后數(shù)間不再符合倍增關(guān)系(+66*2-124),【例6-1】編寫程序段,把AX中的無符號數(shù)乘以8,如果有溢出,忽略超過16位的部分。 【分析】乘以8的操作可以通
4、過在二進制數(shù)的后面加3個0完成,即左移3位,移出部分自動丟失。只需要在CL中放移動位數(shù)(3位),再用SHL指令移位即可:,【解】指令序列如下: MOV CL,3 SHL AX,CL 對于雙字型數(shù)據(jù),或者位數(shù)更多的復(fù)雜數(shù)據(jù),也可以用移位指令與邏輯運算指令配合,簡化乘除法的運算。,邏輯右移指令 【指令格式】SHR D,COUNT D為任一通用寄存器或存儲器操作數(shù)。 COUNT表示移位次數(shù)。 移位一次,COUNT=1; 移位多次,COUNT=CL (CL中為移位的次數(shù))。,【功能】對給定的目的操作數(shù)D(8位/16位)右移COUNT次。最低位移入CF中,最高位補零。 其操作示意如圖6-2所示。,圖6-
5、2 邏輯右移指令操作示意圖,例如:如下指令: SHR AL,1 MOV CL,3 SHR SI,CL SHR DX,CL SHR ALFADI,1 SHR ALFADI,CL,說明: 本指令影響標(biāo)志位:OF、PF、SF,ZF。CF決定移入的最低位。 同樣,本指令主要用于右向邏輯移位操作。但右移一位,相當(dāng)權(quán)值下降一級。所以本指令可作為無符號數(shù)的除2運算。但請注意,在右移后,如果新的CF=1,表明移位前的數(shù)是一個奇數(shù),則減半的結(jié)果是不精確的。,(3)算術(shù)左移指令 【指令格式】SAL D,COUNT D為任一通用寄存器或存儲器操作數(shù)。 COUNT表示移位次數(shù)。 移位一次,COUNT=1; 移位多次,
6、COUNT=CL。 (CL中為移位的次數(shù)),【功能】對給定的目的操作數(shù)D(8位/16位)算術(shù)左移COUNT次。最高位移入CF中,最低位補零。 其操作示意圖與圖6.1完全相同。,說明:實際上SAL與SHL是同一指令的兩種表示方法。具有完全相同的功能。它一般用來作為有符號數(shù)的倍增運算。 在左移一次后,如果新的CF與新的操作數(shù)最高位不相同,則標(biāo)志OF=1。表明移位前、后的操作數(shù)不再具有倍增關(guān)系。,算術(shù)右移指令 【指令格式】SAR D,COUNT D為任一通用寄存器或存儲器操作數(shù)。 COUNT表示移位次數(shù)。 移位一次,COUNT=1; 移位多次,COUNT=CL。 (CL中為移位的次數(shù)),【功能】對給
7、定的目的操作數(shù)D(8位/16位)右移COUNT次。最低位移入CF中,最高位保持不變。 其操作示意如圖6-3所示。,圖6-3 算術(shù)右移指令操作示意圖,例如:(如下指令) SAR AL,1 MOV CL,6 SAR BX,CL SAR BX,1 SAR BETABX,1 SAR BETABX,CL,說明:本指令影響標(biāo)志位:PF、SF,ZF。CF決定移入的最低位。同樣,本指令常用于有符號數(shù)的減半運算。 但在右移使CF=1時,會產(chǎn)生減半運算結(jié)果不精確問題。,如:AL=11001110B(-50) 右移一位后: AL=11100111B(-25); CF=0,減半運算結(jié)果是精確的; 再右移一位后: AL
8、=11110011B(-13); CF=1,減半運算結(jié)果是不精確的,6.1.2 循環(huán)移位指令,循環(huán)移位指令是指對操作數(shù)進行首尾相連的移位操作。它共有4條指令。具有相似功能,一并說明如下:,【指令格式】 ROL D,COUNT ;左向循環(huán)移位 ROR D,COUNT ;右向循環(huán)移位 RCL D,COUNT ;帶進位左向循環(huán)移位 RCR D,COUNT ;帶進位右向循環(huán)移位,D為任一通用寄存器或存儲器操作數(shù)。 COUNT表示移位次數(shù)。 移位一次,COUNT=1; 移位多次,COUNT=CL。 (CL中為移位的次數(shù)),【功能】對給定的目的操作數(shù)D(8位/16位)進行循環(huán)移位。 ROL/ROR實現(xiàn)左向
9、/右向不帶CF的循環(huán)移位。 RCL/RCR實現(xiàn)左向/右向帶有CF的循環(huán)移位。 它們的操作示意如圖6-4所示。,圖6-4 循環(huán)移位指令操作示意圖,說明:本組指令只影響標(biāo)志:CF、OF。CF決定于移入位。 OF決定于移位一次后符號位是否改變,如改變則OF=1,否則,OF=0。由于是循環(huán)移位,所以對字節(jié)只要移位8次(對字只要移位16位)就可以恢復(fù)為原操作數(shù)。 而帶CF的循環(huán)移位,因CF參加循環(huán)移位,所以可以利用它實現(xiàn)多字節(jié)的循環(huán)移位。,【例6-2】在寄存器DX和AX中存放有32位二進制數(shù)(高位在DX中)。今要求實現(xiàn)乘4運算。 【分析】乘4運算可以通過對DX:AX左移二次,等價乘4的方法實現(xiàn)。先對低位
10、AX邏輯左移一次,然后再對高位DX循環(huán)左移一次,通過CF完成寄存器間的移位傳遞。通過二次同樣的移位,就可實現(xiàn)乘4運算。,【解】指令序列如下: SHL AX,1 RCL DX,1 SHL AX,1 RCL DX,1 對于多個存儲單元,也可以使用同樣的方式完成移位操作。,【例6-3】編寫程序段分別完成下列計算。 (1)把(DX,AX)構(gòu)成的無符號雙字除以4,商放在(DX,AX)中,余數(shù)放BX中。 (2)把(DX,BX)構(gòu)成的無符號數(shù)乘以17,結(jié)果仍放在(DX,BX)中,忽略溢出。,【分析】在(1)小題中,由于沒有直接的指令把雙字型數(shù)據(jù)移位,所以通過CF作為過渡,連續(xù)做兩次字型數(shù)據(jù)的移位,先把高字D
11、X右移1位,移出位暫時放在CF中,再用帶進位CF的循環(huán)右移指令,在把低字移位的同時,把暫存在CF中的那1位移到低字的最高位上。,在(2)小題中,移動的位數(shù)較多,如果用循環(huán)的方式實現(xiàn)就違背了提高處理速度的本意。程序段中用AX取出低字部分的值,右移12位,把應(yīng)該從低字移到高字的4位放在了AX的最低4位上。再把高字DX用SHL指令左移4位,移出部分自動丟失,右4位補0,最后把AX中存放的4位數(shù)據(jù)用OR指令(也可以用ADD指令)放到DX的低4位上,從而實現(xiàn)雙字(DX,BX)乘以16的操作。,【解】(1)二進制無符號數(shù)除以4,就是把它向右移動兩位,高位補0,原二進制數(shù)的最低兩位就是余數(shù)。指令序列如下:,
12、MOV BX,AX AND BX,3 SHR DX,1 RCR AX,1 SHR DX,1 RCR AX,1,(2)17可以看作(16+1),因此可以把(DX,BX)先左移4位,結(jié)果記在(DX,BX)中,再與原數(shù)據(jù)相加。指令序列如下: MOV SI,BX MOV AX,BX MOV DI,DX MOV CL,4 SHL BX,CL SHL DX,CL,MOV CL, 12 SHR AX, CL OR DX, AX ADD BX, SI ADC DX, DI,6.2 串操作指令,匯編語言中的“串”是指內(nèi)存中連續(xù)存放的若干個字節(jié)型或字型數(shù)據(jù)構(gòu)成的一個整體,相當(dāng)于一個數(shù)組。8086/8088為這種“
13、數(shù)組”的操作提供了專門的串操作指令,這些指令與循環(huán)或附加在串指令前的前綴配合,可以依次對串中的數(shù)據(jù)進行處理。,串操作指令都要求先把數(shù)組首元素(或者最后一個元素)的地址放在指定段寄存器和變址寄存器中,每處理一個數(shù)組元素,串指令本身自動把變址寄存器的內(nèi)容做相應(yīng)的變化,使其指向下一個待處理的元素。,根據(jù)實際需要,串操作指令可以按數(shù)組存放的內(nèi)存地址從小到大進行處理,也可以從大到小處理,CPU在執(zhí)行串指令時,會根據(jù)標(biāo)志寄存器中的DF標(biāo)志位選擇處理的方向。,8086/8088有5條串操作指令,它們是串傳送、串比較、串搜索、串裝入和串送存。什么是元素?8086/8088做這樣的約定:在字節(jié)串中,一個字節(jié)就是
14、一個元素;在字串中,一個字(兩個字節(jié))就是一個元素。,源串和目的串的存儲及尋址方式都有隱含規(guī)定,即源串段地址在DS中,目的串段地址在ES中;SI存放源串的偏移地址,DI存放目的串的偏移地址;CX作為計數(shù)器。,6.2.1 DF標(biāo)志位,DF是8086/8088中的一個重要的控制標(biāo)志位,它決定了串指令的處理方向。當(dāng)CPU執(zhí)行到一條串操作指令時,如果DF的值是0,CPU會把指令相應(yīng)的變址寄存器的值增加,按地址由小到大的方向處理;反之如果DF的值是1,CPU會把變址寄存器的值減小,按地址由大到小的方向處理。,8086/8088提供有兩條專用指令設(shè)置DF,分別是CLD和STD指令。 【指令格式】CLD 【
15、功能】把標(biāo)志位DF清0。,如果一開始SI或DI指向源串或目的串首地址,則DF應(yīng)清0,以實現(xiàn)按增址方向?qū)υ摯奶幚怼?如為字節(jié)串,每處理一個元素: SI+1SI,DI+1DI; 如為字串,每處理一個元素:SI+2SI,DI+2DI。以指向下一個元素。,【指令格式】STD 【功能】把標(biāo)志位DF置1。 如果一開始SI或DI指向源串或目的串末地址,則DF應(yīng)置1,以實現(xiàn)按減址方向?qū)υ摯奶幚怼?如為字節(jié)串,每處理一個元素: SI1SI,DI1DI; 如為字串,每處理一個元素: SI2SI,DI2DI。以指向下一個元素。,6.2.2 與REP配合的串指令MOVS、STOS和LODS,1.串重復(fù)前綴 【指令
16、格式】 REP 串指令MOVS/STOS/LODS,【功能】 (1)判斷CX的內(nèi)容,如果CX=0,退出串操作,否則繼續(xù)執(zhí)行; (2)CX CX1; (3)執(zhí)行其后的串指令; (4)重復(fù)(1)(3)。,圖6-5 串重復(fù)前綴REP的功能,2串傳送指令MOVS 【指令格式】 字節(jié)串傳送 : MOVSB 字串傳送 : MOVSW,【功能】 (1)執(zhí)行MOVSB指令時,把數(shù)據(jù)段DS:SI所指內(nèi)存單元的一個字節(jié)傳送到附加段ES:DI所指字節(jié)單元,SI和DI自動加1或自動減1,即: ES:DI DS:SI, SI SI1, DI DI1,(2)執(zhí)行MOVSW指令時,把數(shù)據(jù)段DS:SI所指內(nèi)存單元的一個字傳送
17、到附加段ES:DI所指字單元中。SI和DI自動加2或減2,即: ES:DI DS:SI, SI SI2, DI DI2,說明:執(zhí)行串傳送指令后,SI和DI是增值還是減值取決于狀態(tài)標(biāo)志DF。 DF=0,SI和DI自動增值; DF=1,SI和DI自動減值。,在串指令中,操作數(shù)隱含。因此在執(zhí)行串指令前,應(yīng)做以下準備工作: (1)DS:SI應(yīng)指向源串首址或末地址,ES:DI應(yīng)指向目的串首址或末地址。 (2)建立方向標(biāo)志。若為增址型傳送,用指令CLD,使方向標(biāo)志DF清0;若為減址型傳送,用指令STD,使方向標(biāo)志DF置1。 (3)把數(shù)據(jù)串長度送入CX寄存器中。,【例6-4】將數(shù)據(jù)段BLOCK單元開始的10
18、0個字節(jié)依次傳送到附加段BUF開始的內(nèi)存區(qū)。 【解】程序如下: DATA SEGMENT BLOCK DB 10,30, ;定義100個數(shù) DATA ENDS,EXTR SEGMENT BUF DB 100 DUP(?) EXTR ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME ES:EXTR BEGIN: MOV AX,DATA MOV DS,AX MOV AX,EXTR MOV ES,AX,MOV SI,OFFSET BLOCK MOV DI,OFFSET BUF MOV CX,100 CLD REP MOVSB MOV AH,4CH INT
19、 21H CODE ENDS END BEGIN,【例6-5】設(shè)字節(jié)型變量str中存放了100個字符,編寫程序段完成下列操作: (1)刪除串中前5個字符,并把后續(xù)字符前移。 (2)把串中各字符向后移一個字節(jié),在串首插入一個空格符。,【分析】第(1)題要把串的后95個字節(jié)向前移動,是源串首址大于目標(biāo)串首址的情況,需要自首至尾進行移動;第(2)題正相反,源串首址小于目標(biāo)串首址,只能按由尾至首的方向移動。,【解】程序如下: (1)MOV AX,SEG str MOV DS,AX MOV ES,AX LEA SI,str+5 LEA DI,str MOV CX,95 CLD REP MOVSB,(2)
20、 MOV AX,SEG str MOV DS,AX MOV ES,AX LEA SI,str+99 LEA DI,str+100 MOV CX,100 STD REP MOVSB MOV str, ,3串裝入指令LODS 【指令格式】 字節(jié)串裝入: LODSB 字串裝入 : LODSW,【功能】 (1)執(zhí)行LODSB指令時,把數(shù)據(jù)段DS:SI所指內(nèi)存單元中的一個字節(jié)裝入AL中,SI自動加1或減1,即: AL DS:SI, SI SI 1,(2)執(zhí)行LODW指令時,把數(shù)據(jù)段DS:SI所指內(nèi)存單元中的一個字裝入AX中,SI自動加2或減2, 即: AX DS:SI, SI SI 2,說明:DF=0時
21、,SI自動增值;DF=1時,SI自動減值。該指令前一般不用重復(fù)前綴,其原因留給讀者去思考。,【例6-6】設(shè)DS段中的變量arr中存放了一個帶符號的字型數(shù)組,元素個數(shù)已放在字型變量arrlen中(0)。編寫程序段,利用串操作指令,統(tǒng)計出該數(shù)組中正數(shù)、0和負數(shù)各多少個,結(jié)果分別放在DS段中的字型變量countp、count0和countn中。,【解】 MOV CX,arrlen MOV countp,0 MOV count0,0 MOV countn,0 LEA SI,arr CLD lab1: LODSW CMP AX,0,JG lab2 JL lab3 INC count0 JMP lab4
22、lab2: INC countp JMP lab4 lab3: INC countn lab4: LOOP lab1,4串送存指令STOS 【指令格式】 字節(jié)存儲: STOSB 字存儲: STOSW,【執(zhí)行操作】 (1)執(zhí)行STOSB指令時,把AL中的內(nèi)容裝入到附加段ES:DI所指內(nèi)存單元中,DI自動加1或減1,即: ES:DI AL, DI DI1,(2)執(zhí)行STOSW指令時,把AX中的內(nèi)容裝入到附加段ES:DI所指內(nèi)存單元中,DI自動加2或減2,即: ES:DI AX, DI DI2 說明:DF=0時,DI自動增值;DF=1時,DI自動減值。,【例6-7】設(shè)DS段中的變量arr1中存放了一
23、個帶符號的字型數(shù)組,元素個數(shù)已放在字型變量arr1len中(0)。編寫程序段,試利用串操作指令,把該數(shù)組中非0元素復(fù)制到DS段中的另一個字型變量arr2中,要求在arr2中連續(xù)存放,并統(tǒng)計出非0元素的個數(shù)填在變量arr2len中。,【分析】首先把DS、SI、ES和DI指向正確的位置,然后利用循環(huán)指令,每次從arr1中取出一個數(shù),若不是0,則存往arr2。由于是字型數(shù)據(jù),循環(huán)結(jié)束后DI的值減去arr2的偏移地址可得到保存下來的數(shù)據(jù)占據(jù)了多少字節(jié),除以2后即得元素個數(shù)。,【解】程序如下 PUSH DS POP ES LEA SI, arr1 LEA DI, arr2 MOV CX, arr1len
24、 CLD lab1;LODSW,TEST AX,AX JZ lab2 STOSW Lab2: LOOP lab1 SUB DI, OFFSET arr2 SHR DI, 1 MOV arr2len, DI,6.2.3 與REPE和REPNE配合的串指令CMPS和SCAS,REPE和REPZ等價,當(dāng)相等或為零重復(fù)串操作; REPNE和REPNZ等價,當(dāng)不相等或不為零重復(fù)串操作。,1REPE/REPZ 【指令格式】 REPE(或REPZ) 串指令CMPS/SCAS 【功能】 (1)CX = 0或ZF = 0,退出串操作,否則繼續(xù)執(zhí)行; (2)CX CX 1; (3)執(zhí)行其后的串指令; (4)重復(fù)(
25、1)(3),圖6-6 串重復(fù)前綴REPE/REPZ的功能,2.REPNE/REPNZ 【指令格式】 REPNE(或REPNZ) 串指令CMPS/SCAS 【功能】 (1)CX = 0或ZF = 1,退出串操作,否則繼續(xù)執(zhí)行; (2)CX CX 1; (3)執(zhí)行其后的串指令; (4)重復(fù)(1)(3),圖6-7 串重復(fù)前綴REPNE/REPNZ的功能,3串比較指令CMPS 【指令格式】 字節(jié)串比較 : CMPSB 字串比較: CMPSW,【功能】 (1)執(zhí)行CMPSB指令時,用數(shù)據(jù)段DS:SI所指內(nèi)存單元中的一個字節(jié)與附加段ES:DI所指單元中的一個字節(jié)相減,根據(jù)結(jié)果設(shè)置狀態(tài)標(biāo)志,SI和DI自動加
26、1或減1,即:DS:SI ES:DI, SI SI 1, DI DI 1,(2)執(zhí)行CMPSW指令時,用數(shù)據(jù)段DS:SI所指內(nèi)存單元中的一個字與附加段ES:DI所指單元中的一個字相減,根據(jù)結(jié)果設(shè)置狀態(tài)標(biāo)志,SI和DI自動加2或減2,即: DS:SI ES:DI, SI SI 2, DI DI 2 說明:DF=0時,SI,DI自動增值;DF=1時,SI,DI自動減值。,【例6-8】編寫子程序,按字典排序法,比較兩個已知長度的字符串的大小。 【解】程序如下:,;子程序名:strcmp ;子程序功能:按字典排序法比較兩個已知長度的字符串的大小 ;入口參數(shù):DS:SI和ES:DI分別存放第1個串和第2
27、個串的起始邏輯地址, ;CX和DX分別放兩個串的串長 ;出口參數(shù):AL為1表示第1個串大,AL為-1表示第2個串大,AL為0表示兩者相等 ;破壞寄存器:AH,CX,SI,DI,strcmp PROC NEAR CLD MOV AH, 0 CMP CX, DX JB lab1 MOV AH, 1 JE lab MOV CX, DX,MOV AH, 2 lab1:JCXZ lab2 CMPSB JA lab3 JB lab4 LOOP lab1 lab2:CMP AH,1 JB lab4,JA lab3 MOV AL,0 JMP lab5 lab3:MOV AL,1 JMP lab5 lab4:M
28、OV AL,-1 lab5:RET strcmp ENDP,4串搜索指令SCAS 【指令格式】 字節(jié)串搜索: SCASB 字串搜索: SCASW,【功能】 (1)執(zhí)行SCASB指令時,用AL中的內(nèi)容作為關(guān)鍵字與附加段ES:DI所指存儲單元中的一個字節(jié)相減,根據(jù)結(jié)果設(shè)置狀態(tài)標(biāo)志ZF,DI自動加1或減1,即 : AL ES:DI, DI DI 1,(2)執(zhí)行SCASW指令時,用AX中的內(nèi)容作為關(guān)鍵字與附加段ES:DI所指存儲單元中的一個字相減,根據(jù)結(jié)果設(shè)置狀態(tài)標(biāo)志ZF,DI自動加2或減2,即: AX ES:DI, DI DI 2 說明:DF=0時,DI自動增值;DF=1時,DI自動減值。,【例6-
29、9】編寫一個子程序,判斷一個數(shù)據(jù)串中是否存在一個給定的值。要求子程序?qū)ψ止?jié)型和字型的串都能判斷,以CF作為出口參數(shù),如果在串中找到目標(biāo)值,在CF位置1,否則令CF清0。 【解】程序如下: ;子程序名:search ;子程序功能:判斷一個數(shù)據(jù)串中是否存在一個給定的值(字節(jié)串或字串),;入口參數(shù):ES:DI數(shù)據(jù)串的首地址 ;AX查找目標(biāo)值,字節(jié)串則以AL存放目標(biāo)值 ;CX串中元素個數(shù) ;CF0表示串中元素是字型,1則表示串中元素是字節(jié)型 ;出口參數(shù):CF1表示在串中找到了給定值,0表示沒找到 ;破壞的寄存器:CX,DI,search PROC NEAR JCXZ s2 CLD JC s3 REPN
30、Z SCASW JZ s1 JMP s2,s3: REPNZ SCASB JZ s1 s2: CLC JMP s4 s1: STC s4: RET search ENDP,6.2.4 串操作指令的應(yīng)用,在應(yīng)用程序設(shè)計中,經(jīng)常會遇到各種字符或字符串的處理。在系統(tǒng)軟件中,對大量字符串的操作則更加頻繁。因此,字符串的處理是計算機應(yīng)用的一個重要方面。,【案例6-1】設(shè)計一個口令設(shè)置程序。其功能如下: 程序執(zhí)行首先顯示提示: Please input the password:(請輸入口令:) 如果用戶輸入正確的口令: USER(并回車),則輸出: OK!WELCOME YOU,否則顯示提示: Erro
31、r! Input again:(有錯誤,請重新輸入:) 三次口令輸入不對,就退出。 【案例分析】口令設(shè)置,實際上就是兩個字符串進行比較看它們是否相等。,【案例求解】 源程序清單如下: ;filename:E6_1.ASM DATA SEGMENT PASSWORD DB USER,0DH COUNT EQU $PASSWORD INPUT DB COUNT DB ?,STRING DB COUNT DUP(?) PROMPT DB Please input the DB password: $ MSG1 DB 0DH,0AH,OK!WELCOME DB YOU,0DH,0AH,$ MSG2 D
32、B 0DH,0AH, Error! Input DB again: $ DATA ENDS,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS,AX MOV ES,AX MOV DX,OFFSET PROMPT MOV AH,09H INT 21H MOV BX,3 AGAIN: LEA DX,INPUT,MOV AH,0AH INT 21H LEA SI, PASSWORD LEA DI, STRING MOV CX,COUNT CLD REPE CMPSB JZ EXIT CALL CRLF,LEA DX,,MSG2
33、 MOV AH,,9 INT 21H DEC BX JNZ AGAIN JMP DONE EXIT: CALL CRLF LEA DX,MSG1 MOV AH,09H,INT 21H DONE: MOV AH, 4CH INT 21H ;_ CRLF PROC MOV AH, 02H MOV DL, 0DH INT 21H,MOV DL,0AH INT 21H RET CRLF ENDP ;_ CODE ENDS END START,6.3 宏指令,在編寫匯編語言程序時候要用到一組基本上相似的匯編語言語句,它們完成相同的功能,有時候這組語句完全相同,有時候僅是有些變量略有差異,為了減輕編寫程序
34、的負擔(dān),可以使用匯編語言中的宏。,宏就是源程序中一段有獨立功能的程序代碼,它只需要在源程序中定義一次,就可以多次調(diào)用,調(diào)用時只需使用一個宏指令語句就可以了。,6.3.1 宏的定義、調(diào)用和展開,宏的定義是由一組偽指令實現(xiàn)的。其格式是: 宏名 MACRO形參表 ;宏體 ENDM,其中,MACRO和ENDM是一對偽指令,分別表示宏定義的開始和結(jié)束。宏名必須唯一,在其后面的源程序中,可通過宏名來調(diào)用宏。形參表由若干個形式參數(shù)組成,當(dāng)調(diào)用宏時,要用對應(yīng)的實際參數(shù)去取代,向宏中傳遞信息。 宏的定義可以是匯編語言所允許的任意語句(指令或偽指令)序列,它決定了宏的功能。夾在MACRO和ENDM之間的語句序列,
35、我們把它們稱作宏體。,宏經(jīng)過定義以后,就可以在源程序中調(diào)用,這種調(diào)用稱為宏調(diào)用。宏名可以像指令一樣被使用,故又稱為宏指令。 宏調(diào)用的格式如下: 宏名實參表,實參表也就是上邊所說的實際參數(shù),它和形參表相對應(yīng),用于取代宏定義中的形式參數(shù)。一般情況下,實參個數(shù)和形參個數(shù)相同,如果實參多于形參,則多余的實參被忽略;反之,實參少于形參,形參將被賦為空值。 當(dāng)源程序被匯編時,匯編程序?qū)⒂煤牦w取代相應(yīng)的宏指令,并用實參取代形參,下面舉例說明宏的定義、調(diào)用和展開。,【例6-10】定義一個宏,將前兩個字操作數(shù)相加,結(jié)果放到第三個操作數(shù)中。 宏定義:,ADD_M MACRO OPRD1,OPRD2,RESULT
36、PUSH AX MOV AX,OPRD1 ADD AX,OPRD2 MOV RESULT,AX POP AX ENDM,宏指令(宏調(diào)用): ADD_M BX,CX,DX ADD_M OP1,OP2,OP3 宏展開以后應(yīng)該是:, PUSH AX MOV AX,BX ADD AX,CX MOV DX,AX POP AX , PUSH AX MOV AX,OP1 ADD AX,OP2 MOV OP3,AX POP AX ,在宏定義中,如果需要用到寄存器,應(yīng)該先將寄存器入棧,以免影響程序的執(zhí)行,第一個調(diào)用的三個實參分別是三個寄存器;第二個調(diào)用的三個實參分別是已經(jīng)定義的變量。,6.3.2 宏定義中的參數(shù)
37、,宏定義中的參數(shù)可以為多種形式,下面,我們通過例子來說明。 【例6-11】宏定義可以沒有參數(shù),下面宏定義用于從鍵盤讀入一個字符放在AL中。,宏定義: INPUT MACRO MOV AH,1 INT 21H ENDM 宏指令(宏調(diào)用): INPUT,宏展開: MOV AH,1 INT 21H,【例6-12】參數(shù)可能是操作數(shù)或操作碼。 宏定義: OPT_VAR MACRO OP1,OP2 PUSH AX MOV AX,OP1 OP2 AX MOV OP1,AX POP AX ENDM,宏指令(宏調(diào)用): OPT_VAR VAR1,DEC 宏展開: PUSH AX MOV AX,VAR1 DEC
38、AX MOV VAR1,AX POP AX 通過宏調(diào)用,完成了對變量VAR1的減1操作。,【例6-13】使用&作分隔符,參數(shù)是操作數(shù)或操作碼的一部分。 宏定義: CONJMP MACRO DIRE,REG,COUNT SH&DIRE A®,COUNT ENDM 宏調(diào)用: CONJMP L,X,1 CONJMP R,L,CL,宏展開: SHL AX,1 SHR AL,CL 這個宏可以實現(xiàn)寄存器AX的左移或AL的右移。,6.3.3 宏與子程序的比較,(1)處理的時間不同。宏調(diào)用是在源程序被匯編時由匯編程序處理的;而子程序調(diào)用是在程序執(zhí)行期間由CPU直接執(zhí)行的。,(2)處理的方式不同。宏必須先
39、定義后調(diào)用,宏調(diào)用是用宏體替換宏調(diào)用偽指令,實參代替形參,源程序被翻譯成目標(biāo)代碼后宏定義隨之消失;而子程序的調(diào)用沒有這樣的替換操作,是以CALL指令將控制權(quán)由調(diào)用者轉(zhuǎn)給子程序,(3)目標(biāo)代碼的長度不同。由于每一次宏調(diào)用都要進行宏展開,把宏體中的內(nèi)容復(fù)制一遍,因而用宏編寫的程序在目標(biāo)代碼中會重復(fù)出現(xiàn)相同或相似的程序段,占用內(nèi)存空間大;而子程序是由CALL指令調(diào)用,無論調(diào)用多少次,子程序的目標(biāo)代碼只在最終的執(zhí)行程序中出現(xiàn)一次,目標(biāo)代碼相對較短。,(4)執(zhí)行速度不同。子程序調(diào)用時會比宏展開后的代碼多執(zhí)行CALL指令和RET指令,以及需要附加的指令進行參數(shù)傳遞,因而執(zhí)行速度稍慢。,(5)參數(shù)處理不同。
40、宏調(diào)用是以實參代替形參,參數(shù)的形式不受限制,可以是指令助記符、寄存器名、標(biāo)號等;而子程序的參數(shù)傳遞必須有確切的存放地。,編寫程序的過程中,對于程序中的重復(fù)部分,究竟是采用宏還是子程序,程序員可以權(quán)衡內(nèi)存空間、執(zhí)行速度、參數(shù)傳遞方法等各方面的因素后取舍。在大多數(shù)情況下,宏比子程序有更大的靈活性,且執(zhí)行速度快,在重復(fù)部分較短時經(jīng)常采用;,而一個已經(jīng)驗證過的子程序,可以做成目標(biāo)代碼存放在子程序庫中,在另一個程序中應(yīng)用時可不經(jīng)過匯編程序的翻譯,直接與需要使用它的程序連接在一起,從而避免宏展開后可能出現(xiàn)的語法及邏輯錯誤。,6.3.4 宏在編程中的應(yīng)用,【例6-14】設(shè)計一個程序,鍵入字符串到BUFER緩沖區(qū),然后用程序判別,如為小寫字符則轉(zhuǎn)換成大寫字符輸出。要求鍵盤字符串輸入、回車換行和屏幕單字符輸出采用宏調(diào)用實現(xiàn)。,【
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年招商局海通貿(mào)易有限公司招聘備考題庫有答案詳解
- 2026年玉環(huán)農(nóng)商銀行專業(yè)崗位招聘備考題庫及參考答案詳解1套
- 中國質(zhì)量檢驗檢測科學(xué)研究院2026年第一批編外聘用人員招聘備考題庫參考答案詳解
- 2025至2030中國養(yǎng)老康復(fù)醫(yī)療器械市場老齡化需求政策紅利及投資回報分析報告
- 2025至2030旅游行業(yè)市場格局分析及消費升級趨勢與商業(yè)機會研究報告
- 2025至2030中國抗登革熱藥物市場供需格局及風(fēng)險評估研究報告
- 太原市第三十七中學(xué)校教育集團2026年教師招聘備考題庫及一套參考答案詳解
- 2026年重慶市合川區(qū)渭沱鎮(zhèn)殘疾人專職委員招聘備考題庫及參考答案詳解1套
- 2025至2030中國智能座艙系統(tǒng)行業(yè)市場現(xiàn)狀供需人機交互及投資用戶黏性分析報告
- 2026年溫州市廣播電視監(jiān)測中心招聘臨聘合同制人員備考題庫完整答案詳解
- 2026年內(nèi)蒙古白音華鋁電有限公司招聘備考題庫帶答案詳解
- 2025年玉溪市市直事業(yè)單位選調(diào)工作人員考試筆試試題(含答案)
- 2026年游戲AB測試實施方法含答案
- 2025湖南湘西鶴盛原煙發(fā)展有限責(zé)任公司招聘擬錄用人員筆試歷年備考題庫附帶答案詳解
- 江蘇省2025年普通高中學(xué)業(yè)水平合格性考試英語試卷(含答案)
- 枕骨骨折的護理課件
- TCEC電力行業(yè)數(shù)據(jù)分類分級規(guī)范-2024
- GB/T 26951-2025焊縫無損檢測磁粉檢測
- 2025及未來5-10年高壓管匯項目投資價值市場數(shù)據(jù)分析報告
- 腹部手術(shù)圍手術(shù)期疼痛管理指南(2025版)課件
- 呼吸康復(fù)科普脫口秀
評論
0/150
提交評論