h3-23 分支與循環2_第1頁
h3-23 分支與循環2_第2頁
h3-23 分支與循環2_第3頁
h3-23 分支與循環2_第4頁
h3-23 分支與循環2_第5頁
已閱讀5頁,還剩29頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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 ;將小寫字母轉換 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語言的語句改寫成等價的匯編語言程序段(不考慮運算過程中的溢出),其中:變量a、b和c 都是有符號的整型(int)變量。if (a+b0 &c%2= =0)

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

5、偏移地址和段基址。 根據分支條件確定對應分支程序的入口地址在地址表中的位置(序號),轉去執行分支程序。 9例3.28 接收單鍵命令AG,根據命令進行相應的處理,否則不作處理。程序流程如圖3.5所示。 MODEL SMALL 586 DATA TAB DD LAB0 ;命令A處理程序地址 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轉變成序號06 AND EAX,0000000FH

6、 JMP TABEAX4 ;轉不同分支程序 LAB0: ;命令A處理程序 JMP DONE LAB1: ;命令B處理程序 JMP DONE LAB6: ;命令G處理程序 DONE: EXIT END10例 用地址轉移表實現下列C語言語句,其中變量a和b是有符號的整型(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位二進制數, 實現a%8的計算 SHL BX, 1 ;地址表是字類型,其下標要乘2JMP TableBX ;利用地址表實現多路轉移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用地址表實現多路轉移的關鍵在于: 轉移入口的地址表和轉移情況可整數化。 如果這兩個要求有一個不滿足或很難構造,則無法使用該方法。 1433 循環程序設計循環程序設計 331 單重循環程序單重循環程序 單重循環程序按照判斷循環條件的流程不同可分為兩類結構。 一REPEATUNTIL結構:先執行程序再判斷循環條件(至少執行一次)。 二WHILEDO結構:先判斷循環條件,滿足循環條件才進入循環體。

9、 圖3.6 REPEATUNTIL循環程序結構 圖3.7 WHILEDO循環程序結構15 例3.29 REPEATUNTIL循環結構程序實現舉例。 1 MOV CX,COUNT ;設置循環初值 AGAIN: ;循環程序入口 LOOP AGAIN ;循環控制 2 MOV CL,COUNT ;設置循環初值 AGAIN: DEC CL ;計數器減1 JNZ AGAIN ;循環控制 16 例3.30 WHILEDO循環結構程序實現舉例。 MOV CX,COUNT ;設置循環初值 AGAIN: JCXZ NEXT DEC CX JMP AGAIN NEXT: 17 例3.31 從鍵盤輸入21個字符,按鍵

10、入次序尋找字典順序最大的字符,并顯示輸出(不區分大小寫)。 分析:分析:判斷 ASCII碼值大小時,小寫字符 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第一個字符地址 MOV CX,BUF+1 ;CX字符串長度 DEC CX MOV AL,BX ;緩沖區第一個字符送 AL AND AL,11011111B

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

12、中,數組以負數為結束標志。.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)保存數組元素之和XOR CX,CX ;用CX保存數組元素個數LEA SI,score ;用指針SI訪問整個數組21again: MOV BX,SICMP BX,0JL overADD AX,BXADC DX,0 ;求和INC CX ;計數ADD SI,2 ;地址增量JMP againover:JCXZ exit;防止零作除數(空數組)DIV CX ;

13、求平均值MOV Average,AX exit: .EXITEND22 例3.32 在BLOCK緩沖區中存放著未經排序的字數組,在數組的第一個字中存放著該數組的長度。在KEYWORD單元中存放著一個數。試編制一程序,在數組中查找該數,如果找到該數則把它從數組中刪除。 算法:算法:未排序的數組,只能用順序查找法(用串掃描指令)。要找的元素要找的元素 : 無,結束程序。 有, 在末尾,僅修改數組長度。 不在末尾,高地址元素向 低地址元素移動一個字, 并修改數組長度。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 ;欲查找的關鍵字 CLD MOV CX,DI ;取數組長度 ADD DI, 2 ;指向數組第一個元素 24 REPNE SCASW ;查找數組中是否有刪除元素 (AX -ES:DI,DIDI+2,CXCX-1) JE DELETE JMP DONE ;未找到刪除字則結束 DELETE: JCXZ DELLAST ;找到要刪除的元素為末尾 元素,直接刪除 LP: MOV BX,DI ;找到要刪除的元素為中間 元素,高位元素依

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

16、向移動一個字,然后繼續查找。 如果插入元素小于數組中的所有數,通過在STOP單元中存放“1”這個數來結束循環,因為插入元素為正數。26 從數組的尾部向頭部查找,有三種可能性有三種可能性: 如果插入元素大于數組中所有數,則第一次比較就可以結束循環。 如果插入元素小于本次比較的數組元素,則把本次比較的數組元素向地址增大的方向移動一個字,然后繼續查找;直到插入元素大于數組中本次比較的元素,則把元素插入其地址高位,結束程序。為了空出要插入元素的位置,其地址高位的全部元素,都應向地址增大的方向移動一個字。 如果插入元素小于數組中的所有數,通過在STOP單元中存放“1”這個數來結束循環,因為插入元素為正數

17、,那它必然大于1。 2728例3.33程序如下: MODEL SMALL DATA STOP DW 0FFFFH ;-1的補碼,作為插入元素 小于數組中所有元素時 循環結束的條件 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 ;插入元素高地址元素, 則向地址 增大方向移動一個

18、字 MOV REAR DI+2,BX SUB DI,2 JMP COMPARE INSERTWORD: MOV REAR DI+2,AX ;在數組中插入元素 EXIT END30 例3.34 設有數組X和Y,X數組中有X1,X10;Y數組中有Y1,Y10。試編制程序計算: Z1=X1Y1 Z5=X5Y5 Z8=X8Y8 Z2=X2Y2 Z6=X6Y6 Z9=X9Y9 Z3=X3Y3 Z7=X7Y7 Z10=X10Y10 Z4=X4Y4結果存入Z數組。 這類問題,也可用循環程序結構來完成。 已知循環計數值為10, 每次循環有兩種操作:加法和減法, 可以設立標志位,如標志位為0做加法,為1則做減法; 做10次操作設立10個標志位, 放在一個存儲單元LOGIC-RULE中,這種存儲單元一般稱為邏輯尺,本例設定的邏輯尺為: 0000000011011100 標志位從低位開始順序反映了每次 的操作,最高的6位沒有意義把它們設為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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論