版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、glut_c 2013-08 j.cb13.3. 程序的基本結(jié)構(gòu)程序的基本結(jié)構(gòu)最基本的程序結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。ab順序結(jié)構(gòu)分支結(jié)構(gòu)判斷abnyabc1abc2abc3子程序、中斷服務(wù)程序是一種特殊的程序,它們也是由以上子程序、中斷服務(wù)程序是一種特殊的程序,它們也是由以上三種基本結(jié)構(gòu)構(gòu)成的。三種基本結(jié)構(gòu)構(gòu)成的。i=初值a修改并判斷i yn循環(huán)結(jié)構(gòu)bglut_c 2013-08 j.cb23.3.1 簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序設(shè)計(jì)例:編寫(xiě)程序?qū)⒆肿兞縲中的無(wú)符號(hào)數(shù)w=65525除以8,將商保存在字變量qout中,將余數(shù)保存在字節(jié)變量rema中。算法分析:可以使用除法指令,也可以使用右移三
2、位實(shí)現(xiàn)除以8的運(yùn)算。65525 0fff5h 1111 1111 1111 0101b(1)右移3位,移出的三位就是余數(shù),剩余的就是商。余數(shù)的保留:可以選擇兩種方法glut_c 2013-08 j.cb31111 1111 1111 0101crema01111 1111 1111 010c1000 0000001111 1111 1111 01c0100 0000000111 1111 1111 0c1010 00001010 0000右移右移5位位00000101glut_c 2013-08 j.cb4開(kāi)始開(kāi)始定義定義w、qout、remaaxw, bl 0ax右移右移1位,最低位移進(jìn)位,
3、最低位移進(jìn)cbl右移右移1位,位,c移入它的最高位移入它的最高位ax右移右移1位,最低位亦如位,最低位亦如cbl右移右移1位,位,c移入最高位移入最高位ax右移右移1位,最低位亦如位,最低位亦如cbl右移右移1位,位,c移入最高位移入最高位qputaxbl右移右移5位位,rema bl結(jié)束結(jié)束使用偽指令定義使用偽指令定義w、qout、rema三個(gè)內(nèi)存三個(gè)內(nèi)存單元,單元,w、qout為為16位,位,rema為為8位。位。這里的結(jié)束是結(jié)束這里的結(jié)束是結(jié)束應(yīng)用程序,返回操應(yīng)用程序,返回操作系統(tǒng)。作系統(tǒng)??梢允褂每梢允褂胕nt 21h的的 4ch號(hào)功能調(diào)號(hào)功能調(diào)用返回操作系統(tǒng)用返回操作系統(tǒng) mov a
4、h,4ch int 21hglut_c 2013-08 j.cb5data segment datawdw 65525qout dw?rema db?data endscode segment codeassume cs:code, ds:datastart:movax,data;取數(shù)據(jù)段開(kāi)始地址movds,ax;數(shù)據(jù)段開(kāi)始地址送數(shù)據(jù)段基址寄存器movax,w;從存儲(chǔ)器取出ds:waxmovbl,0;余數(shù)寄存器清0sarax,1;算術(shù)右移1位,符號(hào)不變,w最低位進(jìn)入crcrbl,1;帶進(jìn)位循環(huán)右移1位,c進(jìn)入bl最高位sarax,1;算術(shù)右移1位,符號(hào)不變,w次低位進(jìn)入crcrbl,1;帶進(jìn)位
5、循環(huán)右移1位sarax,1;算術(shù)右移1位,符號(hào)不變,w次低位進(jìn)入crcrbl,1;帶進(jìn)位循環(huán)右移1位,余數(shù)在bl高3位movcl,5數(shù)據(jù)段結(jié)束數(shù)據(jù)段結(jié)束代碼段開(kāi)始代碼段開(kāi)始數(shù)據(jù)段開(kāi)始數(shù)據(jù)段開(kāi)始glut_c 2013-08 j.cb6sarbl,cl;余數(shù)右移5位,將其移到bl低3位movqout,ax;保存商movrema,bl;保存余數(shù)movah, 4chint21hcode endsend本程序是返回操作系統(tǒng)本程序是返回操作系統(tǒng)代碼段結(jié)束代碼段結(jié)束匯編源程序結(jié)束匯編源程序結(jié)束glut_c 2013-08 j.cb7還有就是:還有就是:w直接取低直接取低3位作為位作為余數(shù)余數(shù)然后然后w右移右
6、移3位得到位得到商商開(kāi)始開(kāi)始定義定義w、qout、remaaxw ,rema 7rema rema and alax右移右移3位位qout ax 開(kāi)始開(kāi)始ax右移右移3位:位:mov cl ,3sar ax , cl注意:如果是帶符號(hào)數(shù),注意:如果是帶符號(hào)數(shù),就要用算術(shù)右移就要用算術(shù)右移sar,不要不要用邏輯右移用邏輯右移shr對(duì)于無(wú)符號(hào)數(shù),則可用對(duì)于無(wú)符號(hào)數(shù),則可用sar或或shr這里選用這里選用sarglut_c 2013-08 j.cb8mov ax,w;從變量從變量w取數(shù)據(jù)取數(shù)據(jù)mov rema, 7;余數(shù)變量余數(shù)變量remap賦值賦值00000111bandrema,al;余數(shù)是余數(shù)
7、是al的的 最低最低3位,位,mov cl,3;sarax, cl;算術(shù)右移算術(shù)右移3位,符號(hào)不變,位,符號(hào)不變,ax中得到商中得到商mov qout,ax;保存商保存商mov ah, 4chint21h該程序結(jié)果相同,但程序代碼簡(jiǎn)單了,執(zhí)行速度也快了該程序結(jié)果相同,但程序代碼簡(jiǎn)單了,執(zhí)行速度也快了glut_c 2013-08 j.cb9(2) 使用除法指令使用除法指令div src注意:對(duì)于注意:對(duì)于8086處理器處理器為了商是字?jǐn)?shù)據(jù),為了商是字?jǐn)?shù)據(jù),被除數(shù)被除數(shù)32位:位:dxax(dx0,axw) 除數(shù)除數(shù)16位位 bx8div bx 商在商在ax,余數(shù)在余數(shù)在dx,對(duì)于本次運(yùn)算,余,對(duì)
8、于本次運(yùn)算,余數(shù)為字節(jié)數(shù)據(jù),實(shí)際上只有數(shù)為字節(jié)數(shù)據(jù),實(shí)際上只有dl有效有效 .dataw dw 65525qout dw ?rema db ?.codemovax, datamovds, axmov dx,0mov ax,wmov bx,8div bxmov qout, axmov rema, dlmovah, 4chint 21hend如果是帶符號(hào)數(shù),應(yīng)該使如果是帶符號(hào)數(shù),應(yīng)該使用符號(hào)擴(kuò)展指令用符號(hào)擴(kuò)展指令cwd和帶和帶符號(hào)除法指令符號(hào)除法指令idiv由于題目指定是無(wú)符號(hào)數(shù),由于題目指定是無(wú)符號(hào)數(shù),這里可以將高這里可以將高16位擴(kuò)展為位擴(kuò)展為0,用,用div除法指令除法指令glut_c 20
9、13-08 j.cb10例例 將將axax中的中的3 3位位bcdbcd數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)存入字節(jié)變量存入字節(jié)變量sbsb中中(ax(ax中的數(shù)大于中的數(shù)大于0 0,小于,小于255)255)每位十進(jìn)制用一個(gè)每位十進(jìn)制用一個(gè)8421編碼(自然二進(jìn)制編碼)表示(即每編碼(自然二進(jìn)制編碼)表示(即每一位十進(jìn)制數(shù)都是用二進(jìn)制表示)一位十進(jìn)制數(shù)都是用二進(jìn)制表示)十進(jìn)制數(shù)的展開(kāi)表達(dá)式十進(jìn)制數(shù)的展開(kāi)表達(dá)式3位位bcd碼碼n2n1n00alah012012210)10(1010nnnnnnnglut_c 2013-08 j.cb11主要部分程序流程圖al=al+ahal=al*chahblal
10、=百位百位*10既執(zhí)行既執(zhí)行al=al*chal=bl and 0fhal=al+bl因百位因百位*10不會(huì)大于不會(huì)大于255,ah=0,可以,可以使用使用ah右移右移4位,高位位,高位補(bǔ)補(bǔ)0得到十位數(shù)得到十位數(shù)alsb保留各位十位到保留各位十位到bl取百位到取百位到alalahch 10,cl=4ah=blah右移右移4位得到十位位得到十位由于題目給出不大由于題目給出不大于于255,因此最后一,因此最后一次乘次乘10加個(gè)位也只加個(gè)位也只是一個(gè)字節(jié)相加是一個(gè)字節(jié)相加glut_c 2013-08 j.cb12m0v ch,10m0v ch,10mov cl,4mov cl,4mov bl,al
11、mov bl,al ;暫存十位和個(gè)位到;暫存十位和個(gè)位到bl,bl,mov al,ah mov al,ah ; ; 百位存入百位存入alal中中mul ch mul ch ;百位;百位1010axaxmov ah,blmov ah,blshr ah,cl shr ah,cl ;取十位;取十位add al,ah add al,ah ;百位;百位10 + 10 + 十位十位alalmul ch mul ch ;( (百位百位10 + 10 + 十位十位) )10 10 axaxand bl,0fh and bl,0fh ;取個(gè)位;取個(gè)位add al,bl add al,bl ;( (百位百位10
12、+ 10 + 十位十位)10 +10 +個(gè)位個(gè)位alal ;約定結(jié)果不大于約定結(jié)果不大于255255mov sb,al mov sb,al ; alsb,alsb,如果沒(méi)有明確結(jié)果不大于如果沒(méi)有明確結(jié)果不大于255255,則需要考慮,則需要考慮1616位結(jié)果位結(jié)果glut_c 2013-08 j.cb130999的的bcd數(shù)轉(zhuǎn)換為二進(jìn)制,主要部分程序流程圖數(shù)轉(zhuǎn)換為二進(jìn)制,主要部分程序流程圖al取百位取百位ax百位百位*10ah取十位取十位百位百位*10+十位十位al=al+ahax=al*10bl=bl and 0fhax=ax+bx因百位因百位*10不會(huì)大于不會(huì)大于255,ah=0,可以使用
13、,可以使用ah右移右移4位,高位補(bǔ)位,高位補(bǔ)0得得到十位數(shù)到十位數(shù)axsbsb應(yīng)該是字操作數(shù)(應(yīng)該是字操作數(shù)(16位)位)bh要清要清0ax為為000999之間的之間的bcd數(shù)數(shù)glut_c 2013-08 j.cb14m0v ch,10m0v ch,10mov cl,4mov cl,4mov bl,al mov bl,al ;暫存十位和個(gè)位到;暫存十位和個(gè)位到bl,bl,mov al,ah mov al,ah ; ; 百位存入百位存入alal中中mul ch mul ch ;百位;百位1010axaxmov ah,blmov ah,blshr ah,cl shr ah,cl ;取十位;取十位
14、add al,ah add al,ah ;百位;百位10 + 10 + 十位十位alalmul ch mul ch ;(;(百位百位10 + 10 + 十位十位)10 10 axaxand bl,0fh and bl,0fh ;取個(gè)位;取個(gè)位mov bx,0 mov bx,0 ; bh=0; bh=0,add ax,bx add ax,bx ;( (百位百位10 + 10 + 十位十位)10 +10 +個(gè)位個(gè)位sbsb ;最后結(jié)果為;最后結(jié)果為1616位數(shù),不能簡(jiǎn)單位數(shù),不能簡(jiǎn)單+ +低低8 8位位mov sb,ax mov sb,ax ;axaxsbsbglut_c 2013-08 j.cb
15、15 簡(jiǎn)單程序設(shè)計(jì)簡(jiǎn)單程序設(shè)計(jì)例例下面再看幾個(gè)補(bǔ)充的例題。下面再看幾個(gè)補(bǔ)充的例題。例例 :將存儲(chǔ)器單元:將存儲(chǔ)器單元dat1中保存的一個(gè)組合中保存的一個(gè)組合bcd數(shù)轉(zhuǎn)換成兩個(gè)數(shù)轉(zhuǎn)換成兩個(gè)對(duì)應(yīng)對(duì)應(yīng)ascii碼值,并存入碼值,并存入dat2開(kāi)始的兩個(gè)單元,低位在前,高開(kāi)始的兩個(gè)單元,低位在前,高位在后。位在后。glut_c 2013-08 j.cb16bcd碼轉(zhuǎn)換成碼轉(zhuǎn)換成ascii碼數(shù)據(jù):碼數(shù)據(jù):非壓縮非壓縮bcd數(shù)據(jù)在高半字節(jié)數(shù)據(jù)在高半字節(jié)+3.例如數(shù)字例如數(shù)字55:0000 0101 0011 0101 0000 0101 0011 0000 0011 0101 用邏輯或指令用邏輯或指令or
16、 or 0000 0101 0011 0000 0011 0101 用加法指令用加法指令or + 得到的結(jié)果是相同的。都是在高半字節(jié)加得到的結(jié)果是相同的。都是在高半字節(jié)加3。glut_c 2013-08 j.cb17該問(wèn)題算法就很簡(jiǎn)單:該問(wèn)題算法就很簡(jiǎn)單: 從從dat1取出取出bcd數(shù)據(jù),先將高數(shù)據(jù),先將高4位清位清“0”,與,與30h相加或相加或進(jìn)行邏輯或,存入進(jìn)行邏輯或,存入dat2,再取出數(shù)據(jù),將數(shù)據(jù)邏輯右移,再取出數(shù)據(jù),將數(shù)據(jù)邏輯右移4位位(高位(高位bcd數(shù)移到低數(shù)移到低4位,高位,高4位變位變“0”,再與,再與30h相加(或進(jìn)相加(或進(jìn)行邏輯或),存入行邏輯或),存入dat2+1單
17、元。單元。程序流程圖:程序流程圖:glut_c 2013-08 j.cb18 程序流程圖程序代碼data segment dat1 db 34h;待轉(zhuǎn)換的數(shù)dat2 db ?,?data endscode segmentassume cs:code, ds:datastara: mov ax, data mov ds, ax;送段地址 lea si,dat1 lea di,dat2 mov al,si and al, 0fh add al,30h mov di,al mov al,si 開(kāi)始段定義al(si )al(al)�fh(di)(al)+30hal(si )結(jié)束al(al)
18、右移4位(di+1)(al)+30h設(shè)置ds,sidat1didat2顯示:顯示:mov dl,almov ah,02hint 21hglut_c 2013-08 j.cb19 mov cl,4 shr al,cl orl al, 30h mov di+1, al mov ah,4ch int 21h code ends end start如果要送到屏幕顯示,則將轉(zhuǎn)換結(jié)果先送如果要送到屏幕顯示,則將轉(zhuǎn)換結(jié)果先送dl,02送送ah,調(diào),調(diào)用用dos功能。功能。送送ascii字符顯示的系統(tǒng)調(diào)用:字符顯示的系統(tǒng)調(diào)用:功能功能ah=02h,需要顯示的字符需要顯示的字符ascii碼碼dl ,執(zhí)行執(zhí)行 i
19、nt 21h顯示:mov dl,almov ah,02hint 21hah=4ch功能調(diào)用。功能是結(jié)束本程序,返回dosglut_c 2013-08 j.cb20再看一個(gè)順序程序: 編寫(xiě)一個(gè)計(jì)算z=(x2-3y)/2的程序,x,y為單字節(jié)正整數(shù),z用2字節(jié)保存。這是一個(gè)算術(shù)運(yùn)算程序,算法設(shè)計(jì):首先計(jì)算 x2=x*x, 暫存該結(jié)果,其次計(jì)算 3*y,第三步計(jì)算 x2-3*y第四步計(jì)算 (x2-3y)/2。該步使用算術(shù)右移實(shí)現(xiàn)除2運(yùn)算,比用除法指令執(zhí)行速度快。依據(jù)該算法,可以畫(huà)出程序流程框圖。glut_c 2013-08 j.cb21開(kāi)始計(jì)算z=x*x計(jì)算z=(x*x-3y)/2結(jié)束計(jì)算3*yx2
20、的計(jì)算,可以分解為3*y的計(jì)算,可以分解為alxmul albxaxcxaxadd ax,cxadd ax,cxaly,ah=0glut_c 2013-08 j.cb22;數(shù)據(jù)段定義data segmentxdb 25ydb 32zdw?data ends;代碼段開(kāi)始code segmentassume cs:code, ds:data expre proc far ;過(guò)程定義,遠(yuǎn)過(guò)程start: push ds ;ds:00保存的是一條返回 sub ax,ax ;dos 指令。 push ax ;這里,將返回dos的地址 ;壓入堆棧 mov ax,data操作系統(tǒng)會(huì)自動(dòng)在操作系統(tǒng)會(huì)自動(dòng)在ds
21、:00處安排一條返回操作系處安排一條返回操作系統(tǒng)的指令,故子程序開(kāi)統(tǒng)的指令,故子程序開(kāi)始處向堆棧中壓入始處向堆棧中壓入 ds:00執(zhí)行執(zhí)行ret指令,則就是指令,則就是轉(zhuǎn)到轉(zhuǎn)到ds:00返回返回dosglut_c 2013-08 j.cb23mov ds,ax;數(shù)據(jù)段首地址(基地址)mov al , x;取變量x mov bl,almul bl;x*x=x2mov bx,ax mov al , y;取變量ymov ah,0;正整數(shù),高字節(jié)直接擴(kuò)展0 mov cx,axadd ax ,cx;2yadd ax, cx;3yxchg ax, bx sub ax ,bx ;x2-3yshr ax ,1
22、; 右移一位 /2mov z , axret;將ds:00彈出到cs:ip expre endp ;過(guò)程定義結(jié)束 code endsend startret 指令,轉(zhuǎn)到ds:00,對(duì)于exe格式程序,它是一條返回dos的指令。glut_c 2013-08 j.cb24;數(shù)據(jù)段定義data segmentxdb 25ydb 32zdw?data ends;代碼段開(kāi)始code segmentassume cs:code, ds:data mov ax , datamov ds , axmov al , xmov bl , al可以使用常規(guī)返回dos方法 int 21h的4ch功能調(diào)用glut_c
23、2013-08 j.cb25mul bl;x*x=x2mov bx , ax mov al , y;ymov ah , 0 mov cx , axadd ax , cx;2yadd ax , cx;3yxchg ax , bx sub ax , bx ;x2-3yshr ax ,1; 右移一位 /2mov z , axmov ah , 4chint 21hexpre endp ;過(guò)程定義結(jié)束 code endsend start用int 21 的4ch號(hào)功能調(diào)用返回dos。glut_c 2013-08 j.cb26例 bcd加法程序例如:已知字變量w1、w2分別存放兩個(gè)非壓縮的bcd數(shù),編寫(xiě)程
24、序求兩數(shù)之和,并將結(jié)果存入sum字變量中。注意:w!,w2為2為字變量(2字節(jié))壓縮bcd數(shù),0099,它們的和則可能為3位bcd數(shù),故sum應(yīng)該定義3個(gè)字節(jié)(用db定義三個(gè)字節(jié))。計(jì)算機(jī)內(nèi)部只有二進(jìn)制運(yùn)算指令,對(duì)于bcd數(shù)運(yùn)算,是十進(jìn)制數(shù),用二進(jìn)制運(yùn)算指令運(yùn)算,需要進(jìn)行調(diào)整。加法、減法、乘法在運(yùn)算后進(jìn)行調(diào)整除法在運(yùn)算前先進(jìn)行調(diào)整。 只有字節(jié)運(yùn)算才能進(jìn)行調(diào)整 非壓縮bcd數(shù)加法調(diào)整 aaa(壓縮bcd數(shù)加法用daa)glut_c 2013-08 j.cb27l壓縮bcd加法后,用daa調(diào)整l非壓縮bcd加法后,用aaa調(diào)整l壓縮bcd減法后,用das調(diào)整l非壓縮bcd加法后,用aas調(diào)整l壓縮
25、bcd加法后,用aam調(diào)整l(壓縮的bcd乘法,不能調(diào)整)l除法指令前用aad調(diào)整(存放在ax中的兩位非壓縮bcd數(shù))開(kāi)始開(kāi)始定義定義w1、w2、sumalw1第一字節(jié)(個(gè)位)第一字節(jié)(個(gè)位)add al,w2第一字節(jié),第一字節(jié),aaac送送sum+2最低位最低位 (百位)(百位)結(jié)束結(jié)束sumalalw1第二字節(jié)(十位)第二字節(jié)(十位)adc al,w2第二字節(jié),第二字節(jié),aaasum+1al將將sum+2清清0,然后進(jìn),然后進(jìn)行帶進(jìn)位的循環(huán)左移,行帶進(jìn)位的循環(huán)左移,就可將就可將cy移進(jìn)移進(jìn)sum+2最低位,其余位最低位,其余位=0glut_c 2013-08 j.cb28例如例如:0809
26、+0607=01 05 060809+0607=01 05 06,程序段如下:,程序段如下:data segment data segment w1 dw 0809hw1 dw 0809hw2 dw 06078hw2 dw 06078hsum db 3 dup(0)sum db 3 dup(0)data endsdata endscode segmentcode segment assume cs:code,ds:data,ss:stack assume cs:code,ds:data,ss:stack mov ax,data mov ax,data mov ds,ax mov ds,ax ;
27、 ; mov al,byte ptr w1 mov al,byte ptr w1 ;取第一個(gè)數(shù),;取第一個(gè)數(shù),alal09h09h add add al,byte ptr w2al,byte ptr w2 ; al; al09h+07=10h,af=109h+07=10h,af=1 aaa aaa ;alal06h,06h,產(chǎn)生產(chǎn)生cf=1cf=1 mov sum,al mov sum,al ;保存?zhèn)€位,進(jìn)位信號(hào)在;保存?zhèn)€位,進(jìn)位信號(hào)在cfcf mov al,byte ptr w1+1 mov al,byte ptr w1+1 ;alal08h08h glut_c 2013-08 j.cb29
28、 adc adc al,byte ptr w2+1 al,byte ptr w2+1 ; al; al0fh, cf=00fh, cf=0 aaa aaa ;alal05h, cf=105h, cf=1 mov sum+1,al mov sum+1,al ;存百位和千位;存百位和千位 mov sum+2,0 mov sum+2,0 ; ;處理向百位的進(jìn)位,先將處理向百位的進(jìn)位,先將sum+2sum+2 rcl um+2,1 rcl um+2,1 ; ;清清0 0,然后用帶進(jìn)位循環(huán)左移指,然后用帶進(jìn)位循環(huán)左移指 ; ;令將進(jìn)位位移到令將進(jìn)位位移到sum+2sum+2最低位最低位實(shí)際上,在實(shí)際上,
29、在sumsum定義時(shí),已經(jīng)初始化為定義時(shí),已經(jīng)初始化為0 0,程序中可以不清,程序中可以不清0 0 定義的變量定義的變量w1w1,w2w2,sumsum在匯編語(yǔ)言源程序中可以直接使用,在匯編語(yǔ)言源程序中可以直接使用,匯編程序在對(duì)源程序進(jìn)行匯編時(shí),可以識(shí)別是從變量所存放的匯編程序在對(duì)源程序進(jìn)行匯編時(shí),可以識(shí)別是從變量所存放的存儲(chǔ)器中取出數(shù)據(jù)存儲(chǔ)器中取出數(shù)據(jù)實(shí)際上就是匯編程直接尋址指令實(shí)際上就是匯編程直接尋址指令 mov al,w1mov al,w1,為了書(shū)寫(xiě)簡(jiǎn)單,我們直接寫(xiě)成為了書(shū)寫(xiě)簡(jiǎn)單,我們直接寫(xiě)成 mov al,w1.mov al,w1.glut_c 2013-08 j.cb30以上例子,有
30、一些只給出了實(shí)現(xiàn)所要求功能的核心部分分代碼,沒(méi)有給出段定義的完整部分。有一些則給出了包含段定義的完整代碼;段定義的格式是相似的,可以參照教材上的例子和前面的段定義例子編寫(xiě)。教材上還有一些順序程序的例子,由于時(shí)間關(guān)系,就不一一列舉了。glut_c 2013-08 j.cb31順序程序的結(jié)構(gòu)簡(jiǎn)單,但實(shí)際程序設(shè)計(jì)中,往往需要對(duì)某些條件進(jìn)行判斷,依據(jù)不同的條件執(zhí)行不同的分支,這樣,順序程序?qū)⒉荒軡M足要求。glut_c 2013-08 j.cb323.3.2 分支程序的設(shè)計(jì)分支程序的設(shè)計(jì) 就是利用cpu的條件轉(zhuǎn)移指令,通過(guò)判斷某個(gè)標(biāo)志為的狀態(tài),控制程序的執(zhí)行過(guò)程。 pf=0pf=0奇轉(zhuǎn)移奇轉(zhuǎn)移jnp/j
31、pojnp/jpopf=1pf=1偶轉(zhuǎn)移偶轉(zhuǎn)移 jp/jpejp/jpeof=0of=0無(wú)溢出轉(zhuǎn)移無(wú)溢出轉(zhuǎn)移jnojnoof=1of=1溢出轉(zhuǎn)移溢出轉(zhuǎn)移jojosf=0sf=0為正轉(zhuǎn)移為正轉(zhuǎn)移jnsjnssf=1sf=1為負(fù)轉(zhuǎn)移為負(fù)轉(zhuǎn)移jsjscf=0cf=0無(wú)進(jìn)無(wú)進(jìn)( (借借) )位轉(zhuǎn)移位轉(zhuǎn)移jncjnccf=1cf=1有進(jìn)有進(jìn)( (借借) )位轉(zhuǎn)移位轉(zhuǎn)移jcjczf=0zf=0不相等不相等/ /不等于不等于0 0轉(zhuǎn)移轉(zhuǎn)移jne/jnzjne/jnzzf=1zf=1相等相等/ /等于等于0 0轉(zhuǎn)移轉(zhuǎn)移je/jzje/jz標(biāo)志設(shè)置標(biāo)志設(shè)置功能功能指令助記符指令助記符glut_c 2013-08
32、 j.cb33二分支結(jié)構(gòu)二分支結(jié)構(gòu)分支結(jié)構(gòu)判斷abnyabc1abc2abc3分支結(jié)構(gòu)判斷bnyabc1abc2glut_c 2013-08 j.cb34多分支結(jié)構(gòu)條件判斷1y程序1n條件判斷2y程序2條件判斷n程序ny程序n+1nnglut_c 2013-08 j.cb35也可以按照條件編碼實(shí)現(xiàn)多分枝轉(zhuǎn)移也可以按照條件編碼實(shí)現(xiàn)多分枝轉(zhuǎn)移例如段內(nèi)間接轉(zhuǎn)移指令例如段內(nèi)間接轉(zhuǎn)移指令jmp reg轉(zhuǎn)移到轉(zhuǎn)移到cs:axjmp word ptr mem轉(zhuǎn)移到轉(zhuǎn)移到cs:memax條件編碼條件編碼codaxax*kjmp ax分支程序分支程序0 分支程序分支程序1分支程序分支程序ncod=0cod=1c
33、od=nk是一個(gè)不小于是一個(gè)不小于2的整數(shù)。的整數(shù)。glut_c 2013-08 j.cb36我們還是通過(guò)實(shí)例來(lái)討論。例:內(nèi)存單元m中有一個(gè)16位的帶符號(hào)數(shù),求它的絕對(duì)值,并將結(jié)果放回原處。 算法:求一個(gè)數(shù)的絕對(duì)值時(shí),如果是正數(shù),絕對(duì)值不變,如果是負(fù)數(shù),則求它的機(jī)器負(fù)數(shù)(連同符號(hào)位一起每位取反,最低位+1,就是使用neg指令)。有了算法,可以畫(huà)出程序流程圖。glut_c 2013-08 j.cb37轉(zhuǎn)移目的轉(zhuǎn)移目的指令給出指令給出標(biāo)號(hào)(符標(biāo)號(hào)(符號(hào)地址)號(hào)地址)開(kāi)始設(shè)置dssi m ax siorl ax,axsf=0neg axnydonesi(ax)結(jié)束n_datan_data,負(fù),負(fù)數(shù),
34、該標(biāo)號(hào)數(shù),該標(biāo)號(hào)為了閱讀程為了閱讀程序方便序方便判斷數(shù)據(jù)的符號(hào),在判斷數(shù)據(jù)的符號(hào),在x86中中就是判斷就是判斷sf標(biāo)志位,數(shù)據(jù)標(biāo)志位,數(shù)據(jù)傳送指令不改變標(biāo)志位,因傳送指令不改變標(biāo)志位,因此用一條邏輯運(yùn)算指令此用一條邏輯運(yùn)算指令orl ax,ax,它不改變它不改變ax的值,但設(shè)置的值,但設(shè)置標(biāo)志位標(biāo)志位sfglut_c 2013-08 j.cb38 data segment m dw 789ah;可以任意輸入一個(gè)數(shù) data endscode segment assume cs:code2,ds:data2start: mov ax,data mov ds,ax lea si, m ;mov s
35、i,offset m mov ax,si orl ax,ax ;and ax,ax jns done ;符號(hào)為sf=0轉(zhuǎn)移到donen_data: neg ax ;負(fù)數(shù),利用neg指令求負(fù)done: mov si,ax mov ah,4ch int 21h code ends end glut_c 2013-08 j.cb39多分支程序?qū)Ψ种С绦?,可以由這種2分支程序構(gòu)成。滿足條件1?nyfun1滿足條件2?滿足條件3?分支4分支3分支2分支1yynnfun2fun3fun4fun5tst2tst1tst3glut_c 2013-08 j.cb40計(jì)算函數(shù)的程序,x是十六位長(zhǎng)度字?jǐn)?shù)據(jù))0(1)
36、0(0)0(1xxxy當(dāng)當(dāng)當(dāng)算法分析:取出數(shù)據(jù)x,判斷它的符號(hào),首先判斷是否=0,如果不是,則是負(fù)數(shù),y=-1,如果是,還須再次判斷是否等于0。程序流程框圖為:glut_c 2013-08 j.cb41開(kāi)始段定義及初始化取數(shù)據(jù)-ax(ax)0?(ax)=0?y=-1y=0y=1結(jié)束yynnlp1lp3lp2end1畫(huà)流程圖的時(shí)候,對(duì)轉(zhuǎn)移目標(biāo)地址(最好是分支程序的兩個(gè)分支點(diǎn))都給出一個(gè)標(biāo)號(hào),在寫(xiě)代碼時(shí)好使用lp0glut_c 2013-08 j.cb42data segment x dw -8 y db ?data endscode segment assume cs:code3, ds:dat
37、a3start: mov ax, data3 ;設(shè)置段基址 mov ds, axlea si, x;取偏移地址mov ax, siand ax,axglut_c 2013-08 j.cb43jns lp1 ;sf=0,轉(zhuǎn)到lp1lp0:mov y,0ffh ;=0,繼續(xù)判斷, ;=0轉(zhuǎn)到lp3lp2:mov y, 01h ;x0時(shí), y=1ljmp end1lp3:mov y,00h ;x=0時(shí),y=0end1: mov ah,4ch ;返回操作系統(tǒng)int 21h code endsend startglut_c 2013-08 j.cb44教材上有一個(gè)例子,0y01y00y01,異號(hào)、,xx
38、xy算法分析:取出數(shù)據(jù)x,y,異或,判斷符號(hào),sf=1,表明符號(hào)異號(hào)z=0;sf=0,表明符號(hào)相同,判斷是否x0,是,z=1,否z=-1。glut_c 2013-08 j.cb45多分支的另一種實(shí)現(xiàn)方法多分支的另一種實(shí)現(xiàn)方法除了用二分支指令實(shí)現(xiàn)多分支外,還可以用以下指令實(shí)現(xiàn):除了用二分支指令實(shí)現(xiàn)多分支外,還可以用以下指令實(shí)現(xiàn):jmp reg ;jmp word ptr mem例如,我們要依據(jù)例如,我們要依據(jù)al中的低中的低4位數(shù)據(jù)(位數(shù)據(jù)(015)不同,分別轉(zhuǎn)移)不同,分別轉(zhuǎn)移到對(duì)應(yīng)的分支去執(zhí)行,每個(gè)分支約定占用到對(duì)應(yīng)的分支去執(zhí)行,每個(gè)分支約定占用200字節(jié)空間。字節(jié)空間。這類(lèi)指令應(yīng)用方法如下
39、:這類(lèi)指令應(yīng)用方法如下:glut_c 2013-08 j.cb46anlal, 0fhmov bl,100mulblmov ax, fun0;jmpaxfun0:.org fun0+100fun1:;fun1-fun0=100;可以用定位偽指令確定每個(gè);分支相距的距離org fun14+100; 只要保證這段空間能存下fun15:; 這段代碼。也可以是一個(gè)轉(zhuǎn)移表,也可以是一個(gè)轉(zhuǎn)移表,利用遠(yuǎn)轉(zhuǎn)移指令轉(zhuǎn)到利用遠(yuǎn)轉(zhuǎn)移指令轉(zhuǎn)到各處理程序,這樣各各處理程序,這樣各功能分值的距離就比功能分值的距離就比較小,而且相距的字較小,而且相距的字節(jié)數(shù)也相同。節(jié)數(shù)也相同。glut_c 2013-08 j.cb47例例
40、3.9 3.9 從鍵盤(pán)上鍵入從鍵盤(pán)上鍵入2 2位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量位十六進(jìn)制數(shù)將其拼合成一個(gè)字節(jié)存入字節(jié)變量sbsb中。中。data segmentdata segmentibuf ibuf db 3,0,3 dup(0)db 3,0,3 dup(0)sbsbdb 0db 0data endsdata endscode segmentcode segmentassume cs:code,ds:dataassume cs:code,ds:datamovmovax,dataax,datamovmovds,axds,axmov dx, offset ibuf mov dx, o
41、ffset ibuf ;鍵入;鍵入2 2位十六進(jìn)制數(shù)位十六進(jìn)制數(shù)mov ah, 10mov ah, 10int 21hint 21hmov ax, word ptr ibuf+2 mov ax, word ptr ibuf+2 ;鍵入字符從;鍵入字符從+2+2單元開(kāi)始,取出送單元開(kāi)始,取出送axaxsub ax, 3030hsub ax, 3030h ;字符變?yōu)槭M(jìn)制數(shù);字符變?yōu)槭M(jìn)制數(shù)cmp al,0ahcmp al,0ahjb lnsub7jb lnsub7;09,ascii-30h09,ascii-30h就是它對(duì)應(yīng)的就是它對(duì)應(yīng)的hexhex值值sub al,7sub al,7;af;
42、af,ascii-37hascii-37h就是它對(duì)應(yīng)的就是它對(duì)應(yīng)的hexhex值值glut_c 2013-08 j.cb48lnsub7:cmp ah,0ahlnsub7:cmp ah,0ahjb lnsub7jb lnsub7sub ah,7sub ah,7hnsub7:mov cl, 4 hnsub7:mov cl, 4 ;將;將axax中的數(shù)拼合成一個(gè)字節(jié)中的數(shù)拼合成一個(gè)字節(jié)shl al ,clshl al ,clor al, ahor al, ahmov sbmov sb,alalmov ah,4chmov ah,4chint 21hint 21hcode endscode endse
43、ndendglut_c 2013-08 j.cb49例例3.10 3.10 某工廠的產(chǎn)品有某工廠的產(chǎn)品有8 8種不同的加工處理程序種不同的加工處理程序p0p0p7p7,根據(jù)鍵,根據(jù)鍵盤(pán)輸入,做不同的處理,若是盤(pán)輸入,做不同的處理,若是0 07 7以外的鍵,則退出加工處理以外的鍵,則退出加工處理 此例可以用兩種方法實(shí)現(xiàn)此例可以用兩種方法實(shí)現(xiàn): :一種是用逐一比較判斷一種是用逐一比較判斷, ,逐次比較轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上逐次比較轉(zhuǎn)移實(shí)現(xiàn)二叉分支、整體上實(shí)現(xiàn)多分支實(shí)現(xiàn)多分支; ; 另一種是跳轉(zhuǎn)表法另一種是跳轉(zhuǎn)表法, ,直接實(shí)現(xiàn)多分支直接實(shí)現(xiàn)多分支. .glut_c 2013-08 j.cb50
44、方法一方法一逐一比較法逐一比較法. .簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移簡(jiǎn)單,條理清楚,易于實(shí)現(xiàn),但轉(zhuǎn)移范圍只能是:范圍只能是:128128127127datadatasegmentsegmentinput db input( 0input db input( 07): $7): $data endsdata endscode segmentcode segmentmovmovax, dataax, datamovmovds,axds,ax mov dx , offset inputmov dx , offset input ; ;顯示提示符顯示提示符 mov ah , 9mov ah , 9;
45、0909號(hào)功能是顯示字符串,號(hào)功能是顯示字符串,$ $是字符串結(jié)束符是字符串結(jié)束符 int 21hint 21h; mov ah , 1mov ah , 1 ;等待鍵入一個(gè)字符到;等待鍵入一個(gè)字符到alal, int 21hint 21h cmp al , cmp al , 0 0 ;為;為0 0字符則轉(zhuǎn)字符則轉(zhuǎn)p0p0 je p0je p0 cmp al , cmp al , 1 1 ;為;為1 1字符則轉(zhuǎn)字符則轉(zhuǎn)p1p1 je p1je p1glut_c 2013-08 j.cb51cmp al ,cmp al ,2 2je p2 je p2 cmp al ,cmp al ,3 3je p
46、3 je p3 cmp al ,cmp al ,4 4 je p4je p4cmp al ,cmp al ,5 5je p5je p5cmp al ,cmp al ,6 6je p6je p6cmp al ,cmp al ,7 7je p7je p7jmp downjmp down ;不是;不是0 07 7則退出程序則退出程序 glut_c 2013-08 j.cb52p0: mov dl ,p0: mov dl , 0 0 ;鍵入;鍵入0 0則執(zhí)行則執(zhí)行p0p0程序規(guī)定的功能程序規(guī)定的功能 jmp exitjmp exitp1: mov dl ,p1: mov dl , 1 1 ;鍵入;鍵入1 1則執(zhí)行則執(zhí)行p1p1程序規(guī)定的功能程序規(guī)定的功能 jmp exitjmp exit p7: mov dl ,p7: mov dl , 7 7 ;鍵入;鍵入7 7則執(zhí)行則執(zhí)行p7p7程序規(guī)定的功能程序規(guī)定的功能 jmp exit jmp exitexit: mov ah ,4ch exit: mov ah
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- NB/T 11536-2024煤礦帶壓開(kāi)采底板井下注漿加固改造技術(shù)規(guī)范
- 《市場(chǎng)調(diào)查課程考核》課件
- 《電化學(xué)催化》課件
- 《小學(xué)生說(shuō)明文》課件
- 單位管理制度集合大合集【職員管理】十篇
- 單位管理制度匯編大合集【職工管理篇】
- 單位管理制度合并匯編職員管理篇
- 《淋巴結(jié)斷層解剖》課件
- 單位管理制度分享合集人事管理
- 單位管理制度范文大合集人員管理十篇
- 汽車(chē)內(nèi)飾件及材料氣味評(píng)價(jià)標(biāo)準(zhǔn)解析
- 紡紗工藝學(xué)課程設(shè)計(jì)
- 廣東省深圳市2023-2024學(xué)年六年級(jí)上學(xué)期英語(yǔ)期中試卷(含答案)
- 人教版五年級(jí)上冊(cè)四則混合運(yùn)算300道及答案
- 汽車(chē)掛靠租賃協(xié)議書(shū)(范本)
- 中外廣告史(第三版) 課件全套 何玉杰 第0-11章 緒論、中國(guó)古代廣告的發(fā)展- 日本廣告的發(fā)展
- 2024中煤礦山建設(shè)集團(tuán)(國(guó)獨(dú)資)招聘200人高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 高中地理選擇性必修2(綜合檢測(cè)卷)(附答案)-2022-2023學(xué)年高二上學(xué)期地理選擇性必修2
- DL∕T 5210.6-2019 電力建設(shè)施工質(zhì)量驗(yàn)收規(guī)程 第6部分:調(diào)整試驗(yàn)
- DL∕T 802.2-2017 電力電纜用導(dǎo)管 第2部分:玻璃纖維增強(qiáng)塑料電纜導(dǎo)管
- 錨索張拉記錄表
評(píng)論
0/150
提交評(píng)論