h3-23 分支與循環(huán)2_第1頁
h3-23 分支與循環(huán)2_第2頁
h3-23 分支與循環(huán)2_第3頁
h3-23 分支與循環(huán)2_第4頁
h3-23 分支與循環(huán)2_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、132 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 321 簡單分支程序簡單分支程序 (判斷條件在兩個(gè)以內(nèi)) 對(duì)兩個(gè)操作數(shù)進(jìn)行算術(shù)或邏輯運(yùn)算,然后根據(jù)運(yùn)算后結(jié)果對(duì)標(biāo)志位的影響來產(chǎn)生分支。2 (1)用比較指令實(shí)現(xiàn)用比較指令實(shí)現(xiàn)。 CMP DEST,SRC ;比較兩個(gè)操作數(shù) JE EQUL EQUL: (2) 用測試指令實(shí)現(xiàn)用測試指令實(shí)現(xiàn)。 TEST DEST,SRC ;邏輯與測試 JNZ ONE ONE: 3 (3) 用邏輯指令實(shí)現(xiàn)用邏輯指令實(shí)現(xiàn)。 SHR DEST,CL ;對(duì)DEST進(jìn)行邏輯右移 JC NEXT ;CF=1,轉(zhuǎn)移到NEXT NEXT: 4 例3.26 編程實(shí)現(xiàn)將鍵盤輸入的小寫字母轉(zhuǎn)換成大寫后輸出

2、,程序流程如圖3.2所示。 MODEL SMALL (az的ASC 碼61H 7AH,A Z的ASC 碼41 H 5AH) DATA BLOCK DB ERROR!,0DH,0AH,$ CODE STARTUP MOV AH,1 ;讀鍵入字符 INT 21H CMP AL,a ;判字符小于a JB NEXT CMP AL,z ;判字符大于z? JA NEXT AND AL,11011111B ;將小寫字母轉(zhuǎn)換 MOV DL,AL ; 成大寫字母 MOV AH,02 ;顯示輸出 INT 21H JMP DONE NEXT:LEA DX,BLOCK ;非小寫字母處理 MOV AH,9 INT 21

3、H 圖3.2 例3.26 程序流程 DONE :EXIT END5DATE1 SEGMENT A DW ? B DW ? C DW ?DATE1 ENDSCODE1 SEGM MOV AX, A ADD AX, B JLE _ELSE ;小于等于0 TEST C, 1;C%2=0?即看C的最低位是否為0 JNZ _ELSE MOV A, 62 JMP NEXT_ELSE:MOV A, 21NEXT:CODE1 ENDS 例 把下列C語言的語句改寫成等價(jià)的匯編語言程序段(不考慮運(yùn)算過程中的溢出),其中:變量a、b和c 都是有符號(hào)的整型(int)變量。if (a+b0 &c%2= =0)

4、a=62;else a=21; 6322 復(fù)雜分支程序復(fù)雜分支程序 在滿足一定條件的前提下,可以采用跳轉(zhuǎn)表法,方便且高效的實(shí)現(xiàn)多向分支。圖3.4 多路條件判斷程序流程 7 跳轉(zhuǎn)表算法:在存儲(chǔ)器設(shè)置一地址表,將多個(gè)分支程序的地址順序存放在表中,以供程序在條件選擇某一分支程序時(shí)使用。 存儲(chǔ)器中地址表設(shè)置如下: TAB DW SUB1 ;或者DD SUB2 SUB3 SUBn 8 在變量名為TAB作為首地址的表中,SUBi 為第i路分支程序的標(biāo)號(hào)。 如果TAB定義為字類型時(shí),存放在表中的是每一路分支程序標(biāo)號(hào)的16位偏移地址; 如果TAB定義為雙字類型,可以表示為32位模式下的偏移地址或16位模式下的

