匯編-循環(huán)及分支程序設(shè)計(jì)_第1頁
匯編-循環(huán)及分支程序設(shè)計(jì)_第2頁
匯編-循環(huán)及分支程序設(shè)計(jì)_第3頁
匯編-循環(huán)及分支程序設(shè)計(jì)_第4頁
匯編-循環(huán)及分支程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第五章第五章 循環(huán)與分支程序設(shè)計(jì)循環(huán)與分支程序設(shè)計(jì)1、編制匯編語言程序的步驟如下:n 分析問題分析問題問題性質(zhì)、目的、要求、已知條件等等。建立問題性質(zhì)、目的、要求、已知條件等等。建立相應(yīng)數(shù)學(xué)模型。相應(yīng)數(shù)學(xué)模型。n 確定算法確定算法把實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)求解的步驟和方法。把實(shí)際問題轉(zhuǎn)化為計(jì)算機(jī)求解的步驟和方法。n 確定數(shù)據(jù)結(jié)構(gòu)確定數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)的組織方式,分配存儲(chǔ)區(qū)數(shù)據(jù)的組織方式,分配存儲(chǔ)區(qū)n 繪制流程圖繪制流程圖形象化描述程序算法。形象化描述程序算法。n 編寫程序編寫程序?qū)⒘鞒虉D用指令集合來實(shí)現(xiàn)。應(yīng)該將流程圖用指令集合來實(shí)現(xiàn)。應(yīng)該“簡單明了簡單明了、層次清晰、運(yùn)算正確、短小精悍、層次清晰、運(yùn)算

2、正確、短小精悍”。 n 上機(jī)調(diào)試上機(jī)調(diào)試驗(yàn)證程序功能,反復(fù)修改達(dá)到完善。驗(yàn)證程序功能,反復(fù)修改達(dá)到完善。基本步驟基本步驟2 計(jì)算機(jī)通常不會(huì)從程序的第一條指令直接順序執(zhí)行到程計(jì)算機(jī)通常不會(huì)從程序的第一條指令直接順序執(zhí)行到程序的最后一條指令結(jié)束,會(huì)根據(jù)處理事務(wù)的不同而具有不序的最后一條指令結(jié)束,會(huì)根據(jù)處理事務(wù)的不同而具有不同的執(zhí)行流程。程序的流程是由程序的結(jié)構(gòu)決定的?;就膱?zhí)行流程。程序的流程是由程序的結(jié)構(gòu)決定的。基本的程序結(jié)構(gòu)有:的程序結(jié)構(gòu)有:2 2、程序基本結(jié)構(gòu)、程序基本結(jié)構(gòu)n 順序結(jié)構(gòu)順序結(jié)構(gòu)n 分支結(jié)構(gòu)分支結(jié)構(gòu)n 循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)n 子程序結(jié)構(gòu)子程序結(jié)構(gòu) 3 例如,在數(shù)據(jù)區(qū)定義的字符緩沖

3、區(qū)如下:DATA SEGMENT Buffer DB 32ACTLEN DB ?STRING DB 32 DUP(?) DATA ENDS2鍵盤一次輸入一個(gè)字符串的方法: MOV AX, SEG BufferMOV AX, SEG Buffer /Buffer是存放輸入字符串的緩沖區(qū) MOV MOV DSDS, AX, AX /Buffer的段地址存入DS MOV MOV DXDX, Offset Buffer, Offset Buffer/Buffer的偏移地址存入DX MOV Buffer, countMOV Buffer, count /設(shè)置存入字符串的最大長度并存入Buffer的首字節(jié)

4、; MOV AH, MOV AH, 0A0AH H /設(shè)置INT 21H功能參數(shù)為0AH INT 21HINT 21H /調(diào)用DOS功能By brooks too broad for leaping456順序結(jié)構(gòu)及簡單程序設(shè)計(jì) 程序設(shè)計(jì)中最基本的結(jié)構(gòu)是如圖所示的順序結(jié)構(gòu),它只有一個(gè)起始框、一個(gè)結(jié)束框和一至多個(gè)執(zhí)行模塊。具有順序結(jié)構(gòu)的程序叫做簡單程序。 順序結(jié)構(gòu)中的執(zhí)行模塊可以是一條指令或完成某一功能的程序。簡單程序執(zhí)行的特點(diǎn)是其中的指令或語句是按順序執(zhí)行的,沒有分支或循環(huán)。 開始開始A A B B結(jié)束結(jié)束7例:設(shè)置光標(biāo)到屏幕左上角。 SET_CURPROC MOV AH,2 MOV BH,0

