版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第五章 循環(huán)與分支程序設(shè)計(jì),5.1 循環(huán)程序設(shè)計(jì)5.2 分支程序設(shè)計(jì)5.3 如何在實(shí)模式下發(fā)揮80386及其后繼機(jī)型的優(yōu)勢(shì),1. 編寫匯編語言程序步驟 l 分析實(shí)際問題,確定解決問題的算法 l 按算法畫出程序流程圖 l 按流程圖編寫程序 l上機(jī)調(diào)試, 運(yùn)行程序,注:本教材所討論的編程環(huán)境只限于 在DOS操作系統(tǒng)下的實(shí)模式,2. 判斷程序質(zhì)量的標(biāo)準(zhǔn) 程序的正確性 程序的可讀性 程序的執(zhí)行時(shí)
2、間 程序所占內(nèi)存大小,3.幾種程序結(jié)構(gòu) 順序結(jié)構(gòu) 循環(huán)結(jié)構(gòu) 分支結(jié)構(gòu)子程序結(jié)構(gòu),順序結(jié)構(gòu)形式,循環(huán)結(jié)構(gòu)形式,當(dāng)型循環(huán)(當(dāng)條件成立進(jìn)入循環(huán)),直到型循環(huán)(直到條件成立退出循環(huán)),,分支結(jié)構(gòu)形式,Y,Y,N,N,分支結(jié)構(gòu)形式,1.多處調(diào)用完成同一功能的子程:code SEGMENTstart: 、、 CALL subp 、、 CALL subp
3、 、、 CALL subp 、、 MOV AH, 4CH INT 21Hsubp PROC 、、 、、 RETsubp ENDPcode ENDS END start,2.模塊化程序設(shè)計(jì):code SEGMENTbegin: CALL su
4、b1 CALL sub2 CALL sub3 MOV AH, 4CH INT 21Hsub1 PROC 、、 RETsub1 ENDPsub2 PROC 、、 RETsub2 ENDPsub3 PROC 、、 R
5、ETsub3 ENDPcode ENDS END begin,,子程結(jié)構(gòu)形式,注意返回DOS語句位置,,5.1.1 循環(huán)程序的結(jié)構(gòu)形式,5.1 循環(huán)程序設(shè)計(jì),(1)DO-WHILE結(jié)構(gòu) (2)DO-UNTIL結(jié)構(gòu),有關(guān)字符、數(shù)碼轉(zhuǎn)換的處理 1. 計(jì)算機(jī)處理字符時(shí),常用的字符編碼是ASCII 碼。2. 數(shù)字和字母的ASCII碼是一個(gè)有序
6、序列數(shù)字0~9 : 30H ~ 39H大寫字母A~Z : 41H ~ 5AH小寫字母a~z : 61H ~ 7AH,5.1.2 循環(huán)程序設(shè)計(jì)方法,例5.1 將寄存器BX中的內(nèi)容以十六進(jìn)制形式顯示出來。,BX是一個(gè)16位寄存器二進(jìn)制 1010 1001 0011 1110,用十六進(jìn)顯示時(shí),每4位用一個(gè)字符顯示,共4個(gè)其中: 0000 →’0’ 3
7、0H , 1010 →’A’ 41H 0001 →’1’ 31H , 1011 →’B’ 42H 、、 、、 1001 →’9’ 39H , 1111 →’F’ 46H,十六進(jìn)制 A 9 3 E,屏幕上的顯示 ‘A’
8、‘9’ ‘3’ ‘E’,對(duì)應(yīng)的ASCII 41H 39H 33H 45H,算法:取出要顯示的某4位,轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼,再調(diào)用DOS系統(tǒng)功能進(jìn)行顯示。,(1) 對(duì)于0000~1001(0~9), 先擴(kuò)展成一個(gè)字節(jié),高4位清0, 加上30H后, 即可得字符’0’~’9’對(duì)應(yīng)的ASCII碼。 0000 0001B + 30H= 31H
9、 0000 1001B + 30H=39H 0001B ‘1’ 1001B ‘9’,(2) 對(duì)于1010~1111(A~F), 先擴(kuò)展成一個(gè)字節(jié),高4位清0, 加上30H后, 還要再加上07H,才能得到’A’~’F’ 對(duì)應(yīng)的ASCII碼 0000 1010B+30H+07H
10、 = 41H 0000 1111B+30H+07H =46H 1010B ‘A’ 1111B ‘F’,code SEGMENT ASSUME CS:codestart: MOV CH, 4 ;字符個(gè)數(shù)rotate: MO
11、V CL, 4 ;循環(huán)移位次數(shù) ROL BX, CL ;取顯示位的值 MOV AL, BL ;保存在AL中 AND AL, 0FH ;清除高4位 ADD AL, 30H ;轉(zhuǎn)變?yōu)閿?shù)字的ASCII CMP AL, 3aH ;大于3aH, 則應(yīng)轉(zhuǎn)變
12、 JL print ;為數(shù)字0~9的ASCII ADD AL, 07H ;為字母A~F的ASCII print: MOV DL,AL ;送 ASCII字符到DL MOV AH, 2 ;顯示DL中的字符 INT 21H DEC CH
13、;顯示結(jié)束? JNZ next MOV AH, 4CH ;返回DOS INT 21Hcode ENDS END start,例5.2 在ADDR單元中存放著數(shù)Y,度編制一程序把Y中1的個(gè)數(shù)存入COUNT單元中。,datarea segmentaddre dw 1234hcount dw ?datarea
14、 ends,mov cx,0mov bx,addremov ax,bxagain:test ax,0ffffhjz exitjns shiftinc cxshift:shl ax,1jmp againexit:mov count,cxret,,例5.4 將正數(shù)n插入一個(gè)已整序的字?jǐn)?shù)組的正確位置。 x dw ? array_head d
15、w 3,5,15,23,37,49,52,65,78,99 array_end dw 105 n dw 32 mov ax, n mov array_head-2, 0ffffh mov si, 0compare: cmp array_end[si], ax
16、 jle insert mov bx, array_end[si] mov array_end[si+2], bx sub si, 2 jmp short compareinsert: mov array_end[si+2], ax,,,,,例 5.5 Zi=Xi+Yi,LOGIC_RULEDW00DCH……
17、MOVBX,0MOVCX,10MOVDX, LOGIC_RULENEXT:MOVAX, X[BX]SHRDX,1JCSUBTRACTADDAX,Y[BX]JMPSHORT RESULTSUBTRACT:SUBAX,Y[BX]RESULT:MOVZ[BX],AXADDBX,2LOOPNEXTRET……,例5.6 鍵入一行以空
18、格開頭以空格結(jié)束的字符串,datarea segmentbufferdb 80 dup(?)flagdb ?datarea ends,lea bx,buffermov flag,0next:mov ah,01 ;讀鍵盤int 21h ;所讀內(nèi)容放入altest flag,01h ;flag=1?jnz follow ;flag=
19、0,zf=1不轉(zhuǎn)cmp al,20h ;al是空格?,jnz exit ;不是,zf=0退出mov flag,1 ;置標(biāo)志flag=1jmp nextfollow:cmp al,20h ;al是空格?jz exit ;是,zf=1,退出mov [bx],al ;不是,保存inc bx
20、 ;數(shù)組索引加1jmp nextexit:,,,20,a,b,c,d,e,f,20,,flag= 0 1 jz exit成立,,,5.1.3 多重循環(huán)程序設(shè)計(jì),基本方法與單重循環(huán)相同,但要注意:1、分別考慮各重循環(huán)的控制條件及其程序?qū)崿F(xiàn),相互之間不能混淆2、每次從外層循環(huán)再次進(jìn)入內(nèi)層循環(huán)時(shí),初始
21、條件要重新設(shè)置,,例5.7 將首地址為a的字?jǐn)?shù)組從大到小排序(氣泡算法,多重循環(huán)) a dw 100,30,78,99,15,-1,66,54,189,256 mov cx, 10 ;待排序數(shù)的個(gè)數(shù) dec cx ;外循環(huán)的次數(shù)loop1: mov di, cx ;暫存外循環(huán)次數(shù) mov
22、bx, 0 ;數(shù)組下標(biāo)loop2: mov ax, a[bx] ;取第bx個(gè)數(shù) cmp ax, a[bx+2] ;與后一個(gè)數(shù)比較 jge continue ;[bx]>=[bx+2] xchg ax, a
23、[bx+2] ;<,則交換位置 mov a[bx], axcontinue: add bx, 2 ;指向下一個(gè)數(shù) loop loop2 mov cx, di ;恢復(fù)外循環(huán)次數(shù) loop loop1,,,,,,,例5.8
24、附加段字?jǐn)?shù)組首地址存于DI,第1字存放長(zhǎng)度,從小到大排序 extra segmenta dw 10,10h,12h,32h,21h,11h,56h,43h,33h,3h,67h extra endsdata segment start_addr dw ? save_cnt dw ?data endslea di,a ;取有效地址mov start_addr,di
25、mov cx,es:[di] ;取長(zhǎng)度mov save_cnt,cx ;數(shù)組長(zhǎng)度init:mov bx,1 ;結(jié)束標(biāo)志dec save_cntjz sorted ;zf=1,轉(zhuǎn)移mov cx,save_cntmov di,start_addr,next:add di,2mov ax,es:[di] ;取數(shù)
26、cmp es:[di+2],ax ;比較jae cont ;>=,轉(zhuǎn)移,不換xchg es:[di+2],axmov es:[di],axsub bx,bx ;排序標(biāo)志cont:loop nextcmp bx,0 ;bx=1,已排好je initsorted:mov di,start_addr,練習(xí)5.11:從鍵盤輸入一系列以$結(jié)束的字符串,統(tǒng)計(jì)
27、數(shù)字字符的個(gè)數(shù),data segmentcount dw 0buff db 50 dup(?)data endsprognam segmentmain proc farassume cs:prognamstart:push dssub ax,axpush axmov ax,datamov ds,axlea bx,buff ;取緩沖地址input:mov ah,01 ;從鍵盤讀串
28、int 21H ;存入al中mov [bx],al ;保存字符,inc bx ;buff數(shù)組下標(biāo)cmp al,‘$‘ ;是不是$jnz input ;是,結(jié)束讀lea bx,buff ;取串地址mov ax,0next:mov cl,[bx] ;取串中字符inc bx ;指向
29、下一字符cmp cl,‘$’ ;是不是$jz disp ;是,zf=1,轉(zhuǎn)移cmp cl,30h ;與’0’比較jb cont ;’9’,不計(jì)數(shù)inc ax ;計(jì)數(shù)cont:jmp nextdisp:retmain endpprognam endsend start,,,,,,練習(xí)5.11:測(cè)試一字符串是否存在數(shù)
30、字,若存在,置CL第5位置1,否則置0,data segment string db 'abcqdefghijklmnopqrs'data endsprognamsegmentmain proc far assume cs:prognam,ds:data,es:datastart:push ds sub ax,ax push ax mov ax,data mov ds,ax mov
31、 es,ax,begin:mov cx,20 ;字符個(gè)數(shù)mov si,0 ;數(shù)組下標(biāo)again:mov al, string[si]cmp al,30h ;與’0’比較jb goon ;,轉(zhuǎn)移or cl,20h ;有數(shù)字,置5位jmp exitgoon:inc si
32、 ;數(shù)組下標(biāo)加1loop againand cl,0dfh ;無數(shù)字,清5位exit:retmain endpprognam endsend start,,,,,,循環(huán)程序設(shè)計(jì)小結(jié)1、循環(huán)控制條件的選擇:a. 循環(huán)次數(shù)已知,采用LOOPb. 循環(huán)次數(shù)已知,但有可能使用其他特征或條件結(jié)束循環(huán), 可采用LOOPZ和LOOPNZc. 循環(huán)次數(shù)未知,具
33、體問題具體分析2 、設(shè)立條件標(biāo)志位的方法,5.2 分支程序設(shè)計(jì),5. 2 .1分支程序的結(jié)構(gòu)形式,雙分支與多分支的共同特點(diǎn):運(yùn)行方向是向前的在某一種特定條件下,只能執(zhí)行其中的一個(gè)分支,5. 2 .1分支程序設(shè)計(jì)方法,1、使用CMP、TEST等運(yùn)算型指令+條件轉(zhuǎn)移指令2、使用邏輯尺的方法3、使用跳躍表法實(shí)現(xiàn)CASE結(jié)構(gòu),例5.9 折半查找:附加段有一個(gè)有序字?jǐn)?shù)組,首字表示數(shù)組長(zhǎng)度,AX是待查字,若找到CF=0,否則CF=1,d
34、seg segment low_idx dw? high_idx dw? list dw 12,11,22,33,44,55,66,77,88,99,111,222,333 target dw77dseg endscseg segmentmain proc farassume cs:cseg,ds:dseg,es:dsegstart:push dssub ax,axpush axmo
35、v ax,dsegmov ds,axmov es,ax,例5.9 折半查找:附加段有一個(gè)有序字?jǐn)?shù)組,首字表示數(shù)組長(zhǎng)度,AX是待查字,若找到CF=0,否則CF=1,mov ax,target;lea di,list ;取數(shù)組首地址cmp ax,es:[di+2] ;取第1個(gè)數(shù)ja chk_last;>第1個(gè),檢查最后1個(gè)lea si,es:[di+2] ;<=第1個(gè)je ex
36、it;=,退出stc;CF=1,沒找到j(luò)mp exitchk_last:mov si,es:[di];下面三條使SI指向shl si,1;數(shù)組末元素add si,dicmp ax,es:[si];與末元素比較jb search;<,搜索數(shù)組je exit;=,退出stc;CF=1,沒找到j(luò)mp exit,,例5.9 折半查找:附加段有一個(gè)有序字?jǐn)?shù)組,首
37、字表示數(shù)組長(zhǎng)度,AX是待查字,若找到CF=0,否則CF=1,search:mov low_idx,1;搜索開始的地方mov bx,es:[di];數(shù)組長(zhǎng)度mov high_idx,bx;搜索結(jié)束的地方mov bx,di;list地址mid:mov cx,low_idx;mov dx,high_idx;cmp cx,dx;比較’頭’與’末’指針ja no_match;>,’頭’
38、到’末’之后add cx,dx;以下三條計(jì)算shr cx,1;’頭’與’末’的中點(diǎn)mov si,cxshl si,1;對(duì)準(zhǔn)中間’字’,(1+5)/2=3 3*2=6 DI偏移6,即106,即第3字,,compare:cmp ax,es:[bx+si];比較,bx指向數(shù)組首元素je exit;=,找到,退出ja highter;>,調(diào)節(jié)搜索’頭’dec cx;<
39、=mov high_idx,cx;調(diào)節(jié)搜索’末’jmp midhighter:inc cxmov low_idx,cx;調(diào)節(jié)搜索’頭’jmp midno_match:stcexit:ret,例5.9 折半查找:附加段有一個(gè)有序字?jǐn)?shù)組,首字表示數(shù)組長(zhǎng)度,AX是待查字,若找到CF=0,否則CF=1,例5.10 根據(jù)AL寄存器中哪一位為1(從低位到高位)把程序 轉(zhuǎn)移到8個(gè)不同
40、的程序分支去 。,branch_table dw routine1 dw routine2 dw routine3 dw routine4 dw routine5 dw routine6
41、 dw routine7 dw routine8,注意:DW 標(biāo)號(hào)的使用,寄存器間接尋址,cmp al, 0 je continue lea bx, branch_tableL : shr al, 1 ;邏輯右移,最低位進(jìn)入CF位 jnb not_yet ;jnb=j
42、nc,CF=0,轉(zhuǎn)移 jmp word ptr [bx] ;段內(nèi)間接轉(zhuǎn)移not_yet : add bx, type branch_table jmp Lcontinue: …… routine1: ……routine2: …… ……,,調(diào)試源程序,變址尋址方式實(shí)現(xiàn),cmp al, 0 je continue mov si, 0
43、 L : shr al, 1 ;邏輯右移,最低位進(jìn)入CF位 jnb not_yet ; jnb=jnc,CF=0,轉(zhuǎn)移 jmp branch_table[si] ;段內(nèi)間接轉(zhuǎn)移not_yet: add si, type branch_table jmp Lcontinue: …… routine1: ……routine2:
44、…… ……,,調(diào)試源程序,基址變址尋址,cmp al, 0 je continue lea bx, branch_table mov si, 7* type branch_table mov cx, 8L : shl al, 1 ;邏輯左移,最高位進(jìn)入CF位 jnb not_yet ;jnb=jnc,CF=0,轉(zhuǎn)移 jmp wo
45、rd ptr [bx][si] ;段內(nèi)間接轉(zhuǎn)移not_yet :sub si, type branch_table loop Lcontinue: …… routine1: ……routine2: …… ……,,調(diào)試源程序,習(xí)題5.21 試寫一程序,要求比較數(shù)組ARRAY中的三個(gè)16位補(bǔ)碼數(shù),并根據(jù)比較結(jié)果在終端上顯示如下信息:(1)如果三個(gè)數(shù)都不相等,則顯示0(2)如果有兩個(gè)相
46、等則顯示1(3)如果都相等,則顯示2,dseg segmentarray dw 3 dup(?)dseg endscseg segment……mov cx,3lea si,arraybegin:push cxmov cl,4mov di,4mov dl,’ ‘mov ah,02int 21h,input:mov ah,01hint 21hand al,0fhshl dx,cl
47、or dl, aldec dijne inputmov [si],dxadd si,2pop cxloop begin,,,,compa:lea si, arraymov dx,0mov ax,[si]mov bx,[si+2]cmp ax,bxjne next1inc dxnext1:cmp [si+4],axjne next2inc dxnext2:cmp [s
48、i+4],bxjne numinc dx,num:cmp dx, 3jl dispdec dxdisp:mov ah,2add dl,30hint 21hmain endpcseg endsend start,,,,習(xí)題5.23 已定義整型變量A、B(1)若只有一個(gè)奇數(shù),奇數(shù)存入A,偶數(shù)存入B(2)若兩個(gè)奇數(shù),A=A+1 B=B+1(3)若兩個(gè)偶數(shù),A、B值不變,begin:mov
49、ax,amov bx,bxor ax,bxtest ax, 1hjz class ;同奇同偶,轉(zhuǎn)移text bx,1hjz exit,xchg bx,amov b,bxjmp exitclass:test bx,1hjz exit ;若同偶,退出inc b inc aexit:ret,,,,,5.3 如何在實(shí)模式下發(fā)揮80386及其后繼機(jī)型的優(yōu)勢(shì),80386及其后繼
50、機(jī)型不但兼容8086的程序,運(yùn)行速度更快;而且還有其它的一些優(yōu)勢(shì):,5.3.1 充分利用高檔機(jī)的32位字長(zhǎng)特征5.3.2 通用寄存器可作為指針寄存器5.3.3與比例因子有關(guān)的尋址方式,調(diào)試源程序例5.11,通用寄存器作指針寄存器8個(gè)32位通用寄存器都可以作為基址或變址寄存器使用,但注意它們的高16位應(yīng)為0。,32位字長(zhǎng)特征計(jì)算機(jī)一次能夠處理32位的數(shù)據(jù),可以訪問32位的8個(gè)通用寄存器,但EIP和EFLAGS在實(shí)模式下只有低
51、16位可以使用。,比例因子方便了表格處理和多位數(shù)組處理,實(shí)模式段的大小限于64K,,實(shí)模式下的程序是一種混合的16位和32位代碼,純16位模塊(1) 所有段長(zhǎng)都小于64KB;(2) 數(shù)據(jù)項(xiàng)主要是8位或16位的(3) 指向代碼或數(shù)據(jù)的指針只 有16位偏移地址(4) 只有16位段之間傳送控制,純32模塊(1) 段長(zhǎng)可大于64KB(0-4GB);(2) 數(shù)據(jù)項(xiàng)主要是8位或32位的(3) 指向代碼或數(shù)據(jù)的指針
溫馨提示
- 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. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- ibm-pc匯編語言程序設(shè)計(jì)試題及答案
- ibm-pc匯編語言程序設(shè)計(jì)習(xí)題答案打印
- ibm-pc匯編語言程序設(shè)計(jì)(第2版)答案
- ibm-pc匯編語言bios和dos中斷調(diào)用程序設(shè)計(jì).
- ibm-pc匯編語言程序設(shè)計(jì)第二版課后習(xí)題答案清華大學(xué)
- ibm-pc匯編語言程序設(shè)計(jì)第2章80x86計(jì)算機(jī)組織.
- 匯編語言程序設(shè)計(jì)
- 匯編語言程序設(shè)計(jì)
- 匯編語言程序設(shè)計(jì)前言
- ibm—pc匯編語言程序設(shè)計(jì)(第二版)電子教案第九章
- 匯編語言程序設(shè)計(jì)課后答案
- 實(shí)驗(yàn)一 匯編語言程序設(shè)計(jì)
- 匯編語言程序設(shè)計(jì)競(jìng)賽報(bào)告
- 匯編語言程序設(shè)計(jì)習(xí)題-答案
- 4匯編語言程序設(shè)計(jì)基礎(chǔ)
- 匯編語言程序設(shè)計(jì)課后答案
- 匯編語言程序設(shè)計(jì)課程教案
- 匯編語言程序設(shè)計(jì)習(xí)題答案
- 匯編語言程序設(shè)計(jì)課后答案
- 匯編語言程序設(shè)計(jì)-課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論