5、偏移地址和段基址。 根據(jù)分支條件確定對(duì)應(yīng)分支程序的入口地址在地址表中的位置(序號(hào)),轉(zhuǎn)去執(zhí)行分支程序。 9例3.28 接收單鍵命令A(yù)G,根據(jù)命令進(jìn)行相應(yīng)的處理,否則不作處理。程序流程如圖3.5所示。 MODEL SMALL 586 DATA TAB DD LAB0 ;命令A(yù)處理程序地址 LAB1 ;命令B處理程序地址 LAB6 ;命令G處理程序地址 CODE STARTUP MOV AH,1 ;接收鍵入字符 INT 21H CMP AL,A ;字符A? JB DONE CMP AL,G ;字符G? JA DONE SUB AL,A ;將字符AG轉(zhuǎn)變成序號(hào)06 AND EAX,0000000FH

6、 JMP TABEAX4 ;轉(zhuǎn)不同分支程序 LAB0: ;命令A(yù)處理程序 JMP DONE LAB1: ;命令B處理程序 JMP DONE LAB6: ;命令G處理程序 DONE: EXIT END10例 用地址轉(zhuǎn)移表實(shí)現(xiàn)下列C語言語句,其中變量a和b是有符號(hào)的整型(int)變量: switch (a%8) case0: b=32; break; case1: case2: b=a+43; break; case3: b=2*a; break; case4: b-; break; case5: case6: case7: printf(Function 5_6_7); break;11 .MO

7、DEL SMALL .DATA A DW ? B DW ?Table DW case0, case12, case12,case3, case4, case567, case567, case567MSG DB Function 5_6_7$.CODE.STARTUP MOV AX, A MOV BX, AX AND BX, 7 ;得到BX的低3位二進(jìn)制數(shù), 實(shí)現(xiàn)a%8的計(jì)算 SHL BX, 1 ;地址表是字類型,其下標(biāo)要乘2JMP TableBX ;利用地址表實(shí)現(xiàn)多路轉(zhuǎn)移12case0:MOV B,32JMP nextCase12:ADD AX,43MOV B,AXJMP nextCase3

8、:SHL AX,1MOV B,AXJMP nextCase4:DEC BJMP nextCase567:LEA DX,MSGMOV AH,9INT21H JMP next next: .EXIT.END13用地址表實(shí)現(xiàn)多路轉(zhuǎn)移的關(guān)鍵在于: 轉(zhuǎn)移入口的地址表和轉(zhuǎn)移情況可整數(shù)化。 如果這兩個(gè)要求有一個(gè)不滿足或很難構(gòu)造,則無法使用該方法。 1433 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 331 單重循環(huán)程序單重循環(huán)程序 單重循環(huán)程序按照判斷循環(huán)條件的流程不同可分為兩類結(jié)構(gòu)。 一REPEATUNTIL結(jié)構(gòu):先執(zhí)行程序再判斷循環(huán)條件(至少執(zhí)行一次)。 二WHILEDO結(jié)構(gòu):先判斷循環(huán)條件,滿足循環(huán)條件才進(jìn)入循環(huán)體。

9、 圖3.6 REPEATUNTIL循環(huán)程序結(jié)構(gòu) 圖3.7 WHILEDO循環(huán)程序結(jié)構(gòu)15 例3.29 REPEATUNTIL循環(huán)結(jié)構(gòu)程序?qū)崿F(xiàn)舉例。 1 MOV CX,COUNT ;設(shè)置循環(huán)初值 AGAIN: ;循環(huán)程序入口 LOOP AGAIN ;循環(huán)控制 2 MOV CL,COUNT ;設(shè)置循環(huán)初值 AGAIN: DEC CL ;計(jì)數(shù)器減1 JNZ AGAIN ;循環(huán)控制 16 例3.30 WHILEDO循環(huán)結(jié)構(gòu)程序?qū)崿F(xiàn)舉例。 MOV CX,COUNT ;設(shè)置循環(huán)初值 AGAIN: JCXZ NEXT DEC CX JMP AGAIN NEXT: 17 例3.31 從鍵盤輸入21個(gè)字符,按鍵