5、MOV DX,0 INT 10H RET SET_CURENDP 這個(gè)程序是順序執(zhí)行的,一條指令執(zhí)行后順序執(zhí)行緊接其后的另一條指令。實(shí)際上許多程序片段都具有順序結(jié)構(gòu)?!纠烤幹埔粋€(gè)程序,求下列公式中的【例】編制一個(gè)程序,求下列公式中的Z值,并將結(jié)果存放到值,并將結(jié)果存放到RESULT單元中:單元中:Z=(AB)10500。設(shè)。設(shè)A、B的值的值分別存放在分別存放在BUFA、BUFB單元中,運(yùn)算結(jié)果不超過單元中,運(yùn)算結(jié)果不超過16位。位。算算 法法:在二進(jìn)制整數(shù)中左移:在二進(jìn)制整數(shù)中左移1位相當(dāng)于乘位相當(dāng)于乘2,右移,右移1位相當(dāng)于位相當(dāng)于除除2,所以可將(,所以可將(A+B)左移)左移3位完成乘

6、以位完成乘以8的操作,然后再與的操作,然后再與(A+B)左移)左移1位(乘以位(乘以2)的結(jié)果相加得到()的結(jié)果相加得到(A+B)10的計(jì)的計(jì)算。算。 n 順序結(jié)構(gòu)程序順序結(jié)構(gòu)程序簡單程序結(jié)構(gòu)簡單程序結(jié)構(gòu)分分 析析:這是一個(gè)簡單的順序結(jié)構(gòu)程序,可以直接使用匯編:這是一個(gè)簡單的順序結(jié)構(gòu)程序,可以直接使用匯編指令完成。指令完成。數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu):存儲(chǔ)單元:存儲(chǔ)單元RESULT用來存放結(jié)果,用來存放結(jié)果,BUFA、BUFB存放存放A、B的值,可用寄存器的值,可用寄存器BX存放中間運(yùn)算結(jié)果。存放中間運(yùn)算結(jié)果。程序流程圖程序流程圖 DATA SEGMENTBUFA DW ?BUFB DW ?RESULT

7、DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,BUFA ;DX=A ADD DX,BUFB ;DX=A+B MOV BX,DX ;BX=DX=A+B MOV CL,3 SAL DX,CL ;DX=(A+B)8 SAL BX,1;BS=(A+B)2 ADD DX,BX ; DX=(A+B)*8+(A+B)*2=(A+B)*10 SUB DX,500 ;DX=(A+B) * 8-500 MOV RESULT,DX MOV AH,4CH ;DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用 INT 21

8、H ;返回操作系統(tǒng)返回操作系統(tǒng)CODE ENDS END START編寫程序編寫程序【例】用查表法求整數(shù)【例】用查表法求整數(shù)X的平方值(的平方值(0 xx15的整數(shù)),將結(jié)果存入的整數(shù)),將結(jié)果存入RESULT單元中。單元中。 分析分析:用查表法求平方值,首:用查表法求平方值,首先需要建一個(gè)用于存放各數(shù)平先需要建一個(gè)用于存放各數(shù)平方值的表,以方值的表,以TABLE表示表表示表頭,表中依次存放頭,表中依次存放015的平的平方值,將待求數(shù)方值,將待求數(shù)X放入放入AL寄存寄存器,表的起始地址放入器,表的起始地址放入BX寄寄存器。使用存器。使用XLAT查表指令可查表指令可以將地址以將地址BX+AL上的

9、一個(gè)字上的一個(gè)字節(jié),即節(jié),即AL數(shù)值對(duì)應(yīng)的平方值數(shù)值對(duì)應(yīng)的平方值讀入讀入AL中。中。程序流程圖程序流程圖 編寫程序編寫程序DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81,100, 121,144,169,196,225 X DB 9RESULT DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,X MOV BX,OFFSET TABLE;LEA BX,TABLE XLAT MOV RESULT,AL MOV AH, 4CH INT

