匯編原理課件第七章.ppt

上傳人:za****8 文檔編號:15895986 上傳時間:2020-09-13 格式:PPT 頁數(shù):67 大?。?84.52KB
收藏 版權申訴 舉報 下載
匯編原理課件第七章.ppt_第1頁
第1頁 / 共67頁
匯編原理課件第七章.ppt_第2頁
第2頁 / 共67頁
匯編原理課件第七章.ppt_第3頁
第3頁 / 共67頁

下載文檔到電腦,查找使用更方便

14.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《匯編原理課件第七章.ppt》由會員分享,可在線閱讀,更多相關《匯編原理課件第七章.ppt(67頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、DATA SEGMENT OPCD DW 0ABCDH WCD DW 4DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,WCD MOV AX,OPCD AND AX,0E000H MOV CL,13 SHR AX,CL MOV SI,AX MOV AX,OPCD AND AX,1F00H,MOV CL,8 SHR AX,CL MOV SI+2,AX MOV AX,OPCD AND AX,00F8H MOV CL,3 SHR AX,CL MOV SI+

2、4,AX MOV AX,OPCD AND AX,0007H MOV SI+6,AX MOV AH,4CH ;DOS function call INT 21H ;Return to DOS CODE ENDS END START,第七章 循環(huán)結構程序,7.1 循環(huán)結構程序的提出 7.2 循環(huán)結構程序的組成 7.3 循環(huán)控制指令 7.4 數(shù)據(jù)串操作指令 7.5 循環(huán)程序的控制方法 7.6 單重循環(huán)程序舉例 7.7 多重循環(huán)程序設計 7.8 循環(huán)程序的效率,,7.1 循環(huán)結構程序的提出,在許多實際應用問題中,經(jīng)常遇到某一段操作需反復進行的情況。如下面的例子。 例7.1 設內(nèi)存D

3、ATA1和DATA2開始分別存放50個無符號字數(shù)據(jù),編制程序?qū)蓚€存儲區(qū)對應字數(shù)據(jù)求和并存入SUM開始的單元。 利用順序結構編寫求和程序,首先設置源操作數(shù)和目的操作數(shù)指針,設置存放結果指針,接著從源指針指出的字單元取出數(shù)據(jù),與目的指針指出的字單元的數(shù)據(jù)相加,和存入結果的字單元,然后,修改各地址指針,使之指向下一個字數(shù)據(jù),求和,保存結果,...直至50對字數(shù)據(jù)全部求和后,程序結束。,7.1 循環(huán)結構程序的提出,1:;*****EXAM7.1.1***** 2:SSEG SEGMENT STACK 3:STACK DB 50 DUP(0) 4:SSEG ENDS 5:DATA SEG

4、MENT 6:DATA1 DW 15H,36H,45H,27BH,... 7:DATA2 DW 174H,03H,5BCH,390H,26H,... 8:SUM DW 50 DUP(0) 9:DATA ENDS 10:CSEG SEGMENT 11: ASSUME CS:CSEG,DS:DATA 12: ASSUME SS:SSEG 13:START: MOV AX,DATA 14: MOV DS,AX 15: MOV AX,SSEG 16: MOV SS,AX 17: MOV SP,SIZE STACK 18:

5、 LEA BX,DATA1 19: LEA SI,DATA2 20: LEA DI,SUM ,21: MOV AX,SI 22: ADD AX,BX 23: MOV DI,AX 24: ADD BX,2 25: ADD SI,2 26: ADD DI,2 27: MOV AX,SI 28: ADD AX,BX 29: MOV DI,AX 30: ADD BX,2 31: ADD SI,2 32: ADDDI,2 : 315: MOV AX,SI 316: ADD AX,BX 317: MOV D

6、I,AX 318: MOV AH,4CH 319: INT 21H 320:CSEG ENDS 321: END START,7.1 循環(huán)結構程序的提出,1:*****EXAM7.1.2***** : .... ;第220行與EXAM7.1.1相同 21: MOV CX,50 22:AGAIN: MOV AX,SI 23: ADD AX,BX 24: MOV DI,AX 25: ADD BX,2 26: ADD SI,2 27: ADD DI,2 28: DEC CX 29: JNZ AGAIN 30: MOV AH,4CH 31: INT 21H,,7.2

7、 循環(huán)結構程序的組成,.初始化部分 初始化部分是為循環(huán)程序做好準備、以保證循環(huán)程序能夠正常運行的部分。這一部分往往在循環(huán)程序的開頭,邏輯上先從這部分開始執(zhí)行。這一部分一般是設置地址指針的初值、計數(shù)器的初值及程序中用到的某些寄存器和某些內(nèi)存單元的初值,初始化部分只執(zhí)行一遍。 .工作部分 工作部分是循環(huán)程序的主體,它從初始化部分設置的初值開始,動態(tài)地反復執(zhí)行相同的操作。這一部分完成循環(huán)程序所要實現(xiàn)的功能,即需要重復進行的工作。 3.修改部分 這一部分與工作部分協(xié)調(diào)配合,對參加運算的數(shù)據(jù)或地址指針以及結果單元的地址指針進行恰當?shù)男薷?,以保證循環(huán)程序在循環(huán)的過程中,每次循環(huán)都能正確地得到參加

