最新匯編語言5_第1頁
最新匯編語言5_第2頁
最新匯編語言5_第3頁
最新匯編語言5_第4頁
最新匯編語言5_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、最新匯編語言5第第 5 5 章章最新匯編語言5教學(xué)重點(diǎn)在掌握基本的匯編語言程序在掌握基本的匯編語言程序設(shè)計(jì)方法之后,進(jìn)一步學(xué)習(xí)設(shè)計(jì)方法之后,進(jìn)一步學(xué)習(xí)如何提高編程效率的各種實(shí)如何提高編程效率的各種實(shí)用方法:用方法:高級(jí)語言特性高級(jí)語言特性宏結(jié)構(gòu)宏結(jié)構(gòu)模塊化模塊化第5章最新匯編語言55.1 高級(jí)語言特性MASM 6.0引入高級(jí)語言的程序引入高級(jí)語言的程序設(shè)計(jì)特性設(shè)計(jì)特性n條件控制偽指令條件控制偽指令.IF .ELSE .ENDIFn循環(huán)控制偽指令循環(huán)控制偽指令.WHILE .ENDW .REPEAT .UNTILn過程聲明和過程調(diào)用偽指令過程聲明和過程調(diào)用偽指令.PROTO .INVOKE最新匯

2、編語言5要調(diào)用帶參數(shù)過程定義的過程,不應(yīng)采用要調(diào)用帶參數(shù)過程定義的過程,不應(yīng)采用CALL指令,因?yàn)楸容^煩瑣指令,因?yàn)楸容^煩瑣應(yīng)該采用過程調(diào)用偽指令應(yīng)該采用過程調(diào)用偽指令I(lǐng)NVOKE使用使用INVOKE偽指令的前提是需要用偽指令的前提是需要用PROTO偽指令對(duì)過程進(jìn)行聲明偽指令對(duì)過程進(jìn)行聲明5.1.3 過程聲明和過程調(diào)用偽指令過程名過程名 PROC調(diào)用距離調(diào)用距離 語言類型語言類型 作用范圍作用范圍 USES 寄存器列表寄存器列表, 參數(shù)參數(shù):類型類型LOCAL 參數(shù)表參數(shù)表;匯編語言語句匯編語言語句過程名過程名 ENDP第5章過程聲明偽指令:過程聲明偽指令:用于事先聲明過程的結(jié)構(gòu)用于事先聲明過

3、程的結(jié)構(gòu)過程名過程名PROTO 調(diào)用距離調(diào)用距離 語言類型語言類型, 參數(shù)參數(shù):類型類型過程調(diào)用偽指令過程調(diào)用偽指令I(lǐng)NVOKE 過程名過程名,參數(shù)參數(shù),.如何調(diào)如何調(diào)用用最新匯編語言5;匯編語言程序:匯編語言程序:lt503.asm.model smallchecksumd PROTO c,:word,:word;聲明過程聲明過程.stack.dataarraydb 12h,25h,0f0h,0a3h,3db 68h,71h,0cah,0ffh,90hcountequ $-array;數(shù)組的元素個(gè)數(shù)數(shù)組的元素個(gè)數(shù)resultdb ?;校驗(yàn)和校驗(yàn)和.code.startupINVOKE che

4、cksumd,count,offset array;調(diào)用過程調(diào)用過程mov result,al;保存校驗(yàn)和保存校驗(yàn)和.exit 0例例5.35.31/21/2列表文件列表文件最新匯編語言5checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,arrayp;BX數(shù)組的偏移地址數(shù)組的偏移地址mov cx,countp;CX數(shù)組的元素個(gè)數(shù)數(shù)組的元素個(gè)數(shù)xor al,alsumd: add al,bx;求和:求和:ALAL+DS:BXinc bxloop sumdretchecksumd endpend例例5.35.32/22/2列表文件列