10、入次序?qū)ふ易值漤樞蜃畲蟮淖址?,并顯示輸出(不區(qū)分大小寫)。 分析:分析:判斷 ASCII碼值大小時(shí),小寫字符 ASCII碼減去20H參與比較(41H 5AH和61H7AH)。 18 MODELSMALL DATA BUF DB 21,?,21DUP(?) BLOCK DB 0AH,0DH,?,$ CODE STARTUP MOV DX,OFFSET BUF ;鍵入字符串 MOV AH,0AH INT 21H LEA BX,BUF+2 ;BX第一個(gè)字符地址 MOV CX,BUF+1 ;CX字符串長度 DEC CX MOV AL,BX ;緩沖區(qū)第一個(gè)字符送 AL AND AL,11011111B

11、;小寫字符 ASCII碼減20H MOV SI,BX ;緩沖區(qū)第一個(gè)字符地址送 SI19AGAIN:INC BX MOV DL,BX ;緩沖區(qū)字符送 DL AND DL,11011111B CMP AL,DL ;比較兩字符大小 JAE NEXT XCHG AL,DL ;大數(shù)存 AL中 MOV SI,BX ;大數(shù)地址送 SI NEXT:LOOP AGAIN MOV DL,SI ;最大字符送 DL MOV BLOCK+2,DL MOV DX,OFFSET BLOCK;顯示輸出 MOV AH,9 INT 21H EXIT END 20例:把數(shù)組score的平均值平均值(取整)存入字變量Average

12、中,數(shù)組以負(fù)數(shù)為結(jié)束標(biāo)志。.model small.data score dw 90,95,54,65,36,78,66,0,66,22,-1Average dw 0.code.startupXOR AX,AXXOR DX,DX ;用(DX:AX)保存數(shù)組元素之和XOR CX,CX ;用CX保存數(shù)組元素個(gè)數(shù)LEA SI,score ;用指針SI訪問整個(gè)數(shù)組21again: MOV BX,SICMP BX,0JL overADD AX,BXADC DX,0 ;求和INC CX ;計(jì)數(shù)ADD SI,2 ;地址增量JMP againover:JCXZ exit;防止零作除數(shù)(空數(shù)組)DIV CX ;

13、求平均值MOV Average,AX exit: .EXITEND22 例3.32 在BLOCK緩沖區(qū)中存放著未經(jīng)排序的字?jǐn)?shù)組,在數(shù)組的第一個(gè)字中存放著該數(shù)組的長度。在KEYWORD單元中存放著一個(gè)數(shù)。試編制一程序,在數(shù)組中查找該數(shù),如果找到該數(shù)則把它從數(shù)組中刪除。 算法:算法:未排序的數(shù)組,只能用順序查找法(用串掃描指令)。要找的元素要找的元素 : 無,結(jié)束程序。 有, 在末尾,僅修改數(shù)組長度。 不在末尾,高地址元素向 低地址元素移動(dòng)一個(gè)字, 并修改數(shù)組長度。23 例3.32程序如下: MODEL SMALL DATA BLOCK DW 08H,22H,55H,99H,44H, 20H,56

14、H,78H, 52H KEYWORD DW ? CODE STARTUP MOV AX,DATA MOV ES,AX LEA DI,BLOCK MOV AX,KEYWORD ;欲查找的關(guān)鍵字 CLD MOV CX,DI ;取數(shù)組長度 ADD DI, 2 ;指向數(shù)組第一個(gè)元素 24 REPNE SCASW ;查找數(shù)組中是否有刪除元素 (AX -ES:DI,DIDI+2,CXCX-1) JE DELETE JMP DONE ;未找到刪除字則結(jié)束 DELETE: JCXZ DELLAST ;找到要?jiǎng)h除的元素為末尾 元素,直接刪除 LP: MOV BX,DI ;找到要?jiǎng)h除的元素為中間 元素,高位元素依