8、運算的數(shù)據(jù),并正確地存放運算結果。 .控制部分 控制部分是保證循環(huán)程序按預定的循環(huán)次數(shù)或某種預定的條件正常循環(huán),且能控制循環(huán)程序正常退出循環(huán)的部分。,,7.3 循環(huán)控制指令,1. LOOP 重復控制 2. LOOPE/LOOPZ 條件重復控制 3. LOOPNE/LOOPNZ 條件重復控制 4. JCXZ CX為0轉,,1. LOOP 重復控制,指令匯編格式:LOOP shortlabel 操作:計數(shù)寄存器CX減1,如果新的CX值不為0,則轉向shortlabel 指定的循環(huán)入口執(zhí)行;若CX=0,則退出循環(huán),執(zhí)行后續(xù)指令。 受影響的狀態(tài)標志位:沒有。 舉例:,1. LOOP 重復控制,2

9、1: MOV CX,50 22:AGAIN: MOV AX,SI 23: ADD AX,BX 24: MOV DI,AX 25: ADD BX,2 26: ADD SI,2 27: ADD DI,2 28: DEC CX 29: JNZ AGAIN 30: MOV AH,4CH 31: INT 21H,,LOOP AGAIN,,,,2. LOOPE/LOOPZ 條件重復控制,指令匯編格式: LOOPE/LOOPZ shortlabel 操作:計數(shù)寄存器CX減1,如果零標志位ZF=1且CX0時,轉向shortlabel 指定的循環(huán)入口執(zhí)行, 如果 ZF=0 或 CX=0 則執(zhí)

10、行后續(xù)指令。 受影響的狀態(tài)標志位:沒有。 例子:比較兩個數(shù)據(jù)串是否相等時。由第一個數(shù)據(jù)開始,依次比較,若發(fā)現(xiàn)比較過程中某兩個數(shù)據(jù)已不相等,不必再反復比較下去而需中途退出循環(huán)。,2.LOOPE/LOOPZ 條件重復控制,DSEGSEGMENT STR1:DBCOMPUTER STR2:DBCOMPRESS DSEGSEGMENT ASSUME CS:CSEG,DS:DSEG START:MOVAX,DSEG MOVDS,AX LEASI,STR1 LEADI,STR2 MOVCX,8 AGAIN:MOVAL,SI MOVAH,DI INCSI INCDI CMPAL,AH JNESTOP LO

11、OPAGAIN . . . CSEGENDS ENDSTART,,LOOPEAGAIN JNE STOP,,,3.LOOPNE/LOOPNZ條件重復控制,指令匯編格式: LOOPNE/LOOPNZ shortlabel 操作:計數(shù)寄存器CX減1,如果零狀態(tài)標志位ZF=0 且 CX0時,轉向 shortlabel指定循環(huán)入口執(zhí)行,如果ZF=1 或 CX=0 則執(zhí)行后續(xù)指令。 受影響的狀態(tài)標志位:沒有。 例子:在若干個數(shù)據(jù)中查找一個等于給定值的數(shù)據(jù),并不一定要查找完所有數(shù)據(jù)才能結束,當在中間找到這個數(shù)據(jù)時,就可以中途退出。此時可用此指令控制循環(huán)結構。,3.LOOPNE/LOOPNZ條件重復控制,

12、DSEGSEGMENT STR1:DBCOMPUTER CHR:DBM DSEGSEGMENT ASSUME CS:CSEG,DS:DSEG START:MOVAX,DSEG MOVDS,AX LEASI,STR1-1 MOVCX,8 MOVAL,CHR AGAIN:INCSI CMPAL,SI JEFOUND LOOPAGAIN . FOUND: . . CSEGENDS ENDSTART,LOOPNE AGAIN JE FOUND,,,,,4. JCXZ CX為0轉,指令匯編格式:JCXZ shortlabel 操作:如果計數(shù)寄存器CX為0,轉向shortlabel指出的程序入口執(zhí)行,

13、如果CX0,則執(zhí)行后續(xù)指令。 受影響的狀態(tài)位:沒有,JCXZ OK,ANDCX,CX JZOK,,,7.4 數(shù)據(jù)串操作指令,1. MOVS/MOVSB/MOVSW 2. LODS/LODSB/LODSW 3. STOS/STOSB/STOSW 4. CMPS/CMPSB/CMPSW 5. SCAS/SCASB/SCASW,1. MOVS/MOVSB/MOVSW,指令匯編格式:MOVS/MOVSB/MOVSW dstr,sstr 操作:將DS段SI指出的字節(jié)(或字)數(shù)據(jù)傳送到ES段DI指出的單元,然后根據(jù)標志位DF的情況和操作數(shù)的類型(字節(jié)或字)修改SI,DI的地址指針。具體描述如下:

14、(ES:DI)(DS:SI) SISI DIDI 受影響的標志位:沒有。 說明:1)MOVSB,MOVSW明確指出串的類型是字節(jié)串還是字串。 2)使用MOVS指令時,其后可以寫目標地址和源地址,目標地址一定為ES:DI,而源地址可以是DS:SI,CS:SI,ES:SI和SS:SI,即源地址可在非隱含段。不加類型屬性說明時,隱含為字節(jié)串操作.,1 2,1 2,DF=0 DF=1,1. MOVS/MOVSB/MOVSW,,MOVAX,1000H MOVDS,AX MOVSI,0000H MOVAX,2000H MOVES,AX MOVDI,0100H MOVCX,0100H AG:

15、MOVAL,SI MOVES:DI,AL INCSI INCDI LOOPAG . . .,,CLD AG:MOVSB,,字節(jié),1. MOVS/MOVSB/MOVSW,,MOVAX,1000H MOVDS,AX MOVSI,0000H MOVAX,2000H MOVES,AX MOVDI,0100H MOVCX,0080H AG:MOVAX,SI MOVES:DI,AX ADDSI,2 ADDDI,2 LOOPAG . . .,,CLD AG:MOVSW,,字,REP 重復前綴,使用方法及格式:REP 基本串操作指令 操作:基本串操作指令使用REP前綴時,則根據(jù)CX 值的情況重復執(zhí)

16、行后面的基本串操作指令,每執(zhí)行一次CX減1,直到CX=0為止, 意思是“當CX0時重復”。 受影響的狀態(tài)標志位:由串操作基本指令的執(zhí)行情況決定。,MOVAX,1000H MOVDS,AX MOVSI,0000H MOVAX,2000H MOVES,AX MOVDI,0100H MOVCX,0100H CLD AG:MOVSB LOOPAG . . .,REP 重復前綴,REP MOVSB,,,0080H,W,REP 重復前綴,舉例: 將1000:0000H開始的100H個數(shù)據(jù)順序下移一個位置. MOVAX,1000H MOVDS,AX MOVES,AX MOVSI,0000H MOVDI

17、,0001H MOVCX,0100H CLD REPMOVSB,MOVSI,00FFH MOVDI,0100H MOVCX,0100H STD REPMOVSB,,,2. LODS/LODSB/LODSW 取數(shù)據(jù)串,指令匯編格式:LODS/LODSB/LODSW sstr 操作:將DS段SI指出的字節(jié)(或字)數(shù)據(jù)加載到累加器AL(或AX)中,然后修改SI的地址指針。具體描述如下: AL(或AX)(DS:SI) SISI 受影響的狀態(tài)標志位: 沒有。 說明:此條指令一般不加重復前綴,因為加入重復前綴之后累加器中新加載的內(nèi)容不斷取代原來的結果,將只留下最后一個加載的元素。,1

18、 2,DF=0 DF=1,3. STOS/STOSB/STOSW 存數(shù)據(jù)串,指令匯編格式:STOS/STOSB/STOSW dstr 操作:將AL(目標串為字節(jié)串時)或AX(目標串為字串時)的內(nèi)容存儲到ES段DI指出的地址單元中,然后修改DI的地址指針。具體描述如下: (ES:DI)AL(或AX) DIDI 受影響狀態(tài)標志位:沒有。 說明:借助STOS 指令使用重復前綴可以方便地用一個常數(shù)對一塊存儲區(qū)初始化。,1 2,DF=0 DF=1,用0720H填滿B800:0000開始的2000個字. MOVAX,0B800H MOVES,AX MOVDI,0000H MOVCX,07

19、D0H ;2000 MOVAX,0720H CLD AG:STOSW LOOPAG . .,3. STOS/STOSB/STOSW 存數(shù)據(jù)串,,REP STOSW,,將1000:0000H開始的100H個字節(jié)的字符串移動到2000H:0100H開始的單元,要求在移動的過程中將所有小寫字符改變?yōu)榇髮懽址?3. STOS/STOSB/STOSW 存數(shù)據(jù)串,MOVAX,1000H MOVDS,AX MOVSI,0000H MOVAX,2000H MOVES,AX MOVDI,0100H MOVCX,0100H AG:MOVAL,SI CMPAL,a JBOK CMPAL,z JAOK SUBAL,

20、20H OK:MOVES:DI,AL INCSI INCDI LOOPAG .,,CLD AG:LODSB CMPAL,a JBOK CMPAL,z JAOK SUBAL,20H OK:STODB LOOPAG .,,4.CMPS/CMPSB/CMPSW 串比較,指令匯編格式:CMPS/CMPSB/CMPSW dstr, sstr 操作:將DS段SI指出的數(shù)據(jù)與ES段DI指出的數(shù)據(jù)相減比較,產(chǎn)生標志位的變化,然后修改SI,DI的地址指針。具體描述如下: (DS:SI)-(ES:DI) SISI , DIDI 受影響的狀態(tài)標志位:OF,S

21、F,ZF,AF,PF,CF 說明:此指令只改變標志,并不回送結果, 因而不改變數(shù)的原始值。,1 2,1 2,DF=0 DF=1,4.CMPS/CMPSB/CMPSW 串比較,舉例:比較兩個數(shù)據(jù)塊是否相同。,MOVAX,1000H MOVDS,AX MOVSI,0000H MOVAX,2000H MOVES,AX MOVDI,0100H MOVCX,0100H AG:MOVAL,SI CMPAL,DI JNEEXIT1 INCSI INCDI LOOPAG . . EXIT1: .,CLD AG:CMPSB JNEEXIT1 LOOPAG . . EXIT1: .,,,,5.SCAS/S