5、表文件最新匯編語言5;lt503.asm的列表文件(的列表文件(lt503.lst).INVOKE checksumd,count,offset array *mov ax,word ptr OFFSET array *push ax *mov ax,+000Ah *push ax *call checksumd *add sp,04hmov result,al.例例5.35.31/21/2指示該語句由匯編程序自動(dòng)生成指示該語句由匯編程序自動(dòng)生成最新匯編語言5checksumd PROC c USES bx cx,countp:word,arrayp:word *push bp;起始代碼起始代

6、碼 *mov bp,sp *push bx;保護(hù)保護(hù)bx和和cx *push cxmov bx,arrayp;arrayp=BP+6mov cx,countp;cuontp=BP+4.ret *pop cx;結(jié)尾代碼結(jié)尾代碼 *pop bx *pop bp *ret 0000hchecksumc endp例例5.35.32/22/2進(jìn)入調(diào)試程序觀察進(jìn)入調(diào)試程序觀察第5章最新匯編語言55.2 宏結(jié)構(gòu)程序設(shè)計(jì)宏匯編宏匯編重復(fù)匯編重復(fù)匯編條件匯編條件匯編統(tǒng)稱宏結(jié)構(gòu)統(tǒng)稱宏結(jié)構(gòu)宏(Macro)是匯編語言的一個(gè)特點(diǎn),它是與子程序類似又獨(dú)具特色的另一種簡(jiǎn)化源程序的方法最新匯編語言5宏宏具有宏名的一段匯編語句

7、序列具有宏名的一段匯編語句序列宏定義宏定義時(shí)書寫時(shí)書寫宏指令宏指令這段匯編語句序列的縮寫這段匯編語句序列的縮寫宏調(diào)用宏調(diào)用時(shí)書寫時(shí)書寫宏展開宏展開宏指令處用這段宏代替的宏指令處用這段宏代替的過程過程宏匯編宏匯編時(shí)實(shí)現(xiàn)時(shí)實(shí)現(xiàn)宏的參數(shù)宏的參數(shù)功能強(qiáng)大,頗具特色功能強(qiáng)大,頗具特色配合宏,還有配合宏,還有宏操作符宏操作符和有關(guān)偽指令和有關(guān)偽指令5.2.1 宏匯編第5章最新匯編語言5宏名宏名 macromacro 形參表形參表 宏定義體宏定義體endmendmmainbeginmainbeginMACRO MACRO ;定義名為定義名為mainbeginmainbegin的宏,無參數(shù)的宏,無參數(shù)mov

8、ax,datamov ax,data;宏定義體宏定義體mov ds,axmov ds,axENDMENDM;宏定義結(jié)束宏定義結(jié)束mainendmainendMACRO retnumMACRO retnum;帶有形參帶有形參retnumretnummov al,retnummov al,retnum;宏定義中使用參數(shù)宏定義中使用參數(shù)mov ah,4chmov ah,4chint 21hint 21hENDMENDM宏注釋符宏注釋符最新匯編語言5宏名宏名 實(shí)參表實(shí)參表 start:start: mainbeginmainbegin; ;宏調(diào)用,建立宏調(diào)用,建立DSDS內(nèi)容內(nèi)容dispmsg str

9、ingdispmsg string; ;宏調(diào)用,顯示字符串宏調(diào)用,顯示字符串mainend 0mainend 0; ;宏調(diào)用,返回宏調(diào)用,返回DOSDOSend startend start 宏調(diào)用的實(shí)質(zhì)是在匯編過程中進(jìn)行宏展開宏調(diào)用的實(shí)質(zhì)是在匯編過程中進(jìn)行宏展開 宏展開的具體過程是:當(dāng)匯編程序掃描源程序遇宏展開的具體過程是:當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時(shí),即用相應(yīng)的宏定義體取代到已有定義的宏調(diào)用時(shí),即用相應(yīng)的宏定義體取代源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)源程序的宏指令,同時(shí)用位置匹配的實(shí)參對(duì)形參進(jìn)行取代行取代最新匯編語言5宏展開宏展開在匯編時(shí),用宏定義在匯編時(shí),用宏定義

10、體的代碼序列替代宏指令的過程。體的代碼序列替代宏指令的過程。start:start: mainbeginmainbegin; ;宏指令宏指令 1 1mov ax,datamov ax,data ; ;宏展開宏展開 1 1mov ds,axmov ds,axmainend 0mainend 0; ;宏指令宏指令 1 1mov al,0mov al,0; ;宏展開宏展開 1 1mov ah,4chmov ah,4ch 1 1int 21hint 21h最新匯編語言5宏的參數(shù)使用非常靈活宏的參數(shù)使用非常靈活宏定義時(shí),宏定義時(shí),可以可以無參數(shù)無參數(shù),例如,例如5.4a的的mainbegin可以帶有可以

11、帶有一個(gè)參數(shù)一個(gè)參數(shù),例如,例如5.4a的的mainend也可以具有也可以具有多個(gè)參數(shù)多個(gè)參數(shù);例如;例如5.5a的的shlext參數(shù)可以是參數(shù)可以是常數(shù)、變量、存儲(chǔ)單元、指令常數(shù)、變量、存儲(chǔ)單元、指令(操(操作碼)或它們的一部分,也可以是作碼)或它們的一部分,也可以是表達(dá)式表達(dá)式;例如;例如5.5b的的shift和和shrot宏定義體可以是任何合法的匯編語句,既可以宏定義體可以是任何合法的匯編語句,既可以是是硬指令序列硬指令序列,又可以是,又可以是偽指令序列偽指令序列;例如;例如5.6的的dstring最新匯編語言5;宏定義;宏定義shlextshlextmacro macro shlopr

12、andshloprand, ,shlnumshlnumpush cxpush cxmov cl,mov cl,shlnumshlnumshl shl shloprandshloprand,cl,clpop cxpop cxendmendm;宏指令;宏指令shlext shlext axax, ,6 6;宏展開;宏展開 1 1push cxpush cx 1 1mov cl,mov cl,0606 1 1shl shl axax,cl,cl 1 1pop cxpop cx例5.5a最新匯編語言5;統(tǒng)一;統(tǒng)一4 4條移位指令的宏指令條移位指令的宏指令shiftshiftmacro soprand,

13、snum,macro soprand,snum,sopcodesopcodepush cxpush cxmov cl,snummov cl,snums s& &sopcodesopcode& & soprand,cl soprand,clpop cxpop cxendmendm;統(tǒng)一移位和循環(huán)移位;統(tǒng)一移位和循環(huán)移位8 8條指令的宏指令條指令的宏指令shrotshrotmacro sroprand,srnum,macro sroprand,srnum,sropcodesropcodepush cxpush cxmov cl,srnummov cl,srnumsr

14、opcodesropcode sroprand,cl sroprand,clpop cxpop cxendmendm例5.5b替換操作符替換操作符最新匯編語言5;宏定義;宏定義dstringdstring macro stringmacro stringdb db & &stringstring& &,0dh,0ah,$,0dh,0ah,$endmendm;宏調(diào)用;宏調(diào)用dstringdstring dstringdstring 0 0 ! ! Number Number ! !;宏展開;宏展開 1 1db This is a example., 0dh,0ah