15、次低移 SUB DI,2 MOV DI,BX ADD DI,4 LOOP LP DELLAST: DEC BLOCK ;刪除該元素,數(shù)組長度減1 DONE:EXIT END25 例3.33 將正數(shù)正數(shù)N插入插入一個(gè)按遞增排列遞增排列的正數(shù)的字?jǐn)?shù)組的正確位置。該數(shù)組的首地址和末地址分別為HEAD和REAR。 算法:算法:1. 因?yàn)閿?shù)組長度是確定的,因此找到插入位置作為循環(huán)的結(jié)束條件。 2. 從數(shù)組的尾部向頭部查找,逐字取出數(shù)組中的一個(gè)數(shù)與插入元素作比較。三種可能性:三種可能性: 如果插入元素大于數(shù)組中所有數(shù),則插入到最后。 如果插入元素小于本次比較的數(shù)組元素,則把本次比較的數(shù)組元素向地址增大的方

16、向移動(dòng)一個(gè)字,然后繼續(xù)查找。 如果插入元素小于數(shù)組中的所有數(shù),通過在STOP單元中存放“1”這個(gè)數(shù)來結(jié)束循環(huán),因?yàn)椴迦朐貫檎龜?shù)。26 從數(shù)組的尾部向頭部查找,有三種可能性有三種可能性: 如果插入元素大于數(shù)組中所有數(shù),則第一次比較就可以結(jié)束循環(huán)。 如果插入元素小于本次比較的數(shù)組元素,則把本次比較的數(shù)組元素向地址增大的方向移動(dòng)一個(gè)字,然后繼續(xù)查找;直到插入元素大于數(shù)組中本次比較的元素,則把元素插入其地址高位,結(jié)束程序。為了空出要插入元素的位置,其地址高位的全部元素,都應(yīng)向地址增大的方向移動(dòng)一個(gè)字。 如果插入元素小于數(shù)組中的所有數(shù),通過在STOP單元中存放“1”這個(gè)數(shù)來結(jié)束循環(huán),因?yàn)椴迦朐貫檎龜?shù)

17、,那它必然大于1。 2728例3.33程序如下: MODEL SMALL DATA STOP DW 0FFFFH ;-1的補(bǔ)碼,作為插入元素 小于數(shù)組中所有元素時(shí) 循環(huán)結(jié)束的條件 HEAD DW 1,3, 5,35,56,65, 88 REAR DW 108,? ;108是最尾部的元素 NUM DW 35 ;欲插入元素 CODE STARTUP 29 MOV AX,NUM MOV DI,0 COMPARE: CMP AX ,REAR DI ;插入元素和高地址元素 開始比較 JGE INSERTWORD ;大于等于 MOV BX,REAR DI ;插入元素高地址元素, 則向地址 增大方向移動(dòng)一個(gè)

18、字 MOV REAR DI+2,BX SUB DI,2 JMP COMPARE INSERTWORD: MOV REAR DI+2,AX ;在數(shù)組中插入元素 EXIT END30 例3.34 設(shè)有數(shù)組X和Y,X數(shù)組中有X1,X10;Y數(shù)組中有Y1,Y10。試編制程序計(jì)算: Z1=X1Y1 Z5=X5Y5 Z8=X8Y8 Z2=X2Y2 Z6=X6Y6 Z9=X9Y9 Z3=X3Y3 Z7=X7Y7 Z10=X10Y10 Z4=X4Y4結(jié)果存入Z數(shù)組。 這類問題,也可用循環(huán)程序結(jié)構(gòu)來完成。 已知循環(huán)計(jì)數(shù)值為10, 每次循環(huán)有兩種操作:加法和減法, 可以設(shè)立標(biāo)志位,如標(biāo)志位為0做加法,為1則做減法; 做10次操作設(shè)立10個(gè)標(biāo)志位, 放在一個(gè)存儲(chǔ)單元LOGIC-RULE中,這種存儲(chǔ)單元一般稱為邏輯尺,本例設(shè)定的邏輯尺為: 0000000011011100 標(biāo)志位從低位開始順序反映了每次 的操作,最高的6位沒有意義把它們?cè)O(shè)為0。 31例3.34程序如下: MODEL SMALL DATA X DW X1,X2,X3,X4,X5, X6,X7,X8,X9,X10 Y DW Y1,Y2,Y3,Y4,Y5, Y6,Y7,Y8,Y9,Y10 Z DW 10DUP(?) LOGIC-R

溫馨提示

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

評(píng)論

0/150

提交評(píng)論