10、 21HCODE ENDS END START125.1 循環(huán)程序設(shè)計(jì) DO-UNTILDO-UNTIL結(jié)構(gòu)結(jié)構(gòu)不滿足不滿足滿足滿足條件條件循環(huán)體循環(huán)體循環(huán)初始化循環(huán)初始化不滿足不滿足DO-WHILEDO-WHILE結(jié)構(gòu)結(jié)構(gòu)滿足滿足條件條件循環(huán)體循環(huán)體循環(huán)初始化循環(huán)初始化135.1.2 循環(huán)程序設(shè)計(jì)方法無論使用哪種循環(huán)結(jié)構(gòu),循環(huán)程序一般應(yīng)包括以下幾部分: 循環(huán)初始化循環(huán)初始化。包括設(shè)置循環(huán)次數(shù)的初值、地址指針初始設(shè)置等。 循環(huán)體循環(huán)體。循環(huán)工作主體,包括要重復(fù)執(zhí)行的操作以及循環(huán)的修改部分。修改部分包括地址指針的修改、循環(huán)控制條件的修改等。 循環(huán)控制部分循環(huán)控制部分:判斷循環(huán)條件滿足與否,常用方

11、法:計(jì)數(shù)控制、特征值控制、地址邊界控制等。特別要注意循環(huán)入口和循環(huán)次數(shù)的正確設(shè)置、地址指針及循環(huán)控制條件的修改等。否則會(huì)得不到期望的結(jié)果。14例例5.1:把:把 BX BX 中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上中的二進(jìn)制數(shù)以十六進(jìn)制的形式顯示在屏幕上 如:如:1011 0010 1111 1010 B H BXBX11 0 1 1 0 0 1 0 1 1 1 1 1 0 1 01 0 1 10 0 1 01 0 1 01 1 1 10 0 1 01 0 1 11 0 1 01 1 1 10 0 1 01 0 1 11 0 1 01 1 1 10 0 1 01 0 1 11 0 1 01 1

12、 1 1234分析:分析:(1)程序結(jié)構(gòu)的確定程序結(jié)構(gòu)的確定由題意由題意,顯然這,顯然這可以用循環(huán)結(jié)構(gòu)來完成可以用循環(huán)結(jié)構(gòu)來完成,循環(huán)次數(shù)為,循環(huán)次數(shù)為4。用何種移用何種移位指令?位指令?15 (2)循環(huán)體的構(gòu)成(算法確定)循環(huán)體的構(gòu)成(算法確定) 循環(huán)體應(yīng)該包括:循環(huán)體應(yīng)該包括: (a) BX循環(huán)左移一個(gè)數(shù)位循環(huán)左移一個(gè)數(shù)位 (b)把最右邊的數(shù)位轉(zhuǎn)換為把最右邊的數(shù)位轉(zhuǎn)換為ASCII (c)顯示字符顯示字符. 需要了解相關(guān)知識(shí)需要了解相關(guān)知識(shí):字符和其字符和其ASCII碼之間的關(guān)系?碼之間的關(guān)系? “0”“9” 30H39H, (0 + 30H = 30H)“A”F” 41H46H (A +

13、37H = 41H = A + 30H +7H)如何顯示一個(gè)字符?如何顯示一個(gè)字符? (a)將顯示字符的將顯示字符的ASCII碼放入碼放入DL寄存器;寄存器; (b)將將AH的內(nèi)容置為的內(nèi)容置為2(功能號(hào));(功能號(hào)); (c)執(zhí)行執(zhí)行INT 21H(DOS 功能調(diào)用)功能調(diào)用).16(3)循環(huán)控制條件分析)循環(huán)控制條件分析因?yàn)檠h(huán)次數(shù)已知,可以使用計(jì)數(shù)值作為循環(huán)控制條件。因?yàn)檠h(huán)次數(shù)已知,可以使用計(jì)數(shù)值作為循環(huán)控制條件??梢允褂每梢允褂脤?shí)現(xiàn)。實(shí)現(xiàn)。!如何解決?如何解決?用用PUSH PUSH 和和 POPPOP指令解決指令解決17 mov cx, 4 mov cx, 4 ;初始化;初始化 m

14、ov cl, 4 mov cl, 4 ;設(shè)置移動(dòng)的位數(shù);設(shè)置移動(dòng)的位數(shù) rol bx, cl rol bx, cl ;循環(huán)左移;循環(huán)左移 mov al, bl mov al, bl ;避免;避免bxbx中的數(shù)被修改中的數(shù)被修改 and al, 0fh and al, 0fh ;高;高4 4位清零位清零 add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jb printit jb printit add al, 7h add al, 7h ; AF ASCII 41H46H; AF