15、,$db This is a example., 0dh,0ah,$ 1 1db 0 Number 10, 0dh,0ah, $db 0 Number 10, 0dh,0ah, $例5.6轉(zhuǎn)義注釋符轉(zhuǎn)義注釋符傳遞注釋符傳遞注釋符最新匯編語言5宏操作符;宏注釋符,用于表示在宏宏注釋符,用于表示在宏定義中的注釋。采用這個(gè)符號(hào)的定義中的注釋。采用這個(gè)符號(hào)的注釋,在宏展開時(shí)不出現(xiàn)注釋,在宏展開時(shí)不出現(xiàn)&替換操作符,用于將參數(shù)替換操作符,用于將參數(shù)與其他字符分開。如果參數(shù)緊接與其他字符分開。如果參數(shù)緊接在其他字符之前或之后,或者參在其他字符之前或之后,或者參數(shù)出現(xiàn)在帶引號(hào)的字符串中,就數(shù)出現(xiàn)在帶

16、引號(hào)的字符串中,就必須使用該偽操作符必須使用該偽操作符第5章最新匯編語言5宏操作符字符串傳遞操作符,用于括起字符串傳遞操作符,用于括起字符串。在宏調(diào)用中,如果傳遞的字字符串。在宏調(diào)用中,如果傳遞的字符串實(shí)參數(shù)含有逗號(hào)、空格等間隔符符串實(shí)參數(shù)含有逗號(hào)、空格等間隔符號(hào),則必須用這對(duì)操作符,以保證字號(hào),則必須用這對(duì)操作符,以保證字符串的完整符串的完整!轉(zhuǎn)義操作符,用于指示其后的一轉(zhuǎn)義操作符,用于指示其后的一個(gè)字符作為一般字符,不含特殊意義個(gè)字符作為一般字符,不含特殊意義%表達(dá)式操作符,用在宏調(diào)用中,表達(dá)式操作符,用在宏調(diào)用中,表示將后跟的一個(gè)表達(dá)式的值作為實(shí)表示將后跟的一個(gè)表達(dá)式的值作為實(shí)參,而不是

17、將表達(dá)式本身作為參數(shù)參,而不是將表達(dá)式本身作為參數(shù)第5章最新匯編語言5與宏有關(guān)的偽指令局部標(biāo)號(hào)偽指令局部標(biāo)號(hào)偽指令LOCAL 標(biāo)號(hào)列表標(biāo)號(hào)列表宏定義體采用了標(biāo)號(hào),應(yīng)使用宏定義體采用了標(biāo)號(hào),應(yīng)使用LOCAL加以說明加以說明它必須是宏定義它必須是宏定義MACRO語句之后的第一條語句語句之后的第一條語句宏定義刪除偽指令宏定義刪除偽指令PURGE PURGE 宏名表宏名表不需要某個(gè)宏定義時(shí),可以把它刪除不需要某個(gè)宏定義時(shí),可以把它刪除宏定義退出偽指令宏定義退出偽指令EXITMEXITM偽指令偽指令EXITMEXITM表示結(jié)束當(dāng)前宏調(diào)用的展開表示結(jié)束當(dāng)前宏調(diào)用的展開第5章最新匯編語言5;宏定義;宏定義a

18、bsolabsol macro oprdmacro oprdlocal nextlocal nextcmp oprd,0cmp oprd,0jge nextjge nextneg oprdneg oprdnext:next:endmendm例5.7;宏調(diào)用;宏調(diào)用absol word ptr bxabsol word ptr bxabsol bxabsol bx;宏展開;宏展開 1 1cmp word ptr bx,0cmp word ptr bx,0 1 1jge ?0000jge ?0000 1 1neg word ptr bxneg word ptr bx 1 1?0000:?0000:

19、 1 1cmp bx,0cmp bx,0 1 1jge ?0001jge ?0001 1 1neg bxneg bx 1 1?0001:?0001:單獨(dú)占一行單獨(dú)占一行最新匯編語言5比較僅是僅是源程序級(jí)源程序級(jí)的的簡(jiǎn)化簡(jiǎn)化:宏調(diào)用宏調(diào)用在匯編時(shí)在匯編時(shí)進(jìn)行進(jìn)行程序語句的展開,不程序語句的展開,不需要返回;不減小目需要返回;不減小目標(biāo)程序,執(zhí)行速度沒標(biāo)程序,執(zhí)行速度沒有改變有改變通過形參、實(shí)參結(jié)合通過形參、實(shí)參結(jié)合實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷實(shí)現(xiàn)參數(shù)傳遞,簡(jiǎn)捷直觀、靈活多變直觀、靈活多變還是還是目標(biāo)程序級(jí)目標(biāo)程序級(jí)的的簡(jiǎn)簡(jiǎn)化化:子程序調(diào)用:子程序調(diào)用在執(zhí)在執(zhí)行時(shí)行時(shí)由由CALLCALL指令轉(zhuǎn)向、指令轉(zhuǎn)向、