22、CASB/SCASW 串搜索,指令匯編格式:SCAS/SCASB/SCASW dstr 操作: 將累加器AL(或AX)的值與ES段DI指出的元素相減比較,然后修改DI 的地址指針。 AL(或AX)-(ES:DI) DIDI 受影響的狀態(tài)標志位:OF,SF,ZF,AF,PF,CF 說明:1)此指令隱含指定AX或AL的值作為一個操作數(shù),將其與 ES:DI 指出的數(shù)據(jù)串元素相比較,用以實現(xiàn)在一個串中對給定值的搜索或查找。當給定串為字節(jié)串時與AL中的內(nèi)容相比較;當給定串為字串時,AX中的內(nèi)容相比較。 2)此指令只改變標志,不回送結果。,1 2,5.SCAS/SCASB/SCASW

23、串搜索,DSEGSEGMENT STR1:DBCOMPUTER CHR:DBM DSEGENDS ESEGSEGMENT ASSUME CS:CSEG,DS:DSEG START:MOVAX,DSEG MOVDS,AX LEASI,STR1 MOVCX,8 MOVAL,CHR AGAIN:CMPAL,SI INCSI JEFOUND LOOPAGAIN . FOUND: . . CSEGENDS ENDSTART,,START:MOVAX,DSEG MOVES,AX LEADI,STR1 MOVCX,8 MOVAL,CHR CLD AGAIN:SCASB JEFOUND LOOPAGAIN .

24、 FOUND: . .,5.SCAS/SCASB/SCASW 串搜索,DSEGSEGMENT STR1:DBCOMPUTER CHR:DBM DSEGENDS CSEGSEGMENT ASSUME CS:CSEG,DS:DSEG START:MOVAX,DSEG MOVES,AX LEADI,STR1 MOVCX,8 MOVAL,CHR CLD AGAIN:SCASB JEFOUND LOOPAGAIN . FOUND: . . CSEGENDS ENDSTART,REPNESCASB JEFOUND . FOUND: . .,,,,條件重復前綴REPZ/REPE和REPNZ/REPNE,使用

25、方法及格式:這兩條條件重復前綴的使用方法和格式與REP相同。 操作:加有這兩條前綴的串操作指令,在循環(huán)時不僅檢查CX的值是否為0,還檢查ZF標志位是否是1,以CX和ZF的情況共同決定是否重復執(zhí)行后面的基本串操作指令。 REPZ/REPE為CX0且ZF=1時重復執(zhí)行基本操作, CX=0或ZF=0時停止重復。 REPNZ/REPNE為CX0且ZF=0時重復執(zhí)行基本操作, CX=0或ZF=1時停止重復。 受影響狀態(tài)標志位:由基本串操作指令的執(zhí)行情況決定。,7.5 循環(huán)程序的控制方法,7.5.1 計數(shù)法 7.5.2 寄存器終值法 7.5.3 條件控制法,7.5.1 計數(shù)法,此方法適用于循環(huán)次數(shù)已知

26、的循環(huán)程序,其特點是簡單方便。計數(shù)法又分為正計數(shù)法和倒計數(shù)法兩種。 (1)正計數(shù) MOVCX,0 : AGAIN: INCCX CMPCX,N JNEAGAIN : 正計數(shù)法沒有專門的指令,狀態(tài)標志位在退出時,會因計數(shù)的比較而變化. (2)倒計數(shù) MOV CX,N : AGAIN: : LOOP AGAIN,(1)正計數(shù),將計數(shù)器的初值設置為0,每執(zhí)行一遍工作部分,計數(shù)器值增1,然后與規(guī)定的已知循環(huán)次數(shù)比較,若相等,則退出循環(huán),否則, 繼續(xù)執(zhí)行循環(huán)體。 舉例:計算S=i,i=0,100,MOVAX,0 MOVBX,0 AG:ADDAX,BX INCBX CMPBX,100 JBEAG,2.倒計

27、數(shù),將計數(shù)器的初值設置為規(guī)定的循環(huán)次數(shù),每執(zhí)行一遍工作部分,計數(shù)器值減1,測試是否為0,若為0則退出循環(huán),否則繼續(xù)執(zhí)行循環(huán)體。 由于正計數(shù)法與倒計數(shù)法邏輯上沒有任何區(qū)別,又由于倒計數(shù)法有專門指令,因此用得較多。 例7.2 統(tǒng)計由DATA開始的字節(jié)數(shù)據(jù)塊中負元素的個數(shù),數(shù)據(jù)個數(shù)在COUNT單元,統(tǒng)計結果存入RLT單元。,2.倒計數(shù)-例7.2,1:;*****EXAM7.2***** 2:DSEGSEGMENT 3:DATADB-1,3,-5,.... 4:COUNT DW50 5:RLTDW0 6:DSEGENDS 7:CSEGSEGMENT 8:ASSUMECS:CSEG,DS:DSEG 9:

28、START:MOVAX,DSEG 10:MOVDS,AX 11:MOVBX,OFFSET DATA 12:MOVCX,COUNT 13:MOVDX,0 14:AG1:MOVAL,BX 15:ANDAL,AL,16:JNSPLUS 17:INCDX 18:PLUS:INCBX 19:DECCX 20:JNZAG1 21:MOVRLT,DX 22:MOVAH,4CH 23:INT21H 24:CSEGENDS 25:ENDSTART,7.5.2 寄存器終值控制法,此方法類似于計數(shù)法,用一個寄存器存放初始值,每執(zhí)行一次循環(huán)體該寄存器的值都按某種規(guī)律而有所變化,直到該寄存器值達到某一終值退出循環(huán)。與計