15、 ASCII 41H46H mov dl, al mov dl, al mov ah, 2 mov ah, 2 int 21h int 21h loop rotate loop rotate 方法方法1 (LOOP)rotate:容易出錯(cuò)處1容易出錯(cuò)處4容易出錯(cuò)處3容易出錯(cuò)處2printit: 結(jié)束結(jié)束開始開始初始化循環(huán)計(jì)數(shù)值初始化循環(huán)計(jì)數(shù)值BX循環(huán)左移一個(gè)數(shù)位循環(huán)左移一個(gè)數(shù)位把最右邊的數(shù)位轉(zhuǎn)換為把最右邊的數(shù)位轉(zhuǎn)換為ASCII(即將最右邊的數(shù)位即將最右邊的數(shù)位+30H)是是ASCII AF?Y加上加上7顯示一個(gè)字符顯示一個(gè)字符循環(huán)計(jì)數(shù)值循環(huán)計(jì)數(shù)值=0?YNN用隱藏的cx作為控制條件printi

16、t: 18除了可以使用LOOP指令之外,還可以使用來實(shí)現(xiàn)。如何實(shí)現(xiàn)?LOOP AGAIN DEC 計(jì)數(shù)器計(jì)數(shù)器 JNZ AGAIN19 mov mov , 4 , 4 ;初始化;初始化rotate: mov rotate: mov , 4, 4 rol bx, cl rol bx, cl mov al, bl mov al, bl and al, 0fh and al, 0fh add al, 30h add al, 30h ; 09 ASCII 30H39H; 09 ASCII 30H39H cmp al, 3ah cmp al, 3ah jl printit jl printit add

17、al, 7h add al, 7h ; AF ASCII 41H46H; AF ASCII 41H46Hprintit: printit: mov dl, almov dl, al mov ah, 2 mov ah, 2 int 21h int 21h 方法方法2 (條件跳轉(zhuǎn)指令條件跳轉(zhuǎn)指令)將將cx分成分成ch和和cl兩部分使用兩部分使用代替loop rotate2021 mov bx, 0 mov bx, 0newchar: mov ah, 1 newchar: mov ah, 1 ;鍵盤輸入;鍵盤輸入 int 21hint 21h sub al, 30h sub al, 30h jl e

18、xit ; jl exit ; 00退出退出,分支,分支1 1 cmp al, 10 cmp al, 10 jl add_to jl add_to ;分支;分支2 2 sub al, 27h ; af sub al, 27h ; af cmp al, 0ah cmp al, 0ah jl exit ; jl exit ; aff退出退出,分支,分支4 4add_to: mov cl, 4add_to: mov cl, 4 shl bx, cl shl bx, cl mov ah, 0 mov ah, 0 add bx, ax add bx, ax jmp newchar jmp newchar

19、 ;無條件死循環(huán);無條件死循環(huán)exit: exit: (016)+1) 16+0a) 16+0f22例例5.2 在在ADDR單單元存放著數(shù)元存放著數(shù)Y的的地址,試編制一地址,試編制一程序把程序把Y中中1的的個(gè)數(shù)存入個(gè)數(shù)存入COUNT單元中單元中開始1的個(gè)數(shù)計(jì)數(shù)器0循環(huán)次數(shù)計(jì)數(shù)器CX16Y左移一次CF=11的個(gè)數(shù)計(jì)數(shù)器+1CX CX-1=0COUNT 1的個(gè)數(shù)計(jì)數(shù)器結(jié)束NYNY循環(huán)次數(shù)固定循環(huán)次數(shù)固定,完全由循環(huán)計(jì)數(shù)器控制完全由循環(huán)計(jì)數(shù)器控制23DATA SEGMENTYDW 1234HADDRDW YCOUNTDB ?DATAENDSCODESEGMENTASSUME CS:CODE,DS:D

20、ATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND START例例5.224開始1的個(gè)數(shù)計(jì)數(shù)器0循環(huán)次數(shù)計(jì)數(shù)器CX16Y左移一次CF=11的個(gè)數(shù)計(jì)數(shù)器+1CX CX-1=0COUNT 1的個(gè)數(shù)計(jì)數(shù)器結(jié)束NYNYY=0NY例例5.225DATA SEGMENTYDW 1234HADDRDW YCOUNTDB ?DATAENDSCODES

21、EGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,0MOV BX,ADDRMOV AX,BXMOV CX,16REPEAT:SHL AX,1JNC NEXTINC DLNEXT:LOOP REPEATEXIT0:MOV COUNT,DLMOV AH,4CHINT 21HCODEENDSEND STARTCMP AX,0JZ EXIT0例例5.2JMP REPEAT26作業(yè):Page193 5.15.8 27例5.3 在附加段中,有一個(gè)首地址為LIST和未經(jīng)排序的字?jǐn)?shù)組。在數(shù)組的第一個(gè)字中,存放著該數(shù)組的長度,數(shù)組的首地址已