20、RETRET指令返回;形成的指令返回;形成的目標(biāo)代碼較短,執(zhí)行目標(biāo)代碼較短,執(zhí)行速度減慢速度減慢需要利用寄存器、存需要利用寄存器、存儲(chǔ)單元或堆棧等傳遞儲(chǔ)單元或堆棧等傳遞參數(shù)參數(shù)宏宏子程序子程序最新匯編語言5宏與子程序具有各自的特點(diǎn),程序員應(yīng)該宏與子程序具有各自的特點(diǎn),程序員應(yīng)該根據(jù)具體問題選擇使用那種方法根據(jù)具體問題選擇使用那種方法通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),通常,當(dāng)程序段較短或要求較快執(zhí)行時(shí),應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼應(yīng)選用宏;當(dāng)程序段較長(zhǎng)或?yàn)闇p小目標(biāo)代碼時(shí),要選用子程序時(shí),要選用子程序比較結(jié)論宏宏子程序子程序最新匯編語言55.2.2 重復(fù)匯編重復(fù)匯編重復(fù)匯編指在匯編過程

21、中,重復(fù)展開指在匯編過程中,重復(fù)展開一段(基本)相同的語句一段(基本)相同的語句重復(fù)匯編沒有名字,不能被調(diào)用重復(fù)匯編沒有名字,不能被調(diào)用重復(fù)匯編常用在宏定義體中,也可以重復(fù)匯編常用在宏定義體中,也可以在一般匯編語句中使用在一般匯編語句中使用重復(fù)匯編偽指令有三個(gè):重復(fù)匯編偽指令有三個(gè):REPEAT按參數(shù)值重復(fù)按參數(shù)值重復(fù)FOR按參數(shù)個(gè)數(shù)重復(fù)按參數(shù)個(gè)數(shù)重復(fù)FORC按參數(shù)的字符個(gè)數(shù)重復(fù)按參數(shù)的字符個(gè)數(shù)重復(fù)最后,用最后,用ENDM結(jié)束結(jié)束第5章最新匯編語言5REPEATREPEAT 重復(fù)次數(shù)重復(fù)次數(shù) 重復(fù)體重復(fù)體ENDMENDMchar = Achar = AREPEAT 26REPEAT 26 db

22、 char db char char = char +1 char = char +1ENDMENDM 1 1db chardb char; ;等效于等效于db Adb A 1 1char = char +1char = char +1 1 1db chardb char; ;等效于等效于db Bdb B 1 1char = char +1char = char +1. 1 1db chardb char; ;等效于等效于db Zdb Z 1 1char = char +1char = char +1最新匯編語言5FORFOR 形參形參, ,實(shí)參表實(shí)參表 重復(fù)體重復(fù)體ENDMENDMFOR r

23、egad, FOR regad, push regad push regadENDMENDM 1 1push axpush ax 1 1push bxpush bx 1 1push cxpush cx 1 1push dxpush dx最新匯編語言5FORC FORC 形參形參, , 字符串字符串 重復(fù)體重復(fù)體ENDMENDMFORC regad,dcbaFORC regad,dcba pop &regad&x pop &regad&xENDMENDM 1 1pop dxpop dx 1 1pop cxpop cx 1 1pop bxpop bx 1 1pop

24、axpop ax最新匯編語言55.2.3 條件匯編條件匯編偽指令在匯編過程中,根據(jù)條件匯編偽指令在匯編過程中,根據(jù)條件決定匯編的語句條件決定匯編的語句IFxx 表達(dá)式表達(dá)式;滿足,匯編分支語句體滿足,匯編分支語句體1分支語句體分支語句體1 ELSE;不滿足,匯編分支語句體不滿足,匯編分支語句體2分支語句體分支語句體2 ENDIF;條件匯編結(jié)束條件匯編結(jié)束第5章最新匯編語言5pdatapdatamacro nummacro num IFIF num lt 100 num lt 100;如果如果num 100num 100,則匯編如下語句,則匯編如下語句db num dup (?)db num d

25、up (?) ELSEELSE;否則,匯編如下語句否則,匯編如下語句db 100 dup (?)db 100 dup (?) ENDIFENDIFendmendmpdata 12pdata 12 ; ;宏調(diào)用宏調(diào)用db 12 dup(?)db 12 dup(?) ; ;宏匯編結(jié)果宏匯編結(jié)果pdata 102pdata 102 ; ;宏調(diào)用宏調(diào)用db 100 dup(?)db 100 dup(?) ; ;宏匯編結(jié)果宏匯編結(jié)果例5.10最新匯編語言5宏結(jié)構(gòu)的作用宏匯編、重復(fù)匯編和條件匯編宏匯編、重復(fù)匯編和條件匯編為源程序的編寫提供了很多方便,為源程序的編寫提供了很多方便,靈活運(yùn)用它們可以編寫出非常

26、靈活運(yùn)用它們可以編寫出非常良好的源程序來良好的源程序來匯編系統(tǒng)中有些以圓點(diǎn)起始的匯編系統(tǒng)中有些以圓點(diǎn)起始的 偽指令(如偽指令(如.startup、.exit等)等)實(shí)際上是一種宏結(jié)構(gòu)實(shí)際上是一種宏結(jié)構(gòu)最新匯編語言5dstringdstringMACRO stringMACRO string;定義字符串定義字符串db &string&,0dh,0ah,$db &string&,0dh,0ah,$ENDMENDMmainbeginmainbeginMACRO dssegMACRO dsseg;設(shè)置數(shù)據(jù)段地址設(shè)置數(shù)據(jù)段地址mov ax,dssegmov ax,dsse