29、數(shù)法不同之處是: 1)寄存器的值本質(zhì)上不一定是循環(huán)的次數(shù),可能是一個操作數(shù)的地址,也可能是時間的一種表示或程序中要使用的其他數(shù)據(jù)。顯然,這種控制方法比計數(shù)法適用問題更為廣泛。 2)控制寄存器的初值或終值也不一定是0或循環(huán)計數(shù)值;所使用的寄存器也不一定限于CX。 例7.3 內(nèi)存DATA開始存放若干個單字節(jié)無符號數(shù),數(shù)據(jù)末地址為DTEND,編制程序?qū)⑵渲凶畲髷?shù)送入MAX單元。,7.5.2 寄存器終值控制法-例7.3,2:DSEGSEGMENT 3:DATADB15H,26H,03H,8AH,11H,... 4:DTENDDB62H 5:MAXDB0 6:DSEGENDS 7:SSEGSEGMENT

30、 STACK 8:STACKDB50 DUP(0) 9:SSEGENDS 10:CSEGSEGMENT 11:ASSUMECS:CSEG,DS:DSEG 12:ASSUMESS:SSEG 13:SMAX:MOVAX,DSEG 14:MOVDS,AX 15:MOVAX,SSEG 16:MOVSS,AX 17:MOVSP,SIZE STACK,18:LEASI,DATA 19:MOVAL,SI;取第一個數(shù)據(jù) 20:AG:INCSI;指向下一個數(shù)據(jù) 21:CMPSI,OFFSET DTEND 22:JALOAD;指針大于末址 23:CMPAL,SI;兩數(shù)比較 24:JAAG;AL中數(shù)大,轉 25:M

31、OVAL,SI;大數(shù)AL 26:JMPAG;轉,繼續(xù)執(zhí)行 27:LOAD:MOVMAX,AL;保存最大值 28:MOVAH,4CH 29:INT21H 30:CSEGENDS 31:ENDSMAX,7.5.3 條件控制法,在應用問題中常有循環(huán)次數(shù)未知的情況。在循環(huán)次數(shù)未知的程序中,雖然有時循環(huán)次數(shù)可以通過某種方法求得,但比較麻煩;而有時循環(huán)程序的循環(huán)次數(shù)根本無法求得。如有些用有限次計算代替無限計算過程的問題,用循環(huán)程序求解時就屬于循環(huán)次數(shù)未知的程序,其控制方法大多是用所給的精度允許誤差來控制,把允許誤差作為控制條件,將前后兩次計算結果的誤差與允許誤差相比較,如果滿足要求則退出循環(huán),否則繼續(xù)循環(huán)

32、。 這種利用問題本身的結束條件來控制循環(huán)結束的方法叫條件控制法。此方法適用于循環(huán)次數(shù)未知的情形,比前兩種方法更具一般性,因而也稍復雜。LOOP指令對完成此控制方法無能為力,需要用條件轉移指令來實現(xiàn)此控制方法。 例7.4 內(nèi)存DATA字單元存放一個完全平方數(shù),編制程序求其平方根并存入ROOT字單元。,7.5.3 條件控制法-例7.4,算法: 1=1=12 1+3=4=22 1+3+5=9=32 1+3+5+7=16=42 1+3+5+7+9=25=52 ,現(xiàn)在已知N,求N的平方根i,則可以從N中依次減去從1開始的連續(xù)奇數(shù),直到N為0時,減去奇數(shù)的個數(shù)i即為N的平方根。,7.5.3 條件控制法-例

33、7.4,1:;*****EXAM7.4***** 2:DSEGSEGMENT 3:DATADW13924 4:ROOTDW0 5:DSEGENDS 6:SSEGSEGMENT PARA STACK SSEG 7:STACKDB50 DUP(0) 8:SSEGENDS 9:CSEGSEGMENT 10:ASSUMECS:CSEG,DS:DSEG 11:ASSUMESS:SSEG 12:SQRT:MOVAX,DSEG 13:MOVDS,AX 14:MOVAX,SSEG 15:MOVSS,AX 16:MOVSP,SIZE STACK,17:XORCX,CX;計數(shù)器清零 18:XORAX,AX;設i的

34、初值為0 19:MOVDX,DATA;被開方數(shù)送DX 20:AG:ANDDX,DX;被開方數(shù)為零嗎 21:JZLRT;被開方數(shù)為零,轉 22:MOVBX,AX;i值送BX 23:SHLBX,1;乘2 24:INCBX;形成奇數(shù) 25:SUBDX,BX;被開方數(shù)減去奇數(shù) 26:INCCX;計數(shù)器值增1 27:INCAX;i值增1 28:JMPAG;繼續(xù)工作 29:LRT:MOVROOT,CX;保存結果 30:MOVAH,4CH 31:INT21H 32:CSEGENDS 33:ENDSQRT,7.5.3 條件控制法-例7.4,1:;*****EXAM7.4***** 2:DSEGSEGMENT

35、3:DATADW13924 4:ROOTDW0 5:DSEGENDS 6:SSEGSEGMENT PARA STACK SSEG 7:STACKDB50 DUP(0) 8:SSEGENDS 9:CSEGSEGMENT 10:ASSUMECS:CSEG,DS:DSEG 11:ASSUMESS:SSEG 12:SQRT:MOVAX,DSEG 13:MOVDS,AX 14:MOVAX,SSEG 15:MOVSS,AX 16:MOVSP,SIZE STACK,,17:XORCX,CX;計數(shù)器清零 18:XORAX,AX;設i的初值為0 19:MOVDX,DATA;被開方數(shù)送DX 20:AG:ANDDX