22、存放在DI寄存器中,AX寄存器中存放著一個(gè)數(shù)。要求編制一程序:在數(shù)組中查找該數(shù),如果找到此數(shù),則把它從數(shù)組中刪除。LISTL LISTDI N AXL從哪頭開始查找?28del_ul proc near cld push di mov cx,es:di add di,2 repne scasw je delete pop di jmp short exitdelete: jcxz dec_cntnext_el: mov bx,ex:di mov es:di-2,bx add di,2 loop next_eldec_cnt: pop di dec word ptr es:diexit: ret

23、del_up endp最后一個(gè)是,直接把長度減1如果有多個(gè)需要?jiǎng)h除的數(shù),怎么辦?29例例5.4 :將正數(shù)將正數(shù) n n 插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組。該數(shù)組的首地插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組。該數(shù)組的首地址和末地址分別為址和末地址分別為ARRAY_HEAD, ARRAY_END。x dw ?x dw ?array_head dw 3,5,15,23,37,49,52,65,78,99 array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105array_end dw 105n dw 32 n dw 32 30由于數(shù)組已經(jīng)排好序,因此可以將正

24、數(shù)由于數(shù)組已經(jīng)排好序,因此可以將正數(shù)n依次和數(shù)組中的數(shù)進(jìn)依次和數(shù)組中的數(shù)進(jìn)行比較,比較有個(gè)方向問題,行比較,比較有個(gè)方向問題,怎樣比較最簡單?怎樣比較最簡單? 當(dāng)遇到第一個(gè)比當(dāng)遇到第一個(gè)比n小的數(shù),記下該位置,該位置的下一個(gè)位置小的數(shù),記下該位置,該位置的下一個(gè)位置就是要插入就是要插入n 的位置。的位置。31將正數(shù)將正數(shù) n n 插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組插入一個(gè)已整序的正數(shù)字?jǐn)?shù)組(P166例題例題5.4)mov ax, nmov ax, nmov array_head-2, 0ffffhmov array_head-2, 0ffffhmov si, 0mov si, 0compare:com

25、pare:cmp array_end si, axcmp array_end si, axjle insertjle insertmov bx, array_end simov bx, array_end simov array_end si+2, bxmov array_end si+2, bxsub si, 2 sub si, 2 jmp short comparejmp short compareinsert:insert:mov array_end si+2, axmov array_end si+2, ax32例例5.55.5:有數(shù)組:有數(shù)組 x(x1,x(x1,x2,x2,x10)

26、 ,x10) 和和 y(y1,y2,y10)y(y1,y2,y10), 編程計(jì)算編程計(jì)算 z z(z1,(z1,z2,z2,z10),z10)z1 = x1 + y1z1 = x1 + y1z2 = x2 + y2z2 = x2 + y2z3 = x3 - y3z3 = x3 - y3z4 = x4 - y4z4 = x4 - y4z5 = x5 - y5z5 = x5 - y5z6 = x6 + y6z6 = x6 + y6z7 = x7 - y7z7 = x7 - y7z8 = x8 - y8z8 = x8 - y8z9 = x9 + y9z9 = x9 + y9z10= x10 + y1

27、0z10= x10 + y10 邏輯尺:邏輯尺:0 0 1 1 0 1 1 1 0 00 0 1 1 0 1 1 1 0 0X1+Y1X2+Y2X3-Y3余類推33 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10lo

28、gic_rule dw 00dch ;0000,0000,1101,1100logic_rule dw 00dch ;0000,0000,1101,1100 mov bx, 0mov bx, 0 mov cx, 10 mov cx, 10 mov dx, logic_rule mov dx, logic_rulenext: mov ax, xbxnext: mov ax, xbx shr dx, 1 shr dx, 1 jc subtract jc subtract add ax, ybx add ax, ybx jmp short result jmp short result ; ; 向前

29、引用向前引用subtract: subtract: sub ax, ybx sub ax, ybxresult: mov zbx, axresult: mov zbx, ax add bx, 2 add bx, 2 loop next loop next 34總結(jié):這種設(shè)置邏輯尺的方法非常有用。例如要傳輸一批數(shù)據(jù)(定義為一個(gè)數(shù)組),該數(shù)組中含有多個(gè)0元素,為了節(jié)省存儲(chǔ)空間和傳輸時(shí)間,可以選用合適的數(shù)據(jù)結(jié)構(gòu)。比如可以使用壓縮數(shù)據(jù)及邏輯尺的方法,把所有元素按下標(biāo)順序排列,并各用1個(gè)bit表示。設(shè)0元素用0表示,非0元素用1表示。存儲(chǔ)時(shí)只需保存非0元素(壓縮數(shù)組)和邏輯尺,當(dāng)進(jìn)行數(shù)據(jù)傳輸時(shí),若邏輯尺