27、gmov ds,axmov ds,axENDMENDMdispmsgdispmsgMACRO messageMACRO messagemov dx,offset messagemov dx,offset messagemov ah,09hmov ah,09hint 21hint 21hENDMENDM最新匯編語言5mainendmainend MACRO retnumMACRO retnum;返回返回DOSDOS,可不帶參數(shù),可不帶參數(shù)ifb ifb mov ah,4ch mov ah,4ch;沒有參數(shù)沒有參數(shù)elseelse mov ax,4c00h+(retnum AND 0ffh) mo

28、v ax,4c00h+(retnum AND 0ffh); ; 有參數(shù)有參數(shù)endifendifint 21hint 21hENDMENDM最新匯編語言5.model small.model small.stack 256.stack 256.data.datamsg1msg1equ this byteequ this bytedstringdstring msg2msg2equ this byteequ this bytedstringdstring .code.codestart:start:mainbeginmainbegin data data; ;建立建立DSDS內(nèi)容內(nèi)容dispms

29、gdispmsg msg1 msg1; ;顯示顯示msg1msg1字符串字符串dispmsgdispmsg msg2 msg2; ;顯示顯示msg2msg2字符串字符串mainendmainend; ;返回返回DOSDOSend startend start最新匯編語言5將程序分段、采用子程序或宏結(jié)構(gòu)都是進(jìn)將程序分段、采用子程序或宏結(jié)構(gòu)都是進(jìn)行模塊化程序設(shè)計(jì)行模塊化程序設(shè)計(jì)本節(jié)介紹開發(fā)大型程序時(shí)采用的方法:本節(jié)介紹開發(fā)大型程序時(shí)采用的方法:5.3 模塊化程序設(shè)計(jì)例題例題 5.125.12將鍵盤輸入的數(shù)據(jù)按升序輸出將鍵盤輸入的數(shù)據(jù)按升序輸出最新匯編語言5把源程序分放在幾個(gè)文本文件中,在匯編時(shí)把源

30、程序分放在幾個(gè)文本文件中,在匯編時(shí)通過包含偽指令通過包含偽指令I(lǐng)NCLUDE結(jié)合成一體結(jié)合成一體INCLUDE 文件名文件名可將常用的子程序形成可將常用的子程序形成.ASM.ASM匯編語言源文件匯編語言源文件可將常用的宏定義存放在可將常用的宏定義存放在.MAC.MAC宏庫文件中宏庫文件中可將常量定義、聲明語句組織在可將常量定義、聲明語句組織在.INC.INC包含文件中包含文件中例例5.12a5.12a 宏庫文件宏庫文件 lt512a.mac 主程序文件主程序文件 lt512a.asm 子程序文件子程序文件 sub512a.asm5.3.1 源程序文件的包含1最新匯編語言5dispchardis

31、pcharmacro charmacro char; ;顯示顯示charchar字符字符mov dl,charmov dl,charmov ah,2mov ah,2int 21hint 21hendmendmdispmsgdispmsgmacro messagemacro message; ;顯示顯示messagemessage字符串字符串mov dx,offset messagemov dx,offset messagemov ah,9mov ah,9int 21hint 21hendmendmLt512a.macLt512a.mac最新匯編語言5include lt512a.macincl

32、ude lt512a.mac.dispmsg msg1dispmsg msg1; ;提示輸入數(shù)據(jù)提示輸入數(shù)據(jù)mov bx,offset bufmov bx,offset bufcall inputcall input; ;數(shù)據(jù)輸入數(shù)據(jù)輸入cmp cx,0cmp cx,0je start4je start4; ;沒有輸入數(shù)據(jù)則退出沒有輸入數(shù)據(jù)則退出mov count,cxmov count,cx.; ;顯示輸入的數(shù)據(jù)顯示輸入的數(shù)據(jù).; ;數(shù)據(jù)排序數(shù)據(jù)排序.; ;顯示經(jīng)排序后的數(shù)據(jù)顯示經(jīng)排序后的數(shù)據(jù)start4:start4: .exit 0.exit 0include sub512a.asmin