36、,DX;被開方數(shù)為零嗎 21:JZLRT;被開方數(shù)為零,轉 22:MOVBX,AX;i值送BX 23:SHLBX,1;乘2 24:INCBX;形成奇數(shù) 25:SUBDX,BX;被開方數(shù)減去奇數(shù) 26:INCCX;計數(shù)器值增1 27:INCAX;i值增1 28:JMPAG;繼續(xù)工作 29:LRT:MOVROOT,CX;保存結果 30:MOVAH,4CH 31:INT21H 32:CSEGENDS 33:ENDSQRT,,,,AX,,,7.6 單重循環(huán)程序舉例,例7.5 自內(nèi)存 DATA 單元開始存放若干個無符號字節(jié)數(shù)據(jù),數(shù)據(jù)個數(shù)在COUNT 單元存放。編制程序分別計算其中奇數(shù)、偶數(shù)及被4 整除的

37、數(shù)的和,并分別存入 ODDSUM ,EVENSM和FORSUM單元。設各類和不超過16位二進制數(shù),可用一個字表示或存放。 算法: 奇數(shù):數(shù)據(jù)的最低位為1 偶數(shù):數(shù)據(jù)的最低位為0 被4整除的數(shù):數(shù)據(jù)的最低位和次低位均0,7.6 單重循環(huán)程序舉例-例7.5,1:;*****EXAM7.5***** 2:DSEGSEGMENT 3:DATA DB15H,26H,03H,64H 4: DB8AH,0AAH,24H,48H 5:COUNTDW08 6:ODDSUM DW0 7:EVENSM DW0 8:FORSUM DW0 9:DSEG ENDS 10:SSEGSEGMENT STACK 11:STAC

38、K DB 20 DUP(0) 12:SSEGENDS 13:CSEGSEGMENT 14:ASSUMECS:CSEG,DS:DSEG 15:ASSUMESS:SSEG 16:FSUM: MOVAX,DSEG;設置數(shù)據(jù)段地址 17:MOV DS,AX 18:MOV AX,SSEG;設置堆棧段地址 19:MOVSS,AX 20:MOV SP,SIZE STACK,7.6 單重循環(huán)程序舉例-例7.5,21:LEA SI,DATA;設置地址指針 22:MOV CX,COUNT;計數(shù)值送CX 23:XORAX,AX;AX清0 24:XOR BX,BX;清存和寄存器 25:XOR DX,DX 26:XOR

39、 DI,DI 27:AG:MOV AL,SI;取數(shù)據(jù) 28:TESTAL,01;測試最低位 29:JZEVNS;偶數(shù),轉 30:ADDBX,AX;奇數(shù),累計和 31:JMPCHNT 32:EVNS:ADDDX,AX;偶數(shù),累計和 33:TEST AL,03;能否被4整除 34:JNZ CHNT;不能被4整除 35:ADD DI,AX ;能,累計和 36:CHNT:INCSI ;指向下個數(shù)據(jù) 37:LOOP AGAIN ;計算完?未完繼續(xù) 38:MOVODDSUM,BX;保存結果 39:MOV EVENSM,DX 40:MOV FORSUM,DI 41:MOV AH,4CH 42:INT21H

40、 43:CSEGENDS 44:ENDFSUM,例7.6 已知某件密碼由英文字母A,B,C,D,,Z組成,最后以美元符號結束,且以ASCII碼形式存在內(nèi)存CIPHER開始的單元。 統(tǒng)計各字母在此件密碼中出現(xiàn)的次數(shù),并依次存入CHRFQ開始的內(nèi)存單元。 為了統(tǒng)計各字母出現(xiàn)的次數(shù),先把CHRFQ開始的26個單元清0,每當出現(xiàn)某一字母,則在相應的內(nèi)存單元加1,所有密碼全部測試后,CHRFQ開始的單元依次存放了A,B,C,,Z在密碼文件中出現(xiàn)的次數(shù)。 如何判斷一個密碼文字是哪個字母,首先想到的一定是從密碼中取出一個字母與字母AZ逐個比較,那么每個字母平均比較次數(shù)為26/2次,顯然是比較麻煩,

41、程序冗長,執(zhí)行時間長。,7.6 單重循環(huán)程序舉例-例7.6,7.6 單重循環(huán)程序舉例-例7.6,由于字母相鄰的差都是1, 因此可以通過簡單的計算找到該字母對應的內(nèi)存單元的地址,對該單元的內(nèi)容加1即可。例如取得字母B,其ASCII碼為42H,將42H-A,結果為1,與CHRFQ的地址相加,即得到CHRFQ+1,就是對該單元操作。,7.6 單重循環(huán)程序舉例-例7.6,1:;*****EXAM7.6***** 2:SSEG SEGMENT STACK 3:STACK DB 50 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6:CIPHER DBBVDCJKJK

