版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、glut_c 2013-08 j.cb13.3. 程序的基本結構程序的基本結構最基本的程序結構:順序結構、分支結構、循環(huán)結構。ab順序結構分支結構判斷abnyabc1abc2abc3子程序、中斷服務程序是一種特殊的程序,它們也是由以上子程序、中斷服務程序是一種特殊的程序,它們也是由以上三種基本結構構成的。三種基本結構構成的。i=初值a修改并判斷i yn循環(huán)結構bglut_c 2013-08 j.cb23.3.1 簡單程序設計簡單程序設計例:編寫程序將字變量w中的無符號數w=65525除以8,將商保存在字變量qout中,將余數保存在字節(jié)變量rema中。算法分析:可以使用除法指令,也可以使用右移三
2、位實現(xiàn)除以8的運算。65525 0fff5h 1111 1111 1111 0101b(1)右移3位,移出的三位就是余數,剩余的就是商。余數的保留:可以選擇兩種方法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開始開始定義定義w、qout、remaaxw, bl 0ax右移右移1位,最低位移進位,
3、最低位移進cbl右移右移1位,位,c移入它的最高位移入它的最高位ax右移右移1位,最低位亦如位,最低位亦如cbl右移右移1位,位,c移入最高位移入最高位ax右移右移1位,最低位亦如位,最低位亦如cbl右移右移1位,位,c移入最高位移入最高位qputaxbl右移右移5位位,rema bl結束結束使用偽指令定義使用偽指令定義w、qout、rema三個內存三個內存單元,單元,w、qout為為16位,位,rema為為8位。位。這里的結束是結束這里的結束是結束應用程序,返回操應用程序,返回操作系統(tǒng)。作系統(tǒng)。可以使用可以使用int 21h的的 4ch號功能調號功能調用返回操作系統(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;取數據段開始地址movds,ax;數據段開始地址送數據段基址寄存器movax,w;從存儲器取出ds:waxmovbl,0;余數寄存器清0sarax,1;算術右移1位,符號不變,w最低位進入crcrbl,1;帶進位循環(huán)右移1位,c進入bl最高位sarax,1;算術右移1位,符號不變,w次低位進入crcrbl,1;帶進位
5、循環(huán)右移1位sarax,1;算術右移1位,符號不變,w次低位進入crcrbl,1;帶進位循環(huán)右移1位,余數在bl高3位movcl,5數據段結束數據段結束代碼段開始代碼段開始數據段開始數據段開始glut_c 2013-08 j.cb6sarbl,cl;余數右移5位,將其移到bl低3位movqout,ax;保存商movrema,bl;保存余數movah, 4chint21hcode endsend本程序是返回操作系統(tǒng)本程序是返回操作系統(tǒng)代碼段結束代碼段結束匯編源程序結束匯編源程序結束glut_c 2013-08 j.cb7還有就是:還有就是:w直接取低直接取低3位作為位作為余數余數然后然后w右移右
6、移3位得到位得到商商開始開始定義定義w、qout、remaaxw ,rema 7rema rema and alax右移右移3位位qout ax 開始開始ax右移右移3位:位:mov cl ,3sar ax , cl注意:如果是帶符號數,注意:如果是帶符號數,就要用算術右移就要用算術右移sar,不要不要用邏輯右移用邏輯右移shr對于無符號數,則可用對于無符號數,則可用sar或或shr這里選用這里選用sarglut_c 2013-08 j.cb8mov ax,w;從變量從變量w取數據取數據mov rema, 7;余數變量余數變量remap賦值賦值00000111bandrema,al;余數是余數
7、是al的的 最低最低3位,位,mov cl,3;sarax, cl;算術右移算術右移3位,符號不變,位,符號不變,ax中得到商中得到商mov qout,ax;保存商保存商mov ah, 4chint21h該程序結果相同,但程序代碼簡單了,執(zhí)行速度也快了該程序結果相同,但程序代碼簡單了,執(zhí)行速度也快了glut_c 2013-08 j.cb9(2) 使用除法指令使用除法指令div src注意:對于注意:對于8086處理器處理器為了商是字數據,為了商是字數據,被除數被除數32位:位:dxax(dx0,axw) 除數除數16位位 bx8div bx 商在商在ax,余數在余數在dx,對于本次運算,余,對
8、于本次運算,余數為字節(jié)數據,實際上只有數為字節(jié)數據,實際上只有dl有效有效 .dataw dw 65525qout dw ?rema db ?.codemovax, datamovds, axmov dx,0mov ax,wmov bx,8div bxmov qout, axmov rema, dlmovah, 4chint 21hend如果是帶符號數,應該使如果是帶符號數,應該使用符號擴展指令用符號擴展指令cwd和帶和帶符號除法指令符號除法指令idiv由于題目指定是無符號數,由于題目指定是無符號數,這里可以將高這里可以將高16位擴展為位擴展為0,用,用div除法指令除法指令glut_c 20
9、13-08 j.cb10例例 將將axax中的中的3 3位位bcdbcd數轉換為二進制數數轉換為二進制數存入字節(jié)變量存入字節(jié)變量sbsb中中(ax(ax中的數大于中的數大于0 0,小于,小于255)255)每位十進制用一個每位十進制用一個8421編碼(自然二進制編碼)表示(即每編碼(自然二進制編碼)表示(即每一位十進制數都是用二進制表示)一位十進制數都是用二進制表示)十進制數的展開表達式十進制數的展開表達式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不會大于不會大于255,ah=0,可以,可以使用使用ah右移右移4位,高位位,高位補補0得到十位數得到十位數alsb保留各位十位到保留各位十位到bl取百位到取百位到alalahch 10,cl=4ah=blah右移右移4位得到十位位得到十位由于題目給出不大由于題目給出不大于于255,因此最后一,因此最后一次乘次乘10加個位也只加個位也只是一個字節(jié)相加是一個字節(jié)相加glut_c 2013-08 j.cb12m0v ch,10m0v ch,10mov cl,4mov cl,4mov bl,al
11、mov bl,al ;暫存十位和個位到;暫存十位和個位到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 ;取個位;取個位add al,bl add al,bl ;( (百位百位10
12、+ 10 + 十位十位)10 +10 +個位個位alal ;約定結果不大于約定結果不大于255255mov sb,al mov sb,al ; alsb,alsb,如果沒有明確結果不大于如果沒有明確結果不大于255255,則需要考慮,則需要考慮1616位結果位結果glut_c 2013-08 j.cb130999的的bcd數轉換為二進制,主要部分程序流程圖數轉換為二進制,主要部分程序流程圖al取百位取百位ax百位百位*10ah取十位取十位百位百位*10+十位十位al=al+ahax=al*10bl=bl and 0fhax=ax+bx因百位因百位*10不會大于不會大于255,ah=0,可以使用
13、,可以使用ah右移右移4位,高位補位,高位補0得得到十位數到十位數axsbsb應該是字操作數(應該是字操作數(16位)位)bh要清要清0ax為為000999之間的之間的bcd數數glut_c 2013-08 j.cb14m0v ch,10m0v ch,10mov cl,4mov cl,4mov bl,al mov bl,al ;暫存十位和個位到;暫存十位和個位到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 ;取個位;取個位mov bx,0 mov bx,0 ; bh=0; bh=0,add ax,bx add ax,bx ;( (百位百位10 + 10 + 十位十位)10 +10 +個位個位sbsb ;最后結果為;最后結果為1616位數,不能簡單位數,不能簡單+ +低低8 8位位mov sb,ax mov sb,ax ;axaxsbsbglut_c 2013-08 j.cb
15、15 簡單程序設計簡單程序設計例例下面再看幾個補充的例題。下面再看幾個補充的例題。例例 :將存儲器單元:將存儲器單元dat1中保存的一個組合中保存的一個組合bcd數轉換成兩個數轉換成兩個對應對應ascii碼值,并存入碼值,并存入dat2開始的兩個單元,低位在前,高開始的兩個單元,低位在前,高位在后。位在后。glut_c 2013-08 j.cb16bcd碼轉換成碼轉換成ascii碼數據:碼數據:非壓縮非壓縮bcd數據在高半字節(jié)數據在高半字節(jié)+3.例如數字例如數字55:0000 0101 0011 0101 0000 0101 0011 0000 0011 0101 用邏輯或指令用邏輯或指令or
16、 or 0000 0101 0011 0000 0011 0101 用加法指令用加法指令or + 得到的結果是相同的。都是在高半字節(jié)加得到的結果是相同的。都是在高半字節(jié)加3。glut_c 2013-08 j.cb17該問題算法就很簡單:該問題算法就很簡單: 從從dat1取出取出bcd數據,先將高數據,先將高4位清位清“0”,與,與30h相加或相加或進行邏輯或,存入進行邏輯或,存入dat2,再取出數據,將數據邏輯右移,再取出數據,將數據邏輯右移4位位(高位(高位bcd數移到低數移到低4位,高位,高4位變位變“0”,再與,再與30h相加(或進相加(或進行邏輯或),存入行邏輯或),存入dat2+1單
17、元。單元。程序流程圖:程序流程圖:glut_c 2013-08 j.cb18 程序流程圖程序代碼data segment dat1 db 34h;待轉換的數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 開始段定義al(si )al(al)�fh(di)(al)+30hal(si )結束al(al)
18、右移4位(di+1)(al)+30h設置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如果要送到屏幕顯示,則將轉換結果先送如果要送到屏幕顯示,則將轉換結果先送dl,02送送ah,調,調用用dos功能。功能。送送ascii字符顯示的系統(tǒng)調用:字符顯示的系統(tǒng)調用:功能功能ah=02h,需要顯示的字符需要顯示的字符ascii碼碼dl ,執(zhí)行執(zhí)行 i
19、nt 21h顯示:mov dl,almov ah,02hint 21hah=4ch功能調用。功能是結束本程序,返回dosglut_c 2013-08 j.cb20再看一個順序程序: 編寫一個計算z=(x2-3y)/2的程序,x,y為單字節(jié)正整數,z用2字節(jié)保存。這是一個算術運算程序,算法設計:首先計算 x2=x*x, 暫存該結果,其次計算 3*y,第三步計算 x2-3*y第四步計算 (x2-3y)/2。該步使用算術右移實現(xiàn)除2運算,比用除法指令執(zhí)行速度快。依據該算法,可以畫出程序流程框圖。glut_c 2013-08 j.cb21開始計算z=x*x計算z=(x*x-3y)/2結束計算3*yx2
20、的計算,可以分解為3*y的計算,可以分解為alxmul albxaxcxaxadd ax,cxadd ax,cxaly,ah=0glut_c 2013-08 j.cb22;數據段定義data segmentxdb 25ydb 32zdw?data ends;代碼段開始code segmentassume cs:code, ds:data expre proc far ;過程定義,遠過程start: push ds ;ds:00保存的是一條返回 sub ax,ax ;dos 指令。 push ax ;這里,將返回dos的地址 ;壓入堆棧 mov ax,data操作系統(tǒng)會自動在操作系統(tǒng)會自動在ds
21、:00處安排一條返回操作系處安排一條返回操作系統(tǒng)的指令,故子程序開統(tǒng)的指令,故子程序開始處向堆棧中壓入始處向堆棧中壓入 ds:00執(zhí)行執(zhí)行ret指令,則就是指令,則就是轉到轉到ds:00返回返回dosglut_c 2013-08 j.cb23mov ds,ax;數據段首地址(基地址)mov al , x;取變量x mov bl,almul bl;x*x=x2mov bx,ax mov al , y;取變量ymov ah,0;正整數,高字節(jié)直接擴展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 ;過程定義結束 code endsend startret 指令,轉到ds:00,對于exe格式程序,它是一條返回dos的指令。glut_c 2013-08 j.cb24;數據段定義data segmentxdb 25ydb 32zdw?data ends;代碼段開始code segmentassume cs:code, ds:data mov ax , datamov ds , axmov al , xmov bl , al可以使用常規(guī)返回dos方法 int 21h的4ch功能調用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 ;過程定義結束 code endsend start用int 21 的4ch號功能調用返回dos。glut_c 2013-08 j.cb26例 bcd加法程序例如:已知字變量w1、w2分別存放兩個非壓縮的bcd數,編寫程
24、序求兩數之和,并將結果存入sum字變量中。注意:w!,w2為2為字變量(2字節(jié))壓縮bcd數,0099,它們的和則可能為3位bcd數,故sum應該定義3個字節(jié)(用db定義三個字節(jié))。計算機內部只有二進制運算指令,對于bcd數運算,是十進制數,用二進制運算指令運算,需要進行調整。加法、減法、乘法在運算后進行調整除法在運算前先進行調整。 只有字節(jié)運算才能進行調整 非壓縮bcd數加法調整 aaa(壓縮bcd數加法用daa)glut_c 2013-08 j.cb27l壓縮bcd加法后,用daa調整l非壓縮bcd加法后,用aaa調整l壓縮bcd減法后,用das調整l非壓縮bcd加法后,用aas調整l壓縮
25、bcd加法后,用aam調整l(壓縮的bcd乘法,不能調整)l除法指令前用aad調整(存放在ax中的兩位非壓縮bcd數)開始開始定義定義w1、w2、sumalw1第一字節(jié)(個位)第一字節(jié)(個位)add al,w2第一字節(jié),第一字節(jié),aaac送送sum+2最低位最低位 (百位)(百位)結束結束sumalalw1第二字節(jié)(十位)第二字節(jié)(十位)adc al,w2第二字節(jié),第二字節(jié),aaasum+1al將將sum+2清清0,然后進,然后進行帶進位的循環(huán)左移,行帶進位的循環(huán)左移,就可將就可將cy移進移進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 ;取第一個數,;取第一個數,alal09h09h add add al,byte ptr w2al,byte ptr w2 ; al; al09h+07=10h,af=109h+07=10h,af=1 aaa aaa ;alal06h,06h,產生產生cf=1cf=1 mov sum,al mov sum,al ;保存?zhèn)€位,進位信號在;保存?zhèn)€位,進位信號在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 ; ;處理向百位的進位,先將處理向百位的進位,先將sum+2sum+2 rcl um+2,1 rcl um+2,1 ; ;清清0 0,然后用帶進位循環(huán)左移指,然后用帶進位循環(huán)左移指 ; ;令將進位位移到令將進位位移到sum+2sum+2最低位最低位實際上,在實際上,
29、在sumsum定義時,已經初始化為定義時,已經初始化為0 0,程序中可以不清,程序中可以不清0 0 定義的變量定義的變量w1w1,w2w2,sumsum在匯編語言源程序中可以直接使用,在匯編語言源程序中可以直接使用,匯編程序在對源程序進行匯編時,可以識別是從變量所存放的匯編程序在對源程序進行匯編時,可以識別是從變量所存放的存儲器中取出數據存儲器中取出數據實際上就是匯編程直接尋址指令實際上就是匯編程直接尋址指令 mov al,w1mov al,w1,為了書寫簡單,我們直接寫成為了書寫簡單,我們直接寫成 mov al,w1.mov al,w1.glut_c 2013-08 j.cb30以上例子,有
30、一些只給出了實現(xiàn)所要求功能的核心部分分代碼,沒有給出段定義的完整部分。有一些則給出了包含段定義的完整代碼;段定義的格式是相似的,可以參照教材上的例子和前面的段定義例子編寫。教材上還有一些順序程序的例子,由于時間關系,就不一一列舉了。glut_c 2013-08 j.cb31順序程序的結構簡單,但實際程序設計中,往往需要對某些條件進行判斷,依據不同的條件執(zhí)行不同的分支,這樣,順序程序將不能滿足要求。glut_c 2013-08 j.cb323.3.2 分支程序的設計分支程序的設計 就是利用cpu的條件轉移指令,通過判斷某個標志為的狀態(tài),控制程序的執(zhí)行過程。 pf=0pf=0奇轉移奇轉移jnp/j
31、pojnp/jpopf=1pf=1偶轉移偶轉移 jp/jpejp/jpeof=0of=0無溢出轉移無溢出轉移jnojnoof=1of=1溢出轉移溢出轉移jojosf=0sf=0為正轉移為正轉移jnsjnssf=1sf=1為負轉移為負轉移jsjscf=0cf=0無進無進( (借借) )位轉移位轉移jncjnccf=1cf=1有進有進( (借借) )位轉移位轉移jcjczf=0zf=0不相等不相等/ /不等于不等于0 0轉移轉移jne/jnzjne/jnzzf=1zf=1相等相等/ /等于等于0 0轉移轉移je/jzje/jz標志設置標志設置功能功能指令助記符指令助記符glut_c 2013-08
32、 j.cb33二分支結構二分支結構分支結構判斷abnyabc1abc2abc3分支結構判斷bnyabc1abc2glut_c 2013-08 j.cb34多分支結構條件判斷1y程序1n條件判斷2y程序2條件判斷n程序ny程序n+1nnglut_c 2013-08 j.cb35也可以按照條件編碼實現(xiàn)多分枝轉移也可以按照條件編碼實現(xiàn)多分枝轉移例如段內間接轉移指令例如段內間接轉移指令jmp reg轉移到轉移到cs:axjmp word ptr mem轉移到轉移到cs:memax條件編碼條件編碼codaxax*kjmp ax分支程序分支程序0 分支程序分支程序1分支程序分支程序ncod=0cod=1c
33、od=nk是一個不小于是一個不小于2的整數。的整數。glut_c 2013-08 j.cb36我們還是通過實例來討論。例:內存單元m中有一個16位的帶符號數,求它的絕對值,并將結果放回原處。 算法:求一個數的絕對值時,如果是正數,絕對值不變,如果是負數,則求它的機器負數(連同符號位一起每位取反,最低位+1,就是使用neg指令)。有了算法,可以畫出程序流程圖。glut_c 2013-08 j.cb37轉移目的轉移目的指令給出指令給出標號(符標號(符號地址)號地址)開始設置dssi m ax siorl ax,axsf=0neg axnydonesi(ax)結束n_datan_data,負,負數,
34、該標號數,該標號為了閱讀程為了閱讀程序方便序方便判斷數據的符號,在判斷數據的符號,在x86中中就是判斷就是判斷sf標志位,數據標志位,數據傳送指令不改變標志位,因傳送指令不改變標志位,因此用一條邏輯運算指令此用一條邏輯運算指令orl ax,ax,它不改變它不改變ax的值,但設置的值,但設置標志位標志位sfglut_c 2013-08 j.cb38 data segment m dw 789ah;可以任意輸入一個數 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 ;符號為sf=0轉移到donen_data: neg ax ;負數,利用neg指令求負done: mov si,ax mov ah,4ch int 21h code ends end glut_c 2013-08 j.cb39多分支程序對分支程序,可以由這種2分支程序構成。滿足條件1?nyfun1滿足條件2?滿足條件3?分支4分支3分支2分支1yynnfun2fun3fun4fun5tst2tst1tst3glut_c 2013-08 j.cb40計算函數的程序,x是十六位長度字數據)0(1)
36、0(0)0(1xxxy當當當算法分析:取出數據x,判斷它的符號,首先判斷是否=0,如果不是,則是負數,y=-1,如果是,還須再次判斷是否等于0。程序流程框圖為:glut_c 2013-08 j.cb41開始段定義及初始化取數據-ax(ax)0?(ax)=0?y=-1y=0y=1結束yynnlp1lp3lp2end1畫流程圖的時候,對轉移目標地址(最好是分支程序的兩個分支點)都給出一個標號,在寫代碼時好使用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 ;設置段基址 mov ds, axlea si, x;取偏移地址mov ax, siand ax,axglut_c 2013-08 j.cb43jns lp1 ;sf=0,轉到lp1lp0:mov y,0ffh ;=0,繼續(xù)判斷, ;=0轉到lp3lp2:mov y, 01h ;x0時, y=1ljmp end1lp3:mov y,00h ;x=0時,y=0end1: mov ah,4ch ;返回操作系統(tǒng)int 21h code endsend startglut_c 2013-08 j.cb44教材上有一個例子,0y01y00y01,異號、,xx
38、xy算法分析:取出數據x,y,異或,判斷符號,sf=1,表明符號異號z=0;sf=0,表明符號相同,判斷是否x0,是,z=1,否z=-1。glut_c 2013-08 j.cb45多分支的另一種實現(xiàn)方法多分支的另一種實現(xiàn)方法除了用二分支指令實現(xiàn)多分支外,還可以用以下指令實現(xiàn):除了用二分支指令實現(xiàn)多分支外,還可以用以下指令實現(xiàn):jmp reg ;jmp word ptr mem例如,我們要依據例如,我們要依據al中的低中的低4位數據(位數據(015)不同,分別轉移)不同,分別轉移到對應的分支去執(zhí)行,每個分支約定占用到對應的分支去執(zhí)行,每個分支約定占用200字節(jié)空間。字節(jié)空間。這類指令應用方法如下
39、:這類指令應用方法如下:glut_c 2013-08 j.cb46anlal, 0fhmov bl,100mulblmov ax, fun0;jmpaxfun0:.org fun0+100fun1:;fun1-fun0=100;可以用定位偽指令確定每個;分支相距的距離org fun14+100; 只要保證這段空間能存下fun15:; 這段代碼。也可以是一個轉移表,也可以是一個轉移表,利用遠轉移指令轉到利用遠轉移指令轉到各處理程序,這樣各各處理程序,這樣各功能分值的距離就比功能分值的距離就比較小,而且相距的字較小,而且相距的字節(jié)數也相同。節(jié)數也相同。glut_c 2013-08 j.cb47例例
40、3.9 3.9 從鍵盤上鍵入從鍵盤上鍵入2 2位十六進制數將其拼合成一個字節(jié)存入字節(jié)變量位十六進制數將其拼合成一個字節(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位十六進制數位十六進制數mov ah, 10mov ah, 10int 21hint 21hmov ax, word ptr ibuf+2 mov ax, word ptr ibuf+2 ;鍵入字符從;鍵入字符從+2+2單元開始,取出送單元開始,取出送axaxsub ax, 3030hsub ax, 3030h ;字符變?yōu)槭M制數;字符變?yōu)槭M制數cmp al,0ahcmp al,0ahjb lnsub7jb lnsub7;09,ascii-30h09,ascii-30h就是它對應的就是它對應的hexhex值值sub al,7sub al,7;af;
42、af,ascii-37hascii-37h就是它對應的就是它對應的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中的數拼合成一個字節(jié)中的數拼合成一個字節(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 某工廠的產品有某工廠的產品有8 8種不同的加工處理程序種不同的加工處理程序p0p0p7p7,根據鍵,根據鍵盤輸入,做不同的處理,若是盤輸入,做不同的處理,若是0 07 7以外的鍵,則退出加工處理以外的鍵,則退出加工處理 此例可以用兩種方法實現(xiàn)此例可以用兩種方法實現(xiàn): :一種是用逐一比較判斷一種是用逐一比較判斷, ,逐次比較轉移實現(xiàn)二叉分支、整體上逐次比較轉移實現(xiàn)二叉分支、整體上實現(xiàn)多分支實現(xiàn)多分支; ; 另一種是跳轉表法另一種是跳轉表法, ,直接實現(xiàn)多分支直接實現(xiàn)多分支. .glut_c 2013-08 j.cb50
44、方法一方法一逐一比較法逐一比較法. .簡單,條理清楚,易于實現(xiàn),但轉移簡單,條理清楚,易于實現(xià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號功能是顯示字符串,號功能是顯示字符串,$ $是字符串結束符是字符串結束符 int 21hint 21h; mov ah , 1mov ah , 1 ;等待鍵入一個字符到;等待鍵入一個字符到alal, int 21hint 21h cmp al , cmp al , 0 0 ;為;為0 0字符則轉字符則轉p0p0 je p0je p0 cmp al , cmp al , 1 1 ;為;為1 1字符則轉字符則轉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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蕪湖拆除合同范例
- 石場加工合同范例
- 廣告承接合同范例
- 勞動合同變成擔保合同范例
- 美發(fā)學徒培訓合同范例
- 星藝裝修合同范例
- 培訓學院合同范例
- 平谷倉儲配送合同范例
- 消毒產品委托生產合同范例
- 廚房合伙合同范例
- GB/T 45076-2024再生資源交易平臺建設規(guī)范
- 2024-2025學年語文二年級上冊 部編版期末測試卷 (含答案)
- cecs31-2017鋼制電纜橋架工程設計規(guī)范
- 采礦學課程設計陳四樓煤礦1.8mta新井設計(全套圖紙)
- 軍人體型標準對照表
- 淺談吉林省中藥材產業(yè)發(fā)展
- 學生學習評價量表模板
- 圖形找規(guī)律專項練習60題(有答案)
- 最新版《機車網絡控制》考試試卷【一】
- RCS系列同期壓并壓切輔助裝置說明書
- 普通發(fā)票銷售清單
評論
0/150
提交評論