33、clude sub512a.asmendendLt512a.asmLt512a.asm最新匯編語言5子程序源文件有子程序源文件有3 3個(gè)子程序個(gè)子程序ALdispALdisp; ;顯示顯示2 2位位1616進(jìn)制數(shù)子程序(例進(jìn)制數(shù)子程序(例4.104.10)sortingsorting ; ;排序子程序(例排序子程序(例4.84.8)inputinput; ;鍵盤輸入子程序鍵盤輸入子程序還包含一個(gè)宏還包含一個(gè)宏convertconvert ;將將DXDX兩位兩位ASCIIASCII碼轉(zhuǎn)換為兩位碼轉(zhuǎn)換為兩位1616進(jìn)制數(shù)進(jìn)制數(shù)sub512a.asmsub512a.asm讓我們重點(diǎn)分析鍵盤輸入子程序

34、讓我們重點(diǎn)分析鍵盤輸入子程序 inputinput最新匯編語言5; ;鍵盤輸入子程序鍵盤輸入子程序; ;入口參數(shù):入口參數(shù):ds:bx=ds:bx=存放數(shù)據(jù)的緩沖區(qū)存放數(shù)據(jù)的緩沖區(qū); ;出口參數(shù):出口參數(shù):cx=cx=數(shù)據(jù)個(gè)數(shù)數(shù)據(jù)個(gè)數(shù)inputinputprocprocpush axpush axpush dxpush dxxor cx,cxxor cx,cx; ;數(shù)據(jù)個(gè)數(shù)清數(shù)據(jù)個(gè)數(shù)清0 0input01:input01: xor dx,dxxor dx,dx; ;輸入字符清輸入字符清0 0input02:input02: mov ah,1mov ah,1; ;鍵盤輸入一個(gè)字符鍵盤輸入一個(gè)字符

35、int 21hint 21hinputinput之一之一繼續(xù):繼續(xù):inputinput之二之二最新匯編語言5input10:input10: cmp al,0dhcmp al,0dhje input30je input30; ;是是回車回車,結(jié)束整個(gè)數(shù)據(jù)的輸入,結(jié)束整個(gè)數(shù)據(jù)的輸入cmp al, cmp al, je input20je input20; ;是是空格和逗號(hào)空格和逗號(hào),確認(rèn)輸入了一個(gè)數(shù)據(jù),確認(rèn)輸入了一個(gè)數(shù)據(jù)cmp al,cmp al,je input20je input20cmp al,08hcmp al,08hje input17je input17; ;是是退格退格,丟棄本次

36、輸入的數(shù)據(jù),出錯(cuò),丟棄本次輸入的數(shù)據(jù),出錯(cuò)inputinput之二之二繼續(xù):繼續(xù):inputinput之三之三最新匯編語言5cmp al,cmp al,00; ;有效數(shù)字判斷有效數(shù)字判斷(圖(圖5.2b5.2b)jb input17jb input17; ;小于小于00,不是有效數(shù)字,出,不是有效數(shù)字,出錯(cuò)錯(cuò)cmp al,cmp al,ffja input17ja input17; ;大于大于ff,不是有效數(shù)字,不是有效數(shù)字cmp al,cmp al,aajb input11jb input11sub al,20hsub al,20h;a;aff轉(zhuǎn)換成大轉(zhuǎn)換成大寫寫AAFFjmp input1

37、2jmp input12input11:input11: cmp al,cmp al,FFja input17ja input17; ;字符小于字符小于aa、大于、大于FF,出,出錯(cuò)錯(cuò)cmp al,cmp al,AAjae input12jae input12; ;是是AAFF,有效字符,有效字符cmp al,cmp al,99ja input17ja input17; ;是是0099,有效字符,有效字符inputinput之三之三繼續(xù):繼續(xù):inputinput之四之四最新匯編語言5input12:input12: cmp dl,0cmp dl,0; ;有效字符的處理有效字符的處理jne i

38、nput13jne input13mov dl,almov dl,al;dl=0;dl=0,輸入了一個(gè)數(shù)據(jù)的低位,則,輸入了一個(gè)數(shù)據(jù)的低位,則dlaldlaljmp input02jmp input02; ;轉(zhuǎn)到字符輸入轉(zhuǎn)到字符輸入input13:input13: cmp dh,0cmp dh,0jne input17jne input17;dl0;dl0,dh0dh0輸入輸入3 3位數(shù)據(jù),出錯(cuò)位數(shù)據(jù),出錯(cuò)mov dh,dlmov dh,dl;dl0;dl0,dhdh0 0輸入了一個(gè)數(shù)據(jù)的高位輸入了一個(gè)數(shù)據(jù)的高位mov dl,almov dl,al;dhdl;dhdl,dlaldlaljmp

39、input02jmp input02; ;轉(zhuǎn)到字符輸入轉(zhuǎn)到字符輸入inputinput之四之四繼續(xù):繼續(xù):inputinput之五之五最新匯編語言5input17:input17:mov dl,7mov dl,7; ;輸入錯(cuò)誤處理輸入錯(cuò)誤處理mov ah,2mov ah,2int 21hint 21hmov dl,?mov dl,?mov ah,2mov ah,2int 21hint 21hjmp input01jmp input01; ;轉(zhuǎn)到輸入一個(gè)數(shù)據(jù)轉(zhuǎn)到輸入一個(gè)數(shù)據(jù)inputinput之五之五繼續(xù):繼續(xù):inputinput之六之六最新匯編語言5; ;轉(zhuǎn)換正確的輸入數(shù)據(jù)轉(zhuǎn)換正確的輸入數(shù)據(jù)

40、(圖(圖5.2c5.2c)input20:input20: convertconvertjmp input01jmp input01 ; ;轉(zhuǎn)到輸入一個(gè)數(shù)據(jù)轉(zhuǎn)到輸入一個(gè)數(shù)據(jù)input30:input30: convertconvertpop dxpop dxpop axpop axretret; ;返回,出口參數(shù)已設(shè)定返回,出口參數(shù)已設(shè)定inputinputendpendpinputinput之六之六繼續(xù):繼續(xù):convertconvert之一之一最新匯編語言5;將將DXDX兩位兩位ASCIIASCII碼轉(zhuǎn)換為兩位碼轉(zhuǎn)換為兩位1616進(jìn)制數(shù)(圖進(jìn)制數(shù)(圖5.2c5.2c)convertconv

41、ert macromacrolocal input21,input22local input21,input22local input24,input25local input24,input25cmp dl,0cmp dl,0;dl=0;dl=0,沒有要轉(zhuǎn)換的數(shù)據(jù),退出,沒有要轉(zhuǎn)換的數(shù)據(jù),退出je input25je input25convertconvert之一之一繼續(xù):繼續(xù):convertconvert之二之二最新匯編語言5cmp dl,9cmp dl,9jbe input21jbe input21sub dl,7sub dl,7;字符字符A AF F,則減,則減7 7input21:i

42、nput21: and dl,0fhand dl,0fh;轉(zhuǎn)換低位轉(zhuǎn)換低位cmp dh,0cmp dh,0;dh=0;dh=0,沒有高位數(shù)據(jù),沒有高位數(shù)據(jù)je input24je input24cmp dh,9cmp dh,9jbe input22jbe input22sub dh,7sub dh,7input22:input22: shl dh,1shl dh,1shl dh,1shl dh,1shl dh,1shl dh,1shl dh,1shl dh,1;轉(zhuǎn)換高位轉(zhuǎn)換高位or dl,dhor dl,dh;合并高、低位合并高、低位convertconvert之二之二繼續(xù):繼續(xù):conver

43、tconvert之三之三最新匯編語言5源文件包含的操作步驟:源文件包含的操作步驟: 分別編輯生成各個(gè)文件分別編輯生成各個(gè)文件 匯編、連接主程序文件匯編、連接主程序文件input24:input24: mov bx,dlmov bx,dl;存入緩沖區(qū)存入緩沖區(qū)inc bxinc bxinc cxinc cx;數(shù)據(jù)加數(shù)據(jù)加1 1input25:input25:endmendmconvertconvert之三之三最新匯編語言5把常用子程序?qū)懗瑟?dú)立的源程序文件,單獨(dú)把常用子程序?qū)懗瑟?dú)立的源程序文件,單獨(dú)匯編,形成子程序的目標(biāo)文件匯編,形成子程序的目標(biāo)文件.OBJ主程序也經(jīng)過獨(dú)立匯編之后形成目標(biāo)文件主程

44、序也經(jīng)過獨(dú)立匯編之后形成目標(biāo)文件連接程序?qū)⑺心繕?biāo)文件連接起來,最終產(chǎn)連接程序?qū)⑺心繕?biāo)文件連接起來,最終產(chǎn)生可執(zhí)行文件生可執(zhí)行文件需要遵循的原則:需要遵循的原則: 聲明共用的變量、過程等聲明共用的變量、過程等 實(shí)現(xiàn)正確的段組合實(shí)現(xiàn)正確的段組合 處理好參數(shù)傳遞問題處理好參數(shù)傳遞問題5.3.2 目標(biāo)代碼文件的連接2最新匯編語言5聲明共用的變量、過程各個(gè)模塊間共用的變量、過程等要說明各個(gè)模塊間共用的變量、過程等要說明PUBLIC 標(biāo)識(shí)符標(biāo)識(shí)符 ,標(biāo)識(shí)符標(biāo)識(shí)符.;定義標(biāo)識(shí)符的模塊使用定義標(biāo)識(shí)符的模塊使用EXTERN 標(biāo)識(shí)符標(biāo)識(shí)符:類型類型 ,標(biāo)識(shí)符標(biāo)識(shí)符:類型類型.;調(diào)用標(biāo)識(shí)符的模塊使用調(diào)用標(biāo)識(shí)符的