42、LHTVUIPRERTZEQ 7: DBHKAXUERTJKLHFSDSAPAWBEQ 8: DBDHFSBNMHMVRTUDPOIHFXJMO$ 9:CHRFQ DB26 DUP(?) 10:DSEG ENDS 11:CSEG SEGMENT 12: ASSUME CS:CSEG,DS:DSEG 13: ASSUME SS:SSEG,ES:DSEG 14:DECPHR: MOV AX,DSEG;設置數(shù)據(jù)段 15: MOV DS,AX 16: MOV ES,AX 17: MOV AX,SSEG ;設置堆棧段地址 18: MOV SS,AX

43、19: MOV SP,SIZE STACK;設堆棧指針,7.6 單重循環(huán)程序舉例-例7.6,20: LEA DI,CHRFQ ;將結果單元清0 21: MOV CX,26 22: CLD 23: XOR AL,AL 24: REP STOSB 25: LEA SI,CIPHER ;密碼首址送SI 26:AG: LEA DI,CHRFQ ;結果單元首址送DI 27: MOVAL,SI ;取一密碼字符 28: CMP AL,$ ;是結束符嗎? 29: JZ STOP ;是,轉停機 30: SUB AL,41H ;代碼減41H 31: XOR AH,AH

44、;高位部分清零. 32: ADD DI,AX ;形成結果單元地址 33: INC BYTE PTRDI;出現(xiàn)次數(shù)增1 34: INC SI ;SI指向下一個代碼 35: JMP AG ;繼續(xù)工作 36:STOP: MOV AH,4CH 37: INT 21H 38:CSEG ENDS 39: END DECPHR,7.6 單重循環(huán)程序舉例-例7.6,20: LEA DI,CHRFQ 21: MOV CX,26 22: CLD 23: XOR AL,AL 24: REP STOSB 25: LEA SI,CIPHER 26:AG: LEA DI,CHR

45、FQ 27: MOVAL,SI 28: CMP AL,$ 29: JZ STOP 30: SUB AL,41H 31: XOR AH,AH 32: ADD DI,AX 33: INC BYTE PTRDI 34: INC SI 35: JMP AG 36:STOP: MOV AH,4CH 37: INT 21H 38:CSEG ENDS 39: END DECPHR,AG:MOVBL,SI CMP BL,$ JZ STOP SUB BL,A XOR BH,BH INC CHRFQBX INC SI,,,,7.7 多重循環(huán)程序設計,如果一個循環(huán)程序的循環(huán)

46、體內(nèi)還包含有一個或多個循環(huán)結構的程序,那么這個程序稱為雙重或多重循環(huán)結構程序。我們先用軟件延時程序來說明多重循環(huán)程序的結構。 SOFTDLY:MOV BL,10 DELAY: MOV CX,2801 WAIT0: LOOP WAIT0 ;內(nèi)循環(huán)延時10ms DEC BL JNZ DELAY 此程序每次內(nèi)循環(huán)時,CX由2801減至零,BL維持不變。外循環(huán)進行10遍。 此程序雖然簡單,但是其結構是雙重循環(huán)。,7.7 多重循環(huán)程序設計,,例7.7 內(nèi)存DATA開始存放100個單字節(jié)數(shù)據(jù)。編寫程序統(tǒng)計這些數(shù)據(jù)內(nèi)“0”和“1”個數(shù)相等的數(shù)據(jù)有多少,將結果存入NUMB單元。完成此例

47、需要一個數(shù)據(jù)一個數(shù)據(jù)地檢查0和1是否相等,相等時則計數(shù)加1,直到100個數(shù)據(jù)檢查完畢。,7.7 多重循環(huán)程序設計,,1:;*****EXAM7.7***** 2:SSEG SEGMENTSTACK 3:STACK DW 50 DUP(0) 4:SSEG ENDS 5:DSEG SEGMENT 6:DATA DB 15H,27H,94H ;共100個數(shù) 7: DB 11H,3B,48H,... 8:NUMB DB 0 9:DSEG ENDS 10:CSEG SEGMENT 11: ASSUME CS:CSEG,DS:DSEG 12: ASSUME SS:SSE

48、G 13:START: MOV AX,DSEG 14: MOV DS,AX 15: MOVAX,SSEG 16: MOVSS,AX 17: MOVSP,SIZE STACK,7.7 多重循環(huán)程序設計,,18:MOVSI,OFFSET DATA 19:MOVCL,100 20:XORAL,AL 21:RPT2:MOVCH,08H 22:XORBH,BH 23:MOVAH,SI 24:RPT1:RORAH,1 25:JCCHT1 26:INCBH 27:CHT1:DECCH 28:JNZRPT1 29:CMPBH,04 30:JNZCHT2 31:INCAL 32:CHT2:IN

49、CSI 33:DECCL 34:JNZRPT2 35:MOVDNUMB,AL 36:MOVAH,4CH 37:INT21H 38:CSEGENDS 39:END START,7.7 多重循環(huán)程序設計,,18:MOVSI,OFFSET DATA 19:MOVCL,100 20:XORAL,AL 21:RPT2: MOVCH,08H 22:XORBH,BH 23:MOVAH,SI 24:RPT1: RORAH,1 25:JCCHT1 26:INCBH 27:CHT1:DECCH 28:JNZRPT1 29:CMPBH,04 30:JNZCHT2 31:INCAL 32:CHT2:INCSI 33