30、相應(yīng)位為1,則從壓縮數(shù)組中取到非0數(shù)據(jù)并傳送。若邏輯尺相應(yīng)位為0時(shí),只送一個(gè)標(biāo)志,在接收方直接生成數(shù)字0,這樣可以提高傳輸效率35例5.6 試編制一程序:從鍵盤輸入一行字符,要求第一個(gè)鍵入的字符必須是空格符,如不是,則退出程序;如是,則開始接收鍵入的字符并順序存放在首地址為BUFFER的緩沖區(qū)中(空格符不存入),直到接收到第二個(gè)空格符時(shí)退出程序。 20H20H L36datarea segment buffer db 80 dup(?)flag db ?datarea endsprognam segment assume cs:prognam,ds:datareastart: mov ax,d

31、atarea mov ds,ax lea bx,buffermov flag,0next: mov ah,1 int 21h test flag,01h jnz follow cmp al,20h jnz exit mov flag,1 jmp nextfollow: cmp al,20h jz exit mov bx, al inc bx jmp nextexit: mov ah, 4ch int 21h prognam ends end start 設(shè)置標(biāo)志狀態(tài),0表示開始接受輸入,1表示隨后的正常輸入37例:在字型無序表中找出最大數(shù)和最小數(shù),并分別存入MAX和MIN單元。算法分析:把表中

32、第一個(gè)元素分別作為最大數(shù)和最小數(shù),與下一個(gè)元素比較,若下一個(gè)元素比該元素大,則把下一個(gè)元素作為最大數(shù),繼續(xù)進(jìn)入下一輪比較;若下一個(gè)元素比該元素小,則把下一個(gè)元素作為最小數(shù),繼續(xù)進(jìn)入下一輪比較直至遍歷整個(gè)表,最后保留下來的兩個(gè)數(shù)就分別是表中的最大數(shù)和最小數(shù)。本例采用DO_UNTIL結(jié)構(gòu)實(shí)現(xiàn)。38程序:STACKSG SEGMENT STACK STK DW 32 DUP(S)STACKSG ENDSDATA SEGMENTBUFFER DW 500,30,56,77,999,67,433, 5675,0,9999;無序表 DW 3455,6578,32766,8,0, 32560,45,889,

33、5665,09CN DW ($-BUFFER)/2 ;元素個(gè)數(shù)MAX DW ?;存放最大數(shù)單元MIN DW ? ;存放最小數(shù)單元DATA ENDS39CODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,BUFFER ;初始化地址指針 MOV CX,CN ;元素個(gè)數(shù) MOV AX,SI ;取第一數(shù) MOV MAX,AX ;初始化最大數(shù) MOV MIN,AX ;初始化最小數(shù)40COMP: ADD SI,2 ;修改地址指針 MOV AX,SI;取

34、下一個(gè)數(shù) CMP AX,MAX;與當(dāng)前的最大數(shù)比較 JLE NEXT ;若小于轉(zhuǎn) MOV MAX,AX ;若大于則把此數(shù)作為最大數(shù)保存 JMP SHORT LOPNEXT: CMP AX,MIN;與當(dāng)前的最小數(shù)比較 JGE LOP ;若大于轉(zhuǎn) MOV MIN,AX ;若小于則把此數(shù)作為最小數(shù)保存LOP: LOOP COMP;決定循環(huán)繼續(xù)還是終止 RETMAIN ENDPCODE ENDS END MAIN41例:自定義一個(gè)按降序排列的字型數(shù)組,在數(shù)組中查找指定的數(shù)字,若找到在屏幕上顯示“Duplication!”,否則插入該數(shù)字在適當(dāng)位置并繼續(xù)保持?jǐn)?shù)組有序,且顯示“Inserted!”。算法:

35、先使用字符串指令進(jìn)行塊 查找,若找到則顯示“Duplication!”后退出。若未找到則從數(shù)組中第一個(gè)數(shù)開始比較。由于數(shù)組是降序的,所以當(dāng)數(shù)組中當(dāng)前元素比指定數(shù)字小時(shí),說明該數(shù)組中無指定數(shù)字,則應(yīng)插入之,且顯示“Inserted!”。否則把數(shù)據(jù)前移一個(gè)位置,為以后要插入的數(shù)據(jù)騰出空間,繼續(xù)循環(huán)對(duì)下一個(gè)數(shù)進(jìn)行比較. 這是一個(gè)初始循環(huán)次數(shù)不定、根據(jù)條件控制循環(huán)的例子42程序:DATA SEGMENTPRT DB Duplication,$INS DB Inserted!,$X DW ? ;為數(shù)據(jù)移動(dòng)預(yù)留空間TAB DW 889,754,589,546,52,31 ;降序數(shù)組CT EQU ($-TA

36、B)/2 ;元素個(gè)數(shù)N DW 234 ;要插入的數(shù)字DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA43 PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,TAB;裝入表首址 MOV AX,N;要插入的數(shù)字 MOV CX,CT;個(gè)數(shù) CLD REPNZ SCASW JE A;找到轉(zhuǎn) MOV SI,0COMPARE:CMP TABSI,AX ;比較44 JL B MOV BX,TABSI ;元素前移為插入的數(shù)字騰位置 MOV TABSI-2,BX AD

37、D SI,2 ;修改地址指針 JMP SHORT COMPAREA: MOV AH,9H LEA DX,PRT INT 21H JMP EXITB: MOV TABSI-2,AX ;插入元素 MOV AH,9 LEA DX,INS INT 21HEXIT: RET MAIN ENDPCODE ENDS END MAIN455.1.3 5.1.3 多重循環(huán)程序設(shè)計(jì)多重循環(huán)程序設(shè)計(jì)有些比較復(fù)雜的問題使用一重循環(huán)可能無法解決,此時(shí)就需要設(shè)計(jì)多重循環(huán)程序。對(duì)于多重循環(huán)程序設(shè)計(jì),需要注意循環(huán)初始設(shè)置、循環(huán)入口、循環(huán)控制條件的修改等;還要注意內(nèi)、外循環(huán)體不能交叉;在每次通過外層循環(huán)再次進(jìn)入內(nèi)層循環(huán)時(shí),內(nèi)層

38、循環(huán)的初始條件必須重新設(shè)置46一個(gè)簡單延時(shí)程一個(gè)簡單延時(shí)程序:(雙重循環(huán))序:(雙重循環(huán)) mov cx,100n_start: mov dx,0ffffhn_loop: dec dx jnz n_loop dec cx jnz n_start外循環(huán)初始化外循環(huán)初始化內(nèi)循環(huán)初始化內(nèi)循環(huán)初始化內(nèi)層循環(huán)體內(nèi)層循環(huán)體外層循環(huán)體外層循環(huán)體內(nèi)循環(huán)結(jié)束內(nèi)循環(huán)結(jié)束外循環(huán)結(jié)束外循環(huán)結(jié)束NNYY47例5.7:有一個(gè)首地址為A的N字?jǐn)?shù)組,請(qǐng)編程使該數(shù)組中的數(shù)按照從小到大的次序排序分析:采用起泡排序算法。從第一個(gè)數(shù)據(jù)開始依次對(duì)相鄰兩個(gè)數(shù)進(jìn)行比較,如次序?qū)t不做任何操作;如次序不對(duì)則使這兩個(gè)數(shù)交換位置。第一遍進(jìn)行(N

39、-1)次比較后最大的數(shù)放到了最后;第二遍進(jìn)行(N-2)次比較;總共最多進(jìn)行(N-1)遍比較就可以完成排序還可以采用設(shè)立測試標(biāo)志的方法來進(jìn)行起泡排序48例例: 將首地址為將首地址為A的字?jǐn)?shù)組從小到大排序的字?jǐn)?shù)組從小到大排序32,85,16,15, 832,85,16,15, 8 (冒泡算法,多重循環(huán))(冒泡算法,多重循環(huán)) 序號(hào) 數(shù)比比 較較 遍遍 數(shù)數(shù)1234 1 32 2 85 3 16 4 15 5 832161588516158328515816328581516328549 mov cx, 5 ; mov cx, 5 ;元素個(gè)數(shù)元素個(gè)數(shù) dec cx ;dec cx ;比較遍數(shù)比較遍數(shù)

40、: : mov bx, 0mov bx, 0: : mov ax, Abx ; mov ax, Abx ;相鄰兩數(shù)相鄰兩數(shù) cmp ax, Abx+2 ; cmp ax, Abx+2 ; 比較比較 jle continuejle continue xchg ax, Abx+2 ; xchg ax, Abx+2 ;交換位置交換位置 mov Abx, axmov Abx, axcontinue:continue: add bx, 2 add bx, 2 loop loop loop loop 50作業(yè):Page193194 5.95.165.2 5.2 分支程序設(shè)計(jì)分支程序設(shè)計(jì)5.2.1 分支程序