45、模塊使用標(biāo)識(shí)符是變量名、過程名等標(biāo)識(shí)符是變量名、過程名等類型是類型是byte / word / dword(變量)或(變量)或near / far(過程)(過程)在一個(gè)源程序中,在一個(gè)源程序中,public/extern語句可以有多條語句可以有多條各模塊間的各模塊間的public/extern偽指令要互相配對(duì),并偽指令要互相配對(duì),并且指明的類型互相一致且指明的類型互相一致第5章最新匯編語言5實(shí)現(xiàn)正確的段組合子程序文件必須定義在代碼段中,也可以具有局部子程序文件必須定義在代碼段中,也可以具有局部的數(shù)據(jù)變量的數(shù)據(jù)變量采用簡(jiǎn)化段定義格式,只要采用相同的存儲(chǔ)模式,采用簡(jiǎn)化段定義格式,只要采用相同的存儲(chǔ)

46、模式,容易實(shí)現(xiàn)正確的近或遠(yuǎn)調(diào)用容易實(shí)現(xiàn)正確的近或遠(yuǎn)調(diào)用完整段定義格式中,為了實(shí)現(xiàn)模塊間的段內(nèi)近調(diào)用完整段定義格式中,為了實(shí)現(xiàn)模塊間的段內(nèi)近調(diào)用(near類型),各自定義的段名、類別必須相同,類型),各自定義的段名、類別必須相同,組合類型都是組合類型都是public。實(shí)際的程序開發(fā)中,各個(gè)模。實(shí)際的程序開發(fā)中,各個(gè)模塊往往由不同的程序員完成,不易實(shí)現(xiàn)段同名或類塊往往由不同的程序員完成,不易實(shí)現(xiàn)段同名或類別相同,所以索性定義成遠(yuǎn)調(diào)用(別相同,所以索性定義成遠(yuǎn)調(diào)用(far類型)類型)定義數(shù)據(jù)段時(shí),同樣也要注意這個(gè)問題。當(dāng)各個(gè)模定義數(shù)據(jù)段時(shí),同樣也要注意這個(gè)問題。當(dāng)各個(gè)模塊的數(shù)據(jù)段不同時(shí),要正確設(shè)置數(shù)