50、:DECCL 34:JNZRPT2 35:MOVDNUMB,AL 36:MOVAH,4CH 37:INT21H 38:CSEGENDS 39:ENDSTART,,,,7.8 循環(huán)程序的效率,循環(huán)程序的工作部分、修改部分和控制部分,一般都要反復執(zhí)行多次,因此,采用循環(huán)程序處理問題時,若能使這幾部分的指令條數(shù)減少;采用長度短、執(zhí)行時間短的指令,就會大大縮短整個程序的執(zhí)行時間,提高程序的效率。 所謂使用的指令條數(shù)盡可能少, 一方面是選擇好的算法,另一方面是算法確定后,實現(xiàn)算法時少用指令。 所謂使用指令的長短, 就是實現(xiàn)某種功能時,可以用多種不同的指令實現(xiàn),而這些不同指令的長度也不同,指令長度越

51、短,控制器和內(nèi)存打交道的次數(shù)越少,就可以減少時間。,7.8 循環(huán)程序的效率,例:將寄存器AX清0, 可以采用下述兩種不同的方法: XOR AX,AX ;2個時鐘周期,2個字節(jié) MOV AX,0 ;4個時鐘周期,3個字節(jié) 例:將AL,BL,CL賦同樣的數(shù)值,可用下述兩個不同程序段實現(xiàn): MOV AL,DATA ; DATA為字節(jié)單元,3個字節(jié),10個周期 MOV BL,DATA ;4個字節(jié),14個時鐘周期 MOV CL,DATA ;4個字節(jié),14個時鐘周期 MOV AL,DATA ;3個字節(jié),10個時鐘周期 MOV BL,AL ;2個字節(jié),2個時鐘周期 MOV CL,AL ;2

52、個字節(jié),2個時鐘周期,7.8 循環(huán)程序的效率,例7.8 計算S= ((Xi+Y)*Z),已知Xi,Y, Z為單字節(jié)無符號數(shù),Xi存放在ARGX 開始的單元,Y,Z分別存于ARGY,ARGZ單元。 直接計算, 200次加,100次乘 變形為:S= Z* Xi+100*Y*Z ;101次加,3次乘 變形為:S= Z* ( Xi+100*Y) ;101次加,2次乘 ,100,i=1,i=1,100,100,i=1,7.8 循環(huán)程序的效率-例7.8, ,1:;*****EXAM7.8***** 2:SSEG SEGMENT STACK 3:STACK DB 50 DUP(0) 4:SSEG EN

53、DS 5:DSEG SEGMENT 6:ARGX DB 15,26,03,64,80,11,24,48... 7:ARGY DB 34 ; Y 8:ARGZ DB 21 ;Z 9:SUM DW 0,0 ;保存結果單元 10:DSEG ENDS 11:CSEG SEGMENT 12: ASSUME CS:CSEG,DS:DSEG 13: ASSUME SS:SSEG 14:CALT:MOV AX,DSEG 15: MOV DS,AX 16: MOV AX,SSEG 17: MOV SS,AX 18: MOV SP,LENGTH

54、STACK 19: MOV SI,OFFSET ARGX,7.8 循環(huán)程序的效率-例7.8, ,18: MOV SP,LENGTH STACK 19: MOV SI,OFFSET ARGX 20: MOV CX,99 ;設置加法次數(shù) 21: XOR BH,BH ;高字節(jié)清零 22: MOV BL,SI ;取第一個數(shù)據(jù) 23:AGAIN:INC SI ;修改地址指針 24: ADD BL,SI ;與下一數(shù)值相加 25: ADC BH,0 ;加進位 26: LOOP AGAIN ;未完,繼續(xù) 27: MOV AL,100 ;取100 28:

55、 MUL ARGY ;計算100*Y 29: ADD AX,BX ;與累加和相加 30: MOV BL,ARGZ ;取Z 31: XOR BH,BH ;擴展Z為雙字長 32: MUL BX ;計算最終結果 33: MOV SUM,AX ;保存結果 34: MOV SUM+2,DX 35: MOV AH,4CH 36: INT 21H 37:CSEG ENDS 38: END CALT,,習題,已知一組無符號的字數(shù)據(jù),存放在LIST開始的單元,數(shù)據(jù)的個數(shù)存放在CNT字單元中,編程找出這組數(shù)中的最大值,并存放在MAX單元。,DSEG SEGMENT

56、 LIST DW1,200,30,400,0,7,4000 CNTDW7 MAXDW? DSEGENDS CSEGSEGMENT ASSUME CS:CSEG,DS:DSEG FMAX:MOV AX,DSEG MOV DS,AX LEASI,LIST MOVCX,CNT DEC CX MOV AX,SI,AGAIN:CMPAX,SI+2JAESMALLMOVAX,SI+2 SMALL:INC SIINCSI LOOPAGAIN MOVMAX,AX MOV AX,4C00H INT21H CSEG ENDS ENDFMAX,DSEG SEGMENT LIST DW1,200,30,400,0,7,4000 CNTDW7 MAXDW? DSEGENDS CSEGSEGMENT ASSUMECS:CSEG,DS:DSEG FMAX:MOV AX,DSEG MOV DS,AX LEASI,LIST MOVCX,CNT CLD LODSW DEC CX AGAIN:CMPAX,SIMOVMAX,AX JAESMALLMOV AX,4C00H MOVAX,SIINT21H SMALL:INC SICSEG ENDS INCSIENDFMAX LOOPAGAIN,

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!