41、的結(jié)構(gòu)形式不滿足滿足IFTHENELSE結(jié)構(gòu)CASE結(jié)構(gòu)條件條件C112nC2Cn5.2.2 5.2.2 分支程序設(shè)計(jì)方法分支程序設(shè)計(jì)方法(1) 邏輯尺控制邏輯尺控制(2) 條件控制條件控制(3) 地址跳躍表地址跳躍表(值與地址有對(duì)應(yīng)關(guān)系的表)(值與地址有對(duì)應(yīng)關(guān)系的表)常用的分支方法:常用的分支方法:在實(shí)際程序設(shè)計(jì)中,很少有程序會(huì)從頭到尾都是順序執(zhí)行的,在實(shí)際程序設(shè)計(jì)中,很少有程序會(huì)從頭到尾都是順序執(zhí)行的,絕大部分程序在執(zhí)行過程中會(huì)根據(jù)一些條件的判斷決定不同的絕大部分程序在執(zhí)行過程中會(huì)根據(jù)一些條件的判斷決定不同的處理方式或程序流向,這就是分支的概念。處理方式或程序流向,這就是分支的概念。程序的

42、流向是由程序的流向是由CS和和IP中的值決定的,中的值決定的,當(dāng)程序的轉(zhuǎn)移僅在同一當(dāng)程序的轉(zhuǎn)移僅在同一段內(nèi)進(jìn)行時(shí),只需修改偏移地址段內(nèi)進(jìn)行時(shí),只需修改偏移地址IP的值;如果程序的轉(zhuǎn)移是在的值;如果程序的轉(zhuǎn)移是在不同段之間進(jìn)行,則段基址不同段之間進(jìn)行,則段基址CS和偏移地址和偏移地址IP均需要修改。均需要修改。兩要素兩要素:一是分支前的條件判斷;二是根據(jù)判斷結(jié)果進(jìn)行轉(zhuǎn)移。一是分支前的條件判斷;二是根據(jù)判斷結(jié)果進(jìn)行轉(zhuǎn)移。 在附加段中,有一個(gè)按從小到大順序排列的無符號(hào)字?jǐn)?shù)組,其首地址存放在DI寄存器中,數(shù)組中的第一個(gè)單元存放著數(shù)組長度。在AX中有一個(gè)無符號(hào)數(shù),要求在數(shù)組中查找(AX),如找到,則使C

43、F = 0,并在SI中給出該元素在數(shù)組中的偏移地址;如未找到,則使CF = 1。 54data segmentdata segmentarray dw 12,11,22,33,44,55,66,array dw 12,11,22,33,44,55,66, 77,88,99,111,222,333 77,88,99,111,222,333number dw 55number dw 55low_idx dw ?low_idx dw ?high_idx dw ?high_idx dw ?data endsdata ends例題例題5.9 折半查找算法(折半查找算法(P P177177)搜索前,先查找

44、兩端的元素值56 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9101011111212 57 lea di, array mov ax, number ;要查找數(shù)要查找數(shù) cmp ax, di+2 ;(ax)(ax)與第一個(gè)元素比較與第一個(gè)元素比較 ja chk_last lea si, di+2 je exit ;(ax)(ax)第一個(gè)元素第一個(gè)元素, ,找到退出找到退出 stc jmp exit ;(ax)(ax)(ax)最后一個(gè)元素最后一個(gè)元素, ,未找到退出未找到退出58compare:compare: cmp ax, bx+si cmp ax, bx

45、+si je exit je exit ja higher ja higher dec cxdec cx mov high_idx, cx mov high_idx, cx jmp mid jmp midhigher:higher: inc cxinc cx mov low_idx, cx mov low_idx, cx jmp mid jmp midno_match:no_match: stc stcexit:exit: search:search: mov low_idx, 1 mov low_idx, 1 mov bx, di mov bx, di mov high_idx, bx mov high_idx, bx mov bx, di mov bx, dimid:mid: mov cx, low_idx mov cx, low_idx mov dx, high_idx mov dx, high_idx cmp cx, dx cmp cx, dx ja no_match ja no_match add cx, dx add cx, dx shr cx, 1 shr cx, 1 mov si, cx mov si, cx shl

溫馨提示

  • 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)論