47、據(jù)段塊的數(shù)據(jù)段不同時(shí),要正確設(shè)置數(shù)據(jù)段DS寄存器寄存器的段基地址的段基地址第5章最新匯編語言5處理好參數(shù)傳遞問題少量參數(shù)可用寄存器或堆棧直接傳送數(shù)據(jù)少量參數(shù)可用寄存器或堆棧直接傳送數(shù)據(jù)本身本身大量數(shù)據(jù)可以安排在緩沖區(qū),用寄存器或大量數(shù)據(jù)可以安排在緩沖區(qū),用寄存器或堆棧傳送數(shù)據(jù)的存儲(chǔ)地址堆棧傳送數(shù)據(jù)的存儲(chǔ)地址還可利用變量傳遞參數(shù),但是要采用還可利用變量傳遞參數(shù),但是要采用public/extern聲明為公共(全局)變量聲明為公共(全局)變量這些也是子程序間的參數(shù)傳遞方法這些也是子程序間的參數(shù)傳遞方法另外,第另外,第7章混合編程介紹了更好的堆棧章混合編程介紹了更好的堆棧傳遞參數(shù)方法,可以采用傳遞參

48、數(shù)方法,可以采用第5章最新匯編語言5例5.12b主程序主程序lt512b.asm并入宏定義并入宏定義子程序文件子程序文件sub512b.asm,要,要加上段定義語句、聲明語句等,加上段定義語句、聲明語句等,但不需要起始點(diǎn)和結(jié)束點(diǎn)但不需要起始點(diǎn)和結(jié)束點(diǎn)模塊連接的操作步驟:模塊連接的操作步驟: 分別編輯生成各個(gè)文件分別編輯生成各個(gè)文件 分別匯編各個(gè)文件分別匯編各個(gè)文件 連接各個(gè)目標(biāo)文件,形成連接各個(gè)目標(biāo)文件,形成可執(zhí)行文件可執(zhí)行文件最新匯編語言5.; ;宏定義宏定義.code.codepublic countpublic count; ;定義定義countcount共用共用extern ALdis

49、p:near,sorting:near,input:farextern ALdisp:near,sorting:near,input:far; ;聲明其他模塊中的子程序聲明其他模塊中的子程序.startup.startup.exit 0.exit 0; ;去掉(去掉(lt512a.asmlt512a.asm中的)包含語句中的)包含語句endendLt512b.asmLt512b.asm最新匯編語言5.model small.model small ; ;定義同樣的存儲(chǔ)模式定義同樣的存儲(chǔ)模式extern count:wordextern count:word; ;在其他模塊定義了字變量在其他模塊

50、定義了字變量countcount.code.code; ;子程序在代碼段中子程序在代碼段中public aldisp,sorting,inputpublic aldisp,sorting,input;3;3個(gè)子程序是共用的個(gè)子程序是共用的AldispAldispprocproc; ;仍然作為近調(diào)用仍然作為近調(diào)用sortingsorting procproc; ;仍然作為近調(diào)用仍然作為近調(diào)用inputinputproc farproc far; ;修改為遠(yuǎn)調(diào)用修改為遠(yuǎn)調(diào)用.mov count,cxmov count,cx ; ;提供出口參數(shù)提供出口參數(shù).inputinputendpendpend

51、end; ;結(jié)束匯編結(jié)束匯編sub512b.asmsub512b.asm最新匯編語言5把常用子程序?qū)懗瑟?dú)立的源文件,單把常用子程序?qū)懗瑟?dú)立的源文件,單獨(dú)匯編形成獨(dú)匯編形成OBJ文件后,存入子程序庫文件后,存入子程序庫主程序也單獨(dú)匯編形成主程序也單獨(dú)匯編形成OBJ文件文件主程序連接時(shí),調(diào)入子程序庫中的子主程序連接時(shí),調(diào)入子程序庫中的子程序模塊,產(chǎn)生最終的可執(zhí)行文件程序模塊,產(chǎn)生最終的可執(zhí)行文件例例5.12c5.12c 主程序文件主程序文件 lt512c.asm 子程序文件子程序文件 sub512c1.asm 子程序文件子程序文件 sub512c2.asm 子程序文件子程序文件 sub512c3.

52、asm5.3.3 子程序庫的調(diào)入3最新匯編語言5子程序庫子程序庫文件(子程序庫文件(.LIB)是子程序模塊的集合,其中)是子程序模塊的集合,其中存放著各子程序的名稱、目標(biāo)代碼及有關(guān)定位信存放著各子程序的名稱、目標(biāo)代碼及有關(guān)定位信息息存入庫的子程序的編寫與目標(biāo)文件連接方法中的存入庫的子程序的編寫與目標(biāo)文件連接方法中的要求一樣,只是為方便調(diào)用,更加嚴(yán)格要求一樣,只是為方便調(diào)用,更加嚴(yán)格子程序文件編寫完成后,匯編形成目標(biāo)文件;然子程序文件編寫完成后,匯編形成目標(biāo)文件;然后利用庫管理工具程序后利用庫管理工具程序LIB.EXE,把子程序目標(biāo)模,把子程序目標(biāo)模塊逐一加入到庫中塊逐一加入到庫中LIB 庫文件名庫文件名 + 子程序目標(biāo)文件名子程序目標(biāo)文件名庫管理程序庫管理程序LIB幫助創(chuàng)建、組織和維護(hù)子程序模塊幫助創(chuàng)建、組織和維護(hù)子程序模塊庫,例如增加、刪除、替換、合并庫文件等庫,例如增加、刪除、替換、合并庫文件等第5章最新匯編語言5.; ;宏定義宏定義.code.

溫馨提示

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