版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)第5章基本匯編語言程序設(shè)計(jì)第第5 5章章 基本匯編語言程序設(shè)計(jì)基本匯編語言程序設(shè)計(jì)5.15.1 順序程序設(shè)計(jì)順序程序設(shè)計(jì)5.2 5.2 分支程序設(shè)計(jì)分支程序設(shè)計(jì)5.3 5.3 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 本章要點(diǎn)及習(xí)題分析本章要點(diǎn)及習(xí)題分析第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.1順序程序設(shè)計(jì)(e)5.15.1 順序程序設(shè)計(jì)順序程序設(shè)計(jì)指令按程序中的書寫順序逐條執(zhí)行,稱為順序程指令按程序中的書寫順序逐條執(zhí)行,稱為順序程序。除非編程解決非常簡單的問題,順序程序并不多序。除非編程解決非
2、常簡單的問題,順序程序并不多見,但是順序程序往往是復(fù)雜程序結(jié)構(gòu)的一部分,如見,但是順序程序往往是復(fù)雜程序結(jié)構(gòu)的一部分,如分支結(jié)構(gòu)的一個(gè)分支,循環(huán)結(jié)構(gòu)的循環(huán)體等。分支結(jié)構(gòu)的一個(gè)分支,循環(huán)結(jié)構(gòu)的循環(huán)體等。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.1例例5.15.1:設(shè)有:設(shè)有3 3個(gè)字變量個(gè)字變量x,yx,y和和z z,求出三者之和,結(jié)果,求出三者之和,結(jié)果存入字變量存入字變量w w。DATAS SEGMENTDATAS SEGMENTX Xdw 5 dw 5 Y Ydw 6 dw 6 Z Zdw 7 dw 7 W Wdw ? dw ? DATAS ENDSDATAS ENDSCOD
3、ES SEGMENTCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:START: MOV AX,DATAS MOV AX,DATAS MOV DS,AX MOV DS,AXmov ax,xmov ax,xadd ax,yadd ax,yadd ax,zadd ax,zmov w,axmov w,ax MOV AH,4CHMOV AH,4CH INT 21HINT 21HCODES ENDSCODES ENDS END STARTEND START第 5 章 基 本
4、匯 編 語 言 程 序 設(shè) 計(jì)【例【例5-35-3】 將一個(gè)字節(jié)壓縮將一個(gè)字節(jié)壓縮BCDBCD碼轉(zhuǎn)換為兩個(gè)碼轉(zhuǎn)換為兩個(gè)ASCIIASCII碼。碼。 分析:一個(gè)字節(jié)的壓縮分析:一個(gè)字節(jié)的壓縮BCDBCD碼就是用一個(gè)字節(jié)的二進(jìn)碼就是用一個(gè)字節(jié)的二進(jìn)制數(shù)表示兩位十進(jìn)制數(shù),如十進(jìn)制數(shù)制數(shù)表示兩位十進(jìn)制數(shù),如十進(jìn)制數(shù)9696表示成壓縮表示成壓縮BCDBCD碼碼就是就是96H96H,轉(zhuǎn)換成,轉(zhuǎn)換成ASCIIASCII碼就是把壓縮碼就是把壓縮BCDBCD碼表示的十進(jìn)制碼表示的十進(jìn)制數(shù)的高位和低位分開,并以數(shù)的高位和低位分開,并以ASCIIASCII碼表示,即轉(zhuǎn)換成碼表示,即轉(zhuǎn)換成39H39H和和36H36H
5、。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)DATADATASEGMENTSEGMENTBCDBUF DB 96HBCDBUF DB 96H;定義;定義1 1個(gè)字節(jié)的壓縮個(gè)字節(jié)的壓縮BCDBCD碼碼ASCBUF DB 2ASCBUF DB 2 DUP(?) DUP(?) ;定義;定義2 2個(gè)字節(jié)的結(jié)果單元個(gè)字節(jié)的結(jié)果單元DATADATA ENDS ENDSCODECODE SEGMENT SEGMENT ASSUME CS: CODEASSUME CS: CODE,DS: DATADS: DATASTARTSTART: MOV AXMOV AX,DATADATA MOV DS MOV
6、DS,AXAX MOV AL MOV AL,BCDBUF BCDBUF ;取出;取出BCDBCD碼碼 MOV BLMOV BL,ALAL ;送;送BLBL暫存暫存 MOV CLMOV CL,4 4 SHR AL SHR AL,CL CL ;高;高4 4位變成低位變成低4 4位,高位,高4 4位補(bǔ)位補(bǔ)0(96H09H)0(96H09H) ADD AL ADD AL,30H 30H ;變成;變成ASCIIASCII碼碼(39H)(39H)第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)MOVMOVASCBUFASCBUF,ALAL;存儲(chǔ)第;存儲(chǔ)第1 1個(gè)個(gè)ASCIIASCII碼碼ANDANDBL
7、BL,0FH0FH;屏蔽掉高;屏蔽掉高4 4位,只保留低位,只保留低4 4位位(96H06H)(96H06H)ADDADDBLBL,30H30H ;變成;變成BCDBCD碼碼(36H)(36H)MOVMOVASCBUF+1ASCBUF+1,BLBL ;存儲(chǔ)第;存儲(chǔ)第2 2個(gè)碼個(gè)碼MOVMOVAHAH,4CH4CHINTINT21H21HCODECODE ENDS ENDSENDENDSTARTSTART第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)【例【例5-45-4】 利用直接查表法完成將鍵盤輸入的一位利用直接查表法完成將鍵盤輸入的一位1010進(jìn)制數(shù)進(jìn)制數(shù)(09)(09)轉(zhuǎn)換成對應(yīng)的平方
8、值并存放在轉(zhuǎn)換成對應(yīng)的平方值并存放在SQRBUFSQRBUF單單元中。元中。 分析:分析:0909的平方值分別為的平方值分別為0 0、1 1、4 4、9 9、1616、2525、3636、4949、6464、8181。把平方值放在一起形成一個(gè)平方值。把平方值放在一起形成一個(gè)平方值表,根據(jù)輸入的值和對應(yīng)平方值所在單元地址之間的表,根據(jù)輸入的值和對應(yīng)平方值所在單元地址之間的關(guān)系關(guān)系( (表首地址加上輸入的值表首地址加上輸入的值) ),查出相應(yīng)的平方值。,查出相應(yīng)的平方值。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)DATADATA SEGMENT SEGMENTSQUTABSQUTABDB
9、0DB 0,1 1,4 4,9 9,1616,2525,3636,4949,6464,8181SQUBUFSQUBUFDBDB? ?DATADATA ENDS ENDSCODECODE SEGMENT SEGMENTASSUMEASSUMECS: CODECS: CODE,DS: DATADS: DATASTARTSTART: MOVMOV AXAX,DATADATA第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)MOVMOV DSDS,AXAXMOVMOV BXBX,OFFSETOFFSETSQUTAB SQUTAB ;平方表首地址;平方表首地址MOVMOV AHAH,1 1INTINT
10、21H21H ;由鍵盤輸入;由鍵盤輸入個(gè)數(shù),得到其個(gè)數(shù),得到其ASCIIASCII碼碼SUBSUB ALAL,30H30H;由;由ASCIIASCII碼得到相應(yīng)的數(shù)碼得到相應(yīng)的數(shù)XLATXLAT;查表;查表MOVMOV SQUBUFSQUBUF,AL AL ;存儲(chǔ)結(jié)果;存儲(chǔ)結(jié)果MOVMOV AHAH,4CH4CHINTINT 21H21HCODECODE ENDSENDS END STARTEND START第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.2分支程序設(shè)計(jì)4.2 4.2 分支程序設(shè)計(jì)分支程序設(shè)計(jì)條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令JccJcc和無條件轉(zhuǎn)移指令和無條件轉(zhuǎn)移指令JMPJMP
11、用于實(shí)現(xiàn)用于實(shí)現(xiàn)程序的分支結(jié)構(gòu),程序的分支結(jié)構(gòu),JMPJMP不測試條件,不測試條件,JccJcc可根據(jù)條件是可根據(jù)條件是否成立決定轉(zhuǎn)移到指定位置或不轉(zhuǎn)移而順序執(zhí)行后續(xù)否成立決定轉(zhuǎn)移到指定位置或不轉(zhuǎn)移而順序執(zhí)行后續(xù)指令。由于指令。由于JccJcc不支持條件表達(dá)式,而是以當(dāng)前標(biāo)志位不支持條件表達(dá)式,而是以當(dāng)前標(biāo)志位的狀態(tài)為條件,故的狀態(tài)為條件,故JccJcc之前一定要安排設(shè)置標(biāo)志位的指之前一定要安排設(shè)置標(biāo)志位的指令,如加減法、比較、測試等指令。令,如加減法、比較、測試等指令?;痉种ь愋头只痉种ь愋头譃閱畏种Ш碗p分支為單分支和雙分支。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)單分支1.
12、1. 單分支類型單分支類型 對同一個(gè)問題,根據(jù)選擇的條件不同,單分支結(jié)對同一個(gè)問題,根據(jù)選擇的條件不同,單分支結(jié)構(gòu)的流程圖有兩種畫法,對應(yīng)的程序也有兩種編法。構(gòu)的流程圖有兩種畫法,對應(yīng)的程序也有兩種編法。如如計(jì)算計(jì)算AXAX中的有符號數(shù)的絕對值。中的有符號數(shù)的絕對值。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)單分支 cmp ax,0 jge noneg neg axNoneg: mov result,ax cmp ax,0 jnge yesneg jmp doneyesneg: neg axDone: mov result,axAX0 AX0 ?求補(bǔ)指令求補(bǔ)指令YN保存結(jié)果保存結(jié)果AX
13、AX0 0?求補(bǔ)指令求補(bǔ)指令YN保存結(jié)果保存結(jié)果JMP第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)雙分支2.2.雙分支程序雙分支程序 兩個(gè)分支都有語句兩個(gè)分支都有語句體,如何選擇條件不重體,如何選擇條件不重要。要。流程圖中分支體的流程圖中分支體的位置就是程序的實(shí)際順位置就是程序的實(shí)際順序,故分支語句體最序,故分支語句體最后一定要有一條后一定要有一條指令,跳過語句體,指令,跳過語句體,轉(zhuǎn)移到轉(zhuǎn)移到“后續(xù)操作后續(xù)操作”。條件成立?條件成立?分支語句體分支語句體2YN分支語句體分支語句體1 后后 續(xù)續(xù) 操操 作作 第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)雙分支雙分支舉例:顯示雙分支舉
14、例:顯示BXBX的最高位。的最高位。shl bx,1shl bx,1jc one jc one ;轉(zhuǎn)分支體;轉(zhuǎn)分支體 mov dl,0mov dl,0 ;分支體;分支體1 1 jmp nextjmp next;轉(zhuǎn)后續(xù)操作;轉(zhuǎn)后續(xù)操作One: mov dl,1One: mov dl,1 ;分支體;分支體2 2next: mov ah,2next: mov ah,2 ;后續(xù)操作;后續(xù)操作 int 21hint 21h . .分支程序的其他問題分支程序的其他問題有些雙分支問題可以先假設(shè)一種情況,把雙分有些雙分支問題可以先假設(shè)一種情況,把雙分支改成單分支問題。如上例,先假設(shè)支改成單分支問題。如上例,先
15、假設(shè)BXBX最高位為最高位為0 0,在分支外準(zhǔn)備顯示在分支外準(zhǔn)備顯示0 0;如最高位為;如最高位為0 0,即可直接跳到后,即可直接跳到后續(xù)操作;如最高位為續(xù)操作;如最高位為1 1才需要執(zhí)行分支體。才需要執(zhí)行分支體。 mov dl,0mov dl,0 shl bx,1 shl bx,1 jnc jnc nextnext mov dl,1 mov dl,1nextnext:mov ah,2:mov ah,2 int 21h int 21h第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)多分支分支的嵌套形成多分支,嵌套形式多種多樣。分支的嵌套形成多分支,嵌套形式多種多樣。例例1 1:求符號函數(shù):求
16、符號函數(shù) 1 1 當(dāng)當(dāng) X0X0Y=Y= 0 0 當(dāng)當(dāng) X=0X=0 -1 -1 當(dāng)當(dāng) X0XSTR2STR1STR2,F(xiàn)LAGFLAG為為1 1;如果;如果STR1STR2STR1STR2,F(xiàn)LAGFLAG為為FFHFFH。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.9 剔除空格程序例例5.95.9:剔除以結(jié)尾的字符串中的空格。:剔除以結(jié)尾的字符串中的空格。 雙重循環(huán)程序:外層循環(huán)負(fù)責(zé)搜索字符串中的雙重循環(huán)程序:外層循環(huán)負(fù)責(zé)搜索字符串中的空格;內(nèi)層循環(huán)負(fù)責(zé)剔除搜索到的空格(由于空格后空格;內(nèi)層循環(huán)負(fù)責(zé)剔除搜索到的空格(由于空格后的字符要依次向前移動(dòng)一個(gè)字節(jié),因而也是一個(gè)循環(huán)的字符
17、要依次向前移動(dòng)一個(gè)字節(jié),因而也是一個(gè)循環(huán)結(jié)構(gòu))。結(jié)構(gòu))。 無論是外層循環(huán),還是內(nèi)層循環(huán),循環(huán)次數(shù)都無論是外層循環(huán),還是內(nèi)層循環(huán),循環(huán)次數(shù)都未知,只能用未知,只能用“條件判斷條件判斷”控制循環(huán)。控制循環(huán)。 外層循環(huán)采用外層循環(huán)采用“先判斷、后循環(huán)先判斷、后循環(huán)”結(jié)構(gòu);對內(nèi)結(jié)構(gòu);對內(nèi)層循環(huán)而言,由于搜索到空格才進(jìn)入內(nèi)循環(huán),所以采層循環(huán)而言,由于搜索到空格才進(jìn)入內(nèi)循環(huán),所以采用用“先循環(huán)、后判斷先循環(huán)、后判斷”結(jié)構(gòu)。結(jié)構(gòu)。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.9/1例例5.95.9:現(xiàn)有一個(gè)以現(xiàn)有一個(gè)以$ $結(jié)尾的字符串,要求剔除其中的結(jié)尾的字符串,要求剔除其中的空格。空格。.da
18、ta.datastringstringdb Let us have a try !,$db Let us have a try !,$.code.code.startup.startupmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21h ; ;顯示原字符串顯示原字符串mov al, mov al, ;AL;AL空格(空格(ASCIIASCII碼為碼為20H20H)mov di,offset stringmov di,offset string第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.9/2o
19、utlp:cmp byte ptr di,$outlp:cmp byte ptr di,$; ;外循環(huán),先判斷后循外循環(huán),先判斷后循環(huán)環(huán)jz donejz done ; ;為為$ $結(jié)束結(jié)束cmp al,dicmp al,di ; ;檢測是否是空格檢測是否是空格jnz nextjnz next ; ;不是空格繼續(xù)外循環(huán)不是空格繼續(xù)外循環(huán)mov si,di mov si,di ; ;是空格,進(jìn)入剔除空格分支是空格,進(jìn)入剔除空格分支inlp:inc si inlp:inc si ; ;該分支是循環(huán)程序段該分支是循環(huán)程序段mov ah,simov ah,si ; ;取空格后的一個(gè)字符取空格后的一個(gè)字
20、符mov si-1,ah mov si-1,ah ;向前移動(dòng)一個(gè)字節(jié);向前移動(dòng)一個(gè)字節(jié)cmp byte ptr si,$cmp byte ptr si,$; ;內(nèi)循環(huán),先循環(huán)后判內(nèi)循環(huán),先循環(huán)后判斷斷jnz inlpjnz inlp第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.9/3next:inc dinext:inc di ; ;繼續(xù)對后續(xù)字符進(jìn)行處理繼續(xù)對后續(xù)字符進(jìn)行處理 jmp outlpjmp outlpdone:mov dx,offset stringdone:mov dx,offset string mov ah,9 mov ah,9 int 21h int 21h ;
21、 ;顯示處理后字符串顯示處理后字符串 .exit 0.exit 0 ; ;結(jié)束結(jié)束 endend第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.4 (目錄)子程序設(shè)計(jì) 4.4 4.4 子程序設(shè)計(jì)子程序設(shè)計(jì) 把功能相對獨(dú)立的程序段單獨(dú)編寫和調(diào)試,作為把功能相對獨(dú)立的程序段單獨(dú)編寫和調(diào)試,作為一個(gè)相對獨(dú)立的模塊供程序使用,就形成子程序。一個(gè)相對獨(dú)立的模塊供程序使用,就形成子程序。 使用子程序:簡化源程序結(jié)構(gòu);提高編程效率。使用子程序:簡化源程序結(jié)構(gòu);提高編程效率。 4.4.1 4.4.1 過程定義偽指令過程定義偽指令 4.4.2 4.4.2 子程序的參數(shù)傳遞子程序的參數(shù)傳遞 4.4.3 4.
22、4.3 子程序的嵌套遞歸重入子程序的嵌套遞歸重入 4.4.4 4.4.4 子程序的應(yīng)用子程序的應(yīng)用第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.4.1 過程定義偽指令(1)4.4.1 4.4.1 過程定義偽指令過程定義偽指令過程名過程名 PROC NEAR|FARPROC NEAR|FAR 過程體過程體 RETRET(RET NRET N) 過程名過程名 ENDPENDP過程名:符合語法的標(biāo)識(shí)符;同模塊唯一性。過程名:符合語法的標(biāo)識(shí)符;同模塊唯一性。距離屬性:可省略,由匯編程序判斷。距離屬性:可省略,由匯編程序判斷。堆棧使用:平衡。才能保證堆棧使用:平衡。才能保證RETRET指令彈出的
23、是斷指令彈出的是斷點(diǎn)地址。點(diǎn)地址。保護(hù)現(xiàn)場與恢復(fù)現(xiàn)場:子程序用到的寄存器或保護(hù)現(xiàn)場與恢復(fù)現(xiàn)場:子程序用到的寄存器或存儲(chǔ)單元,注意:后進(jìn)先出。存儲(chǔ)單元,注意:后進(jìn)先出。注意子程序的規(guī)范和格式注意子程序的規(guī)范和格式PUSH AXPUSH AXPUSH BXPUSH BXPUSH CXPUSH CXPUSH DXPUSH DXPOP DXPOP DXPOP CXPOP CXPOP BXPOP BXPOP AXPOP AX第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 關(guān)于“距離屬性” 關(guān)于關(guān)于“距離屬性距離屬性”vNEARNEAR屬性(段內(nèi)近調(diào)用)的過程只能被相同代碼段屬性(段內(nèi)近調(diào)用)的過程只
24、能被相同代碼段的其他程序調(diào)用的其他程序調(diào)用vFARFAR屬性(段間遠(yuǎn)調(diào)用)的過程可以被相同或不同屬性(段間遠(yuǎn)調(diào)用)的過程可以被相同或不同代碼段的程序調(diào)用代碼段的程序調(diào)用 對簡化段定義格式,在微型、小型和緊湊存儲(chǔ)模對簡化段定義格式,在微型、小型和緊湊存儲(chǔ)模式下,過程的缺省屬性為式下,過程的缺省屬性為nearnear;在中型、大型和巨型;在中型、大型和巨型存儲(chǔ)模式下,過程的缺省屬性為存儲(chǔ)模式下,過程的缺省屬性為farfar 對完整段定義格式,過程的缺省屬性為對完整段定義格式,過程的缺省屬性為nearnear用戶可以在過程定義時(shí)用用戶可以在過程定義時(shí)用nearnear或或farfar改變?nèi)笔傩愿淖?/p>
25、缺省屬性第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 子程序規(guī)范子程序規(guī)范子程序規(guī)范 一個(gè)完整的子程序,特別是供其他編程人員使用一個(gè)完整的子程序,特別是供其他編程人員使用的子程序,必須附有一個(gè)詳細(xì)說明:的子程序,必須附有一個(gè)詳細(xì)說明:子程序名(過程名)子程序名(過程名)子程序功能介紹子程序功能介紹子程序的入口參數(shù)子程序的入口參數(shù)子程序的出口參數(shù)子程序的出口參數(shù)子程序內(nèi)使用的寄存器(存儲(chǔ)單元)子程序內(nèi)使用的寄存器(存儲(chǔ)單元)使用該子程序的范例使用該子程序的范例v子程序名:子程序名:DTOBv功能:完成兩位十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)功能:完成兩位十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)v入口參數(shù):入口參數(shù):AL存
26、放待轉(zhuǎn)換的兩位存放待轉(zhuǎn)換的兩位BCD碼碼v出口參數(shù):出口參數(shù):CL存放轉(zhuǎn)換后的二進(jìn)制數(shù)存放轉(zhuǎn)換后的二進(jìn)制數(shù)v占用寄存器:占用寄存器:BXv示例:輸入示例:輸入AL=01010110B (56H) 輸出輸出CL=00111000B (38H)某子程序的說明某子程序的說明第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 子程序的常見格式子程序的常見格式子程序的常見格式;子程序說明;子程序說明;子程序說明;子程序說明subnamesubname procproc; ;具有缺省屬性的具有缺省屬性的subnamesubname過程過程push axpush ax; ;保護(hù)寄存器:順序壓入堆棧保護(hù)寄存器
27、:順序壓入堆棧push bxpush bx;ax/bx/cx;ax/bx/cx僅是示例僅是示例push cxpush cx; ;過程體過程體pop cxpop cx; ;恢復(fù)寄存器:逆序彈出堆棧恢復(fù)寄存器:逆序彈出堆棧pop bxpop bxpop axpop axretret; ;過程返回過程返回subnamesubname endpendp; ;過程結(jié)束過程結(jié)束第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 簡單子程序 簡單子程序簡單子程序; ;子程序功能:實(shí)現(xiàn)光標(biāo)回車換行子程序功能:實(shí)現(xiàn)光標(biāo)回車換行dpcrlfdpcrlfprocproc ; ;過程開始過程開始push axpush
28、 ax ; ;保護(hù)寄存器保護(hù)寄存器AXAX和和DXDXpush dxpush dxmov dl,0dhmov dl,0dh ; ;顯示回車顯示回車mov ah,2mov ah,2int 21hint 21hmov dl,0ahmov dl,0ah ; ;顯示換行顯示換行mov ah,2mov ah,2int 21hint 21hpop dxpop dx ; ;恢復(fù)寄存器恢復(fù)寄存器DXDX和和AXAXpop axpop axretret ; ;子程序返回子程序返回dpcrlfdpcrlfendpendp ; ;過程結(jié)束過程結(jié)束第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 例5.10:編寫子
29、程序(e)例例4.104.10:編寫子程序,將:編寫子程序,將ALAL寄存器內(nèi)的二進(jìn)制數(shù)寄存器內(nèi)的二進(jìn)制數(shù)用十六進(jìn)制數(shù)顯示。用十六進(jìn)制數(shù)顯示。8 8位二進(jìn)制數(shù),可轉(zhuǎn)換成兩位十六進(jìn)制數(shù)。位二進(jìn)制數(shù),可轉(zhuǎn)換成兩位十六進(jìn)制數(shù)。十六進(jìn)制數(shù)十六進(jìn)制數(shù)ASCIIASCII碼碼2#2#功能調(diào)用顯示功能調(diào)用顯示1001B9H1001+1001B9H1001+0011 00000011 000039H39H(9 9的的ASCIIASCII)1010BAH1010+1010BAH1010+0011 01110011 011141H41H(A A的的ASCIIASCII)注意:對注意:對0-90-9加加30H30H
30、,對,對A-FA-F加加37H37H,即,即+30H+07H+30H+07H先轉(zhuǎn)換高先轉(zhuǎn)換高4 4位二進(jìn)制數(shù),并顯示;然后轉(zhuǎn)換低位二進(jìn)制數(shù),并顯示;然后轉(zhuǎn)換低4 4位位并顯示。并顯示。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.4.2 子程序的參數(shù)傳遞 4.4.2 4.4.2 子程序的參數(shù)傳遞子程序的參數(shù)傳遞 主程序和子程序之間通常需要傳遞參數(shù):主程序和子程序之間通常需要傳遞參數(shù):v入口參數(shù)入口參數(shù)(輸入?yún)?shù)):主程序提供給子程序(輸入?yún)?shù)):主程序提供給子程序v出口參數(shù)出口參數(shù)(輸出參數(shù)):子程序返回給主程序(輸出參數(shù)):子程序返回給主程序v參數(shù)的形式參數(shù)的形式: 數(shù)據(jù)本身(傳值)
31、數(shù)據(jù)本身(傳值) 數(shù)據(jù)的地址(傳址)數(shù)據(jù)的地址(傳址)v傳遞的方法傳遞的方法: 寄存器寄存器 變量變量 堆棧堆棧第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)參數(shù)傳遞方法 1.1.用寄存器傳遞參數(shù)用寄存器傳遞參數(shù)方便、簡單、易行。須要傳遞的參數(shù)較多時(shí)不適方便、簡單、易行。須要傳遞的參數(shù)較多時(shí)不適用。見例題用。見例題411a411a。2.2.用變量傳遞參數(shù)用變量傳遞參數(shù)就是用存儲(chǔ)器傳遞參數(shù),當(dāng)主程序與子程序在同就是用存儲(chǔ)器傳遞參數(shù),當(dāng)主程序與子程序在同一個(gè)模塊時(shí),即為共享數(shù)據(jù)段的變量;不在同一模塊,一個(gè)模塊時(shí),即為共享數(shù)據(jù)段的變量;不在同一模塊,需要用需要用PUBLIC/EXTERNPUBL
32、IC/EXTERN聲明。聲明。適用與參數(shù)較多情況。見例題適用與參數(shù)較多情況。見例題411b411b。3.3.用堆棧傳遞參數(shù)用堆棧傳遞參數(shù)常用方法。用常用方法。用BPBP訪問堆棧段。須格外注意堆棧的訪問堆棧段。須格外注意堆棧的平衡。平衡。( (堆棧示意圖)堆棧示意圖)第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 堆棧示意圖堆棧示意圖使用堆棧傳遞參數(shù)時(shí)堆棧示意圖:使用堆棧傳遞參數(shù)時(shí)堆棧示意圖: PUSH PUSH 參數(shù)參數(shù)1 1PUSH PUSH 參數(shù)參數(shù)2 2PUSH PUSH 參數(shù)參數(shù)3 3CALL SUBPROCALL SUBPRO .EXIT 0.EXIT 0SUBPRO PROCS
33、UBPRO PROC PUSH BP PUSH BP MOV BP MOV BP,SPSP PUSH AX PUSH AX POP AXPOP AX POP BP POP BP RET (RET 6) RET (RET 6)SUBPRO ENDPSUBPRO ENDPA XA XB PB PI PI P參數(shù)參數(shù)3 3參數(shù)參數(shù)2 2參數(shù)參數(shù)1 1BP=SPBP=SPBP+2BP+2BP+4BP+4BP+6BP+6BP+8BP+8SP(SP(原始原始) )子程序取參數(shù):子程序取參數(shù):MOV AXMOV AX,BP+4(6,8)BP+4(6,8)子程序平衡堆棧子程序平衡堆棧:RET 6:RET 6主
34、程序平衡堆棧:主程序平衡堆棧: ADD SPADD SP,6 6例題例題411c411cSPSP第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例題例題5.11c/15.11c/1例題例題4.11c4.11c:計(jì)算累加和計(jì)算累加和;用堆棧傳遞參數(shù);用堆棧傳遞參數(shù);入口參數(shù);入口參數(shù): :數(shù)組首地址、數(shù)組元素個(gè)數(shù)數(shù)組首地址、數(shù)組元素個(gè)數(shù);出口參數(shù):;出口參數(shù):AL AL 累加和累加和 .model small.model small .stack .stack .data .datacount equ 10count equ 10array db array db 12h,25h,0f0h,0
35、a3h,03,68h,71h,0cah,0ffh,90h12h,25h,0f0h,0a3h,03,68h,71h,0cah,0ffh,90hresult db ?result db ?第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例題例題5.11c/25.11c/2 .code .code .startup .startup mov ax,offset array mov ax,offset array push ax ; push ax ;首地址入棧首地址入棧 mov ax,countmov ax,count push ax push ax ;元素個(gè)數(shù)入棧;元素個(gè)數(shù)入棧 call che
36、cksumacall checksuma add sp,4 add sp,4 ;平衡兩個(gè)參數(shù)占用的堆棧;平衡兩個(gè)參數(shù)占用的堆棧 mov result,almov result,al .exit 0 .exit 0第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例題例題5.11c/35.11c/3checksuma procchecksuma proc push bp push bp mov bp,sp mov bp,sp;使;使BPBP指向剛進(jìn)入子程序的堆棧指向剛進(jìn)入子程序的堆棧頂,頂, push bx push bx push cx push cx mov bx,bp+6 mov bx,b
37、p+6 mov cx,bp+4 mov cx,bp+4 xor al,al xor al,alsuma: add al,bxsuma: add al,bx inc bx inc bx loop suma loop suma第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例題例題5.11c/45.11c/4 pop cx pop cx pop bx pop bx pop bp pop bp ret ret ;可以用;可以用RET 4RET 4checksuma endpchecksuma endp end end 第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 編寫子程序時(shí)應(yīng)注意的問題 編
38、寫子程序時(shí)應(yīng)注意的問題:編寫子程序時(shí)應(yīng)注意的問題: 使用簡化的段定義格式時(shí),過程定義在程序中使用簡化的段定義格式時(shí),過程定義在程序中的位置要注意,可以放在的位置要注意,可以放在1 1)主程序的最后,即)主程序的最后,即“.EXIT 0”.EXIT 0”之后,之后,ENDEND語句之前;語句之前;2 2)放在主程序之)放在主程序之前,即前,即“.CODE”.CODE”之后,之后,“.STARTUP”.STARTUP”之前。之前。 使用寄存器傳遞參數(shù)時(shí),帶有入口參數(shù)的寄存使用寄存器傳遞參數(shù)時(shí),帶有入口參數(shù)的寄存器可以保護(hù),也可以不保護(hù);帶有出口參數(shù)的寄存器器可以保護(hù),也可以不保護(hù);帶有出口參數(shù)的寄
39、存器則一定不可保護(hù)和恢復(fù);其他與出口參數(shù)無關(guān)、而子則一定不可保護(hù)和恢復(fù);其他與出口參數(shù)無關(guān)、而子程序中使用的寄存器,子程序開始處應(yīng)該保護(hù),子程程序中使用的寄存器,子程序開始處應(yīng)該保護(hù),子程序結(jié)束、返回主程序之前應(yīng)該恢復(fù)。序結(jié)束、返回主程序之前應(yīng)該恢復(fù)。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.4.3 子程序的嵌套遞歸重入4.4.3 4.4.3 子程序的嵌套、遞歸與重入子程序的嵌套、遞歸與重入1.1.子程序的嵌套子程序的嵌套子程序又調(diào)子程序稱為子程序的嵌套,嵌套的層數(shù)取決子程序又調(diào)子程序稱為子程序的嵌套,嵌套的層數(shù)取決于堆??臻g的大小。嵌套子程序的設(shè)計(jì)和一般子程序完全相同。于堆??臻g
40、的大小。嵌套子程序的設(shè)計(jì)和一般子程序完全相同。2.2.子程序的遞歸子程序的遞歸子程序直接或間接地嵌套調(diào)用自己,稱為遞歸調(diào)用。含子程序直接或間接地嵌套調(diào)用自己,稱為遞歸調(diào)用。含有遞歸調(diào)用的子程序稱為遞歸子程序。有遞歸調(diào)用的子程序稱為遞歸子程序。每次調(diào)用時(shí)不能破壞以前調(diào)用所用的參數(shù)及中間結(jié)果,每次調(diào)用時(shí)不能破壞以前調(diào)用所用的參數(shù)及中間結(jié)果,因此,調(diào)用參數(shù)及中間結(jié)果一般都放在堆棧中。不可放因此,調(diào)用參數(shù)及中間結(jié)果一般都放在堆棧中。不可放在固定的寄存器或存儲(chǔ)單元中。在固定的寄存器或存儲(chǔ)單元中。要控制遞歸的次數(shù),避免陷入死循環(huán)。要控制遞歸的次數(shù),避免陷入死循環(huán)。遞歸深度受堆棧空間的限制。遞歸深度受堆???/p>
41、間的限制。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) 例題5.12例題例題4.12 4.12 用遞歸子程序求用遞歸子程序求N N的階乘,設(shè)的階乘,設(shè)N=3N=3。遞歸次數(shù)用遞歸次數(shù)用N N控制,由控制,由N=3N=3,子程序共運(yùn)行,子程序共運(yùn)行4 4次(主程次(主程序調(diào)用序調(diào)用1 1次,遞歸調(diào)用次,遞歸調(diào)用3 3次);入口參數(shù)及中間結(jié)果都次);入口參數(shù)及中間結(jié)果都用堆棧保存。用堆棧保存。注釋:注釋:1 1)在進(jìn)入子程序過程中,不計(jì)算階乘值,)在進(jìn)入子程序過程中,不計(jì)算階乘值,只求中間參數(shù)。第一次進(jìn)入,求出中間參數(shù)只求中間參數(shù)。第一次進(jìn)入,求出中間參數(shù)2 2;第二;第二次進(jìn)入求出中間參數(shù)
42、次進(jìn)入求出中間參數(shù)1 1;第三次進(jìn)入求出中間參數(shù);第三次進(jìn)入求出中間參數(shù)0 0;第四次進(jìn)入后,由于中間參數(shù)以為第四次進(jìn)入后,由于中間參數(shù)以為0 0,開始執(zhí)行返回,開始執(zhí)行返回處理。處理。 2 2)在返回過程中計(jì)算階乘:在過程)在返回過程中計(jì)算階乘:在過程3 3中計(jì)算中計(jì)算1 1* *1=11=1,在過程在過程2 2中計(jì)算中計(jì)算1 1* *2=22=2,在過程,在過程1 1中計(jì)算中計(jì)算2 2* *3=63=6。 3 3)遞歸子程序可設(shè)計(jì)出效率較高的程序,但是編程)遞歸子程序可設(shè)計(jì)出效率較高的程序,但是編程較難,編出的程序易讀性差,使用不多。較難,編出的程序易讀性差,使用不多。第 5 章 基 本
43、匯 編 語 言 程 序 設(shè) 計(jì) 子程序的重入(e)3.3.子程序的重入子程序的重入子程序被中斷后,又被中斷服務(wù)程序所調(diào)用,稱子程序被中斷后,又被中斷服務(wù)程序所調(diào)用,稱為子程序的重入。能夠重入的子程序稱為可重入子程為子程序的重入。能夠重入的子程序稱為可重入子程序。當(dāng)主機(jī)與外設(shè)采用中斷方式交換信息時(shí),外設(shè)的序。當(dāng)主機(jī)與外設(shè)采用中斷方式交換信息時(shí),外設(shè)的驅(qū)動(dòng)程序應(yīng)按驅(qū)動(dòng)程序應(yīng)按“可重入原則可重入原則”設(shè)計(jì)。設(shè)計(jì)。雖然重入與遞歸的概念不同,但遞歸子程序就是雖然重入與遞歸的概念不同,但遞歸子程序就是可重入子程序。設(shè)計(jì)可重入子程序與設(shè)計(jì)遞歸子程序可重入子程序。設(shè)計(jì)可重入子程序與設(shè)計(jì)遞歸子程序的原則是相同的
44、,即參數(shù)、中間結(jié)果等都用堆棧保存,的原則是相同的,即參數(shù)、中間結(jié)果等都用堆棧保存,不能用固定的存儲(chǔ)單元或寄存器保存。不能用固定的存儲(chǔ)單元或寄存器保存。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)5.4.4 子程序的應(yīng)用 4.4.4 4.4.4 子程序的應(yīng)用子程序的應(yīng)用1 1)例題例題4.154.15 計(jì)算有符號數(shù)的平均值。計(jì)算有符號數(shù)的平均值。 有時(shí)進(jìn)行運(yùn)算之前,需要符號擴(kuò)展;對無符號數(shù)有時(shí)進(jìn)行運(yùn)算之前,需要符號擴(kuò)展;對無符號數(shù)應(yīng)進(jìn)行應(yīng)進(jìn)行0 0擴(kuò)展。擴(kuò)展。 2 2)具有局部變量的子程序(截取教材)具有局部變量的子程序(截取教材P123P123部分程部分程序):當(dāng)某些數(shù)據(jù)只有子程序自己使
45、用時(shí),可在代碼序):當(dāng)某些數(shù)據(jù)只有子程序自己使用時(shí),可在代碼段子程序后面定義數(shù)據(jù)區(qū)。段子程序后面定義數(shù)據(jù)區(qū)。 3 3)具有多個(gè)出口的子程序:有的子程序具有多個(gè))具有多個(gè)出口的子程序:有的子程序具有多個(gè)出口,根據(jù)條件的不同,從不同的出口返回主程序。出口,根據(jù)條件的不同,從不同的出口返回主程序。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.15 計(jì)算平均值/1例例4.15 4.15 計(jì)算有符號數(shù)的平均值。計(jì)算有符號數(shù)的平均值。; ;入口參數(shù)用堆棧傳遞,出口參數(shù)用寄存器入口參數(shù)用堆棧傳遞,出口參數(shù)用寄存器AXAX傳遞。傳遞。; ;要計(jì)算要計(jì)算1616位有符號數(shù)的和,被加數(shù)一定要進(jìn)行符號位有
46、符號數(shù)的和,被加數(shù)一定要進(jìn)行符號擴(kuò)展。擴(kuò)展。 .model small.model small .stack .stack .data .dataarray dw 1234,-1234,1,1,-1,32767,-32768,5678,array dw 1234,-1234,1,1,-1,32767,-32768,5678,-5678,9000 -5678,9000 count equ ($-array)/2 count equ ($-array)/2 ; ;數(shù)據(jù)個(gè)數(shù)數(shù)據(jù)個(gè)數(shù)wmed dw ?wmed dw ?第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) /2 .code .code .
47、startup .startup mov ax,count mov ax,count push ax push ax ;參數(shù);參數(shù)1 1 mov ax,offset array mov ax,offset array push ax push ax ;參數(shù);參數(shù)2 2 call mean call mean add sp,4 add sp,4 ;平衡堆棧;平衡堆棧 mov wmed,axmov wmed,ax .exit 0 .exit 0第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) /3mean procmean proc push bp push bp mov bp,sp mov b
48、p,sp push bx push bx push cx push cx push dx push dx push si push si push di push di mov bx,bp+4 mov bx,bp+4;取參數(shù);取參數(shù)2 2:偏移地址:偏移地址 mov cx,bp+6mov cx,bp+6;取參數(shù);取參數(shù)1 1:數(shù)據(jù)個(gè)數(shù):數(shù)據(jù)個(gè)數(shù) xor si,sixor si,si mov di,si mov di,si第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) /4mean1: mov ax,bxmean1: mov ax,bx cwd cwd add si,ax add si,ax
49、 adc di,dx adc di,dx inc bx inc bx inc bx inc bx loop mean1 loop mean1 mov ax,si mov ax,si mov dx,di mov dx,di mov cx,bp+6 mov cx,bp+6 dx.ax dx.ax + di.si + di.si di.si di.si第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì) /5 idiv cx ; idiv cx ;求平均值,商在求平均值,商在AXAX,余數(shù)在,余數(shù)在DXDX pop di pop di pop si pop si pop dx pop dx pop c
50、x pop cx pop bx pop bx pop bp pop bp ret retmean endpmean endp end end 第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)避免溢出的方法v為了避免有符號二進(jìn)制數(shù)求和過程中溢出,被加數(shù)為了避免有符號二進(jìn)制數(shù)求和過程中溢出,被加數(shù)要進(jìn)行符號擴(kuò)展,得到倍長數(shù)據(jù)(大小沒有變化),要進(jìn)行符號擴(kuò)展,得到倍長數(shù)據(jù)(大小沒有變化),然后求和然后求和v如數(shù)據(jù)采用如數(shù)據(jù)采用1616位二進(jìn)制數(shù)表示,數(shù)據(jù)個(gè)數(shù)也采用位二進(jìn)制數(shù)表示,數(shù)據(jù)個(gè)數(shù)也采用1616位二進(jìn)制數(shù)表示,則最多為位二進(jìn)制數(shù)表示,則最多為2 21616個(gè)數(shù)據(jù)。如將數(shù)據(jù)擴(kuò)展個(gè)數(shù)據(jù)。如將數(shù)據(jù)
51、擴(kuò)展到到3232位二進(jìn)制數(shù)表示,求和時(shí),就不會(huì)出現(xiàn)溢出。位二進(jìn)制數(shù)表示,求和時(shí),就不會(huì)出現(xiàn)溢出。v考慮極端情況:數(shù)據(jù)全是考慮極端情況:數(shù)據(jù)全是2 21515(-32768-32768),共有),共有2 21616個(gè),求和結(jié)果是個(gè),求和結(jié)果是2 23131,3232位數(shù)據(jù)仍然可以表達(dá)。位數(shù)據(jù)仍然可以表達(dá)。v對于無符號數(shù),有時(shí)也需要得到倍長數(shù)據(jù),應(yīng)采用對于無符號數(shù),有時(shí)也需要得到倍長數(shù)據(jù),應(yīng)采用“0 0擴(kuò)展擴(kuò)展”,即將高位置,即將高位置0 0,如,如“MOV DXMOV DX,0”0”。第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì); ;將將ALAL低低4 4位表達(dá)的一位位表達(dá)的一位1616進(jìn)
52、制數(shù)轉(zhuǎn)換為進(jìn)制數(shù)轉(zhuǎn)換為ASCIIASCII碼碼H2ASCH2ASCprocprocpush bxpush bxmov bx,offset ASCIImov bx,offset ASCII ;BX;BX指向指向ASCIIASCII碼表碼表and al,0fhand al,0fh; ;取得一位取得一位1616進(jìn)制數(shù)進(jìn)制數(shù)xlat CS:ASCIIxlat CS:ASCII; ;換碼:換碼:ALCS:BXALCS:BXALAL,注意數(shù)據(jù)在代碼段,注意數(shù)據(jù)在代碼段CSCSpop bxpop bxretret; ;子程序返回子程序返回ASCIIASCIIdb 30h,31h,32h,33h,34h,35
53、h,36h,37hdb 30h,31h,32h,33h,34h,35h,36h,37hdb 38h,39h,41h,42h,43h,44h,45h,46hdb 38h,39h,41h,42h,43h,44h,45h,46hH2ASCH2ASCendpendp 因?yàn)閿?shù)據(jù)區(qū)與子程序都在代碼段,所以利用因?yàn)閿?shù)據(jù)區(qū)與子程序都在代碼段,所以利用了換碼指令了換碼指令XLATXLAT的另一種助記格式(寫出指向的另一種助記格式(寫出指向緩沖區(qū)的變量名,目的是便于指明段超越前緩沖區(qū)的變量名,目的是便于指明段超越前綴)。串操作綴)。串操作MOVSMOVS、LODSLODS和和CMPSCMPS指令也可以這指令也可以
54、這樣使用,以便使用段超越前綴樣使用,以便使用段超越前綴 除采用段超越方法外,子程序與主程序的數(shù)除采用段超越方法外,子程序與主程序的數(shù)據(jù)段不同時(shí),我們還可以通過修改據(jù)段不同時(shí),我們還可以通過修改DSDS值實(shí)現(xiàn)數(shù)值實(shí)現(xiàn)數(shù)據(jù)存??;但需要保護(hù)和恢復(fù)據(jù)存??;但需要保護(hù)和恢復(fù)DSDS寄存器寄存器第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)HTOASCHTOASCprocproc; ;將將ALAL低低4 4位表達(dá)的一位位表達(dá)的一位1616進(jìn)制數(shù)轉(zhuǎn)換為進(jìn)制數(shù)轉(zhuǎn)換為ASCIIASCII碼碼and al,0fhand al,0fhcmp al,9cmp al,9jbe htoasc1jbe htoasc1a
55、dd al,37hadd al,37h; ;是是0AH0AH0FH0FH,加,加37H37Hretret ; ;子程序返回子程序返回htoasc1:htoasc1: add al,30hadd al,30h; ;是是0 09 9,加,加30H30Hretret ; ;子程序返回子程序返回HTOASCHTOASCendpendp第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)例5.13例例4.13 4.13 編寫子程序從鍵盤輸入一個(gè)有符號十進(jìn)制數(shù);編寫子程序從鍵盤輸入一個(gè)有符號十進(jìn)制數(shù);并將輸入的并將輸入的ASCIIASCII碼轉(zhuǎn)換為二進(jìn)制數(shù)。碼轉(zhuǎn)換為二進(jìn)制數(shù)。v輸入時(shí),負(fù)數(shù)用輸入時(shí),負(fù)數(shù)用“
56、”引導(dǎo),正數(shù)直接輸入或用引導(dǎo),正數(shù)直接輸入或用“”引導(dǎo)引導(dǎo)v子程序用寄存器傳遞出口參數(shù),主程序調(diào)用該子程子程序用寄存器傳遞出口參數(shù),主程序調(diào)用該子程序輸入序輸入1010個(gè)數(shù)據(jù)個(gè)數(shù)據(jù)v將將ASCIIASCII碼轉(zhuǎn)換為二進(jìn)制數(shù)的過程碼轉(zhuǎn)換為二進(jìn)制數(shù)的過程 首先判斷輸入為正或負(fù)數(shù),并用一個(gè)寄存器記錄首先判斷輸入為正或負(fù)數(shù),并用一個(gè)寄存器記錄 接著輸入接著輸入0 09 9數(shù)字(數(shù)字(ASCIIASCII碼),并減碼),并減30H30H轉(zhuǎn)換為二進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù) 然后將前面輸入的數(shù)值乘然后將前面輸入的數(shù)值乘1010,并與剛輸入的數(shù)字相加得到,并與剛輸入的數(shù)字相加得到新的數(shù)值新的數(shù)值 重復(fù)重復(fù)、步,直到
57、輸入一個(gè)非數(shù)字字符結(jié)束步,直到輸入一個(gè)非數(shù)字字符結(jié)束 負(fù)數(shù)進(jìn)行求補(bǔ),轉(zhuǎn)換成補(bǔ)碼;否則直接保存數(shù)值負(fù)數(shù)進(jìn)行求補(bǔ),轉(zhuǎn)換成補(bǔ)碼;否則直接保存數(shù)值第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)輸入和轉(zhuǎn)換流程圖輸入和轉(zhuǎn)換流程圖:輸入和轉(zhuǎn)換流程圖:A A負(fù)數(shù)求補(bǔ),正數(shù)不變負(fù)數(shù)求補(bǔ),正數(shù)不變出口參數(shù)出口參數(shù)AXAX返回返回1 1號調(diào)用輸入字符號調(diào)用輸入字符是是+?是是-?置負(fù)數(shù)標(biāo)志置負(fù)數(shù)標(biāo)志輸入下一個(gè)輸入下一個(gè)0-90-9之間之間變成二進(jìn)制數(shù)變成二進(jìn)制數(shù)BXBX* *10+ALBX10+ALBXY YN NN NA A輸入非數(shù)字字輸入非數(shù)字字符,結(jié)束輸入符,結(jié)束輸入第 5 章 基 本 匯 編 語 言 程
58、 序 設(shè) 計(jì)輸入數(shù)字舉例設(shè)從鍵盤輸入數(shù)字設(shè)從鍵盤輸入數(shù)字 258258:輸入順序:輸入順序:- 2 5 8- 2 5 8 CX -1 -1 -1 -1 CX -1 -1 -1 -1 BX 0 0002 0019H=25 0102H=258 BX 0 0002 0019H=25 0102H=258數(shù)字輸入結(jié)束后,由于數(shù)字輸入結(jié)束后,由于CXCX為負(fù)數(shù)標(biāo)志,為負(fù)數(shù)標(biāo)志,再對再對BXBX求補(bǔ)。求補(bǔ)。 第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)程序/1.data.datacountcount= 10= 10arrayarraydw count dup(0)dw count dup(0); ;預(yù)
59、留數(shù)據(jù)存儲(chǔ)空間預(yù)留數(shù)據(jù)存儲(chǔ)空間.code.code.startup.startupmov cx,countmov cx,countmov bx,offset arraymov bx,offset arrayagain:call readagain:call read; ;調(diào)用子程序輸入一個(gè)數(shù)據(jù)調(diào)用子程序輸入一個(gè)數(shù)據(jù)mov bx,axmov bx,ax; ;將出口參數(shù)存放緩沖區(qū)將出口參數(shù)存放緩沖區(qū)inc bxinc bxinc bxinc bxcall dpcrlfcall dpcrlf ; ;調(diào)用子程序,光標(biāo)回車換行以便輸入下一個(gè)數(shù)據(jù)調(diào)用子程序,光標(biāo)回車換行以便輸入下一個(gè)數(shù)據(jù)loop agai
60、nloop again.exit 0.exit 0這是主程序這是主程序第 5 章 基 本 匯 編 語 言 程 序 設(shè) 計(jì)程序/2; ;輸入有符號輸入有符號1010進(jìn)制數(shù)的通用子程序進(jìn)制數(shù)的通用子程序; ;出口參數(shù):出口參數(shù):AXAX補(bǔ)碼表示的二進(jìn)制數(shù)值補(bǔ)碼表示的二進(jìn)制數(shù)值readread proc procpush bxpush bxpush cxpush cxpush dxpush dxxor bx,bxxor bx,bx;BX;BX保存結(jié)果保存結(jié)果xor cx,cxxor cx,cx;CX;CX為正負(fù)標(biāo)志,為正負(fù)標(biāo)志,0 0為正,為正,1 1為負(fù)為負(fù)mov ah,1mov ah,1 ; ;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 喉感覺麻痹的健康宣教
- 電力系統(tǒng)分析課件孟祥萍
- 黑素細(xì)胞痣的臨床護(hù)理
- 小兒蕁麻疹的臨床護(hù)理
- 先天性耳廓畸形的健康宣教
- 哺乳期乳頭皸裂的健康宣教
- 《單片機(jī)原理及應(yīng)用 》課件-第4章
- 《第一章》課件-第五章技術(shù)體驗(yàn) - 智能交互
- 皮膚良性腫瘤的臨床護(hù)理
- 隆突性皮膚纖維肉瘤的臨床護(hù)理
- 病理學(xué)知到智慧樹章節(jié)測試課后答案2024年秋溫州醫(yī)科大學(xué)
- 2023年湖北交投智能檢測股份有限公司社會(huì)招聘筆試真題
- 2024企業(yè)所得稅培訓(xùn)
- 眼科考試題含答案
- 共話五千年傳承根與魂主題團(tuán)日活動(dòng)
- 2024年大型風(fēng)力發(fā)電項(xiàng)目EPC總承包合同
- 植物學(xué)#-形考作業(yè)4-國開(ZJ)-參考資料
- 2024新人教版英語七年級上單詞默寫單(小學(xué)部分)
- 2021-2022學(xué)年第二學(xué)期《大學(xué)生職業(yè)發(fā)展與就業(yè)指導(dǎo)2》學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 借款協(xié)議(父母借款給子女買房協(xié)議)(二篇)
- SOAP病例書寫規(guī)范
評論
0/150
提交評論