




已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章 教學(xué)重點(diǎn) 在掌握基本的匯編語言程序設(shè)計方法之后 進(jìn)一步學(xué)習(xí)如何提高編程效率的各種實用方法 高級語言特性宏結(jié)構(gòu)模塊化 5 1高級語言特性 MASM6 0引入高級語言的程序設(shè)計特性條件控制偽指令 IF ELSE ENDIF循環(huán)控制偽指令 WHILE ENDW REPEAT UNTIL過程聲明和過程調(diào)用偽指令 PROTO INVOKE 要調(diào)用帶參數(shù)過程定義的過程 不應(yīng)采用CALL指令 因為比較煩瑣應(yīng)該采用過程調(diào)用偽指令I(lǐng)NVOKE使用INVOKE偽指令的前提是需要用PROTO偽指令對過程進(jìn)行聲明 5 1 3過程聲明和過程調(diào)用偽指令 過程名PROC調(diào)用距離語言類型作用范圍USES寄存器列表 參數(shù) 類型LOCAL參數(shù)表 匯編語言語句過程名ENDP 過程聲明偽指令 用于事先聲明過程的結(jié)構(gòu)過程名PROTO調(diào)用距離語言類型 參數(shù) 類型過程調(diào)用偽指令I(lǐng)NVOKE過程名 參數(shù) 如何調(diào)用 匯編語言程序 lt503 asm modelsmallchecksumdPROTOc word word 聲明過程 stack dataarraydb12h 25h 0f0h 0a3h 3db68h 71h 0cah 0ffh 90hcountequ array 數(shù)組的元素個數(shù)resultdb 校驗和 code startupINVOKEchecksumd count offsetarray 調(diào)用過程movresult al 保存校驗和 exit0 例5 3 1 2 列表文件 checksumdPROCcUSESbxcx countp word arrayp wordmovbx arrayp BX 數(shù)組的偏移地址movcx countp CX 數(shù)組的元素個數(shù)xoral alsumd addal bx 求和 AL AL DS BX incbxloopsumdretchecksumdendpend 例5 3 2 2 列表文件 lt503 asm的列表文件 lt503 lst INVOKEchecksumd count offsetarray movax wordptrOFFSETarray pushax movax 000Ah pushax callchecksumd addsp 04hmovresult al 例5 3 1 2 checksumdPROCcUSESbxcx countp word arrayp word pushbp 起始代碼 movbp sp pushbx 保護(hù)bx和cx pushcxmovbx arrayp arrayp BP 6 movcx countp cuontp BP 4 ret popcx 結(jié)尾代碼 popbx popbp ret0000hchecksumcendp 例5 3 2 2 5 2宏結(jié)構(gòu)程序設(shè)計 宏匯編重復(fù)匯編條件匯編 統(tǒng)稱宏結(jié)構(gòu) 宏 Macro 是匯編語言的一個特點(diǎn) 它是與子程序類似又獨(dú)具特色的另一種簡化源程序的方法 宏 具有宏名的一段匯編語句序列 宏定義時書寫宏指令 這段匯編語句序列的縮寫 宏調(diào)用時書寫宏展開 宏指令處用這段宏代替的過程 宏匯編時實現(xiàn)宏的參數(shù)功能強(qiáng)大 頗具特色配合宏 還有宏操作符和有關(guān)偽指令 5 2 1宏匯編 宏定義 宏名macro 形參表 宏定義體endm mainbeginMACRO 定義名為mainbegin的宏 無參數(shù)movax data 宏定義體movds axENDM 宏定義結(jié)束mainendMACROretnum 帶有形參retnummoval retnum 宏定義中使用參數(shù)movah 4chint21hENDM 宏注釋符 宏調(diào)用 宏名 實參表 start mainbegin 宏調(diào)用 建立DS內(nèi)容dispmsgstring 宏調(diào)用 顯示字符串mainend0 宏調(diào)用 返回DOSendstart宏調(diào)用的實質(zhì)是在匯編過程中進(jìn)行宏展開宏展開的具體過程是 當(dāng)匯編程序掃描源程序遇到已有定義的宏調(diào)用時 即用相應(yīng)的宏定義體取代源程序的宏指令 同時用位置匹配的實參對形參進(jìn)行取代 宏展開 宏展開 在匯編時 用宏定義體的代碼序列替代宏指令的過程 start mainbegin 宏指令1movax data 宏展開1movds axmainend0 宏指令1moval 0 宏展開1movah 4ch1int21h 宏的參數(shù) 宏的參數(shù)使用非常靈活 宏定義時 可以無參數(shù) 例如5 4a的mainbegin可以帶有一個參數(shù) 例如5 4a的mainend也可以具有多個參數(shù) 例如5 5a的shlext參數(shù)可以是常數(shù) 變量 存儲單元 指令 操作碼 或它們的一部分 也可以是表達(dá)式 例如5 5b的shift和shrot宏定義體可以是任何合法的匯編語句 既可以是硬指令序列 又可以是偽指令序列 例如5 6的dstring 宏定義shlextmacroshloprand shlnumpushcxmovcl shlnumshlshloprand clpopcxendm 宏指令shlextax 6 宏展開1pushcx1movcl 061shlax cl1popcx 例5 5a 統(tǒng)一4條移位指令的宏指令shiftmacrosoprand snum sopcodepushcxmovcl snums sopcode soprand clpopcxendm 統(tǒng)一移位和循環(huán)移位8條指令的宏指令shrotmacrosroprand srnum sropcodepushcxmovcl srnumsropcodesroprand clpopcxendm 例5 5b 替換操作符 宏定義dstringmacrostringdb string 0dh 0ah endm 宏調(diào)用dstringdstring 宏展開1db Thisisaexample 0dh 0ah 1db 0 Number 10 0dh 0ah 例5 6 轉(zhuǎn)義注釋符 傳遞注釋符 宏操作符 宏注釋符 用于表示在宏定義中的注釋 采用這個符號的注釋 在宏展開時不出現(xiàn) 替換操作符 用于將參數(shù)與其他字符分開 如果參數(shù)緊接在其他字符之前或之后 或者參數(shù)出現(xiàn)在帶引號的字符串中 就必須使用該偽操作符 宏操作符 字符串傳遞操作符 用于括起字符串 在宏調(diào)用中 如果傳遞的字符串實參數(shù)含有逗號 空格等間隔符號 則必須用這對操作符 以保證字符串的完整 轉(zhuǎn)義操作符 用于指示其后的一個字符作為一般字符 不含特殊意義 表達(dá)式操作符 用在宏調(diào)用中 表示將后跟的一個表達(dá)式的值作為實參 而不是將表達(dá)式本身作為參數(shù) 與宏有關(guān)的偽指令 局部標(biāo)號偽指令LOCAL標(biāo)號列表宏定義體采用了標(biāo)號 應(yīng)使用LOCAL加以說明它必須是宏定義MACRO語句之后的第一條語句宏定義刪除偽指令PURGE宏名表不需要某個宏定義時 可以把它刪除宏定義退出偽指令EXITM偽指令EXITM表示結(jié)束當(dāng)前宏調(diào)用的展開 宏定義absolmacrooprdlocalnextcmpoprd 0jgenextnegoprdnext endm 例5 7 宏調(diào)用absolwordptr bx absolbx 宏展開1cmpwordptr bx 01jge 00001negwordptr bx 1 0000 1cmpbx 01jge 00011negbx1 0001 比較 僅是源程序級的簡化 宏調(diào)用在匯編時進(jìn)行程序語句的展開 不需要返回 不減小目標(biāo)程序 執(zhí)行速度沒有改變通過形參 實參結(jié)合實現(xiàn)參數(shù)傳遞 簡捷直觀 靈活多變 還是目標(biāo)程序級的簡化 子程序調(diào)用在執(zhí)行時由CALL指令轉(zhuǎn)向 RET指令返回 形成的目標(biāo)代碼較短 執(zhí)行速度減慢需要利用寄存器 存儲單元或堆棧等傳遞參數(shù) 宏 子程序 宏與子程序具有各自的特點(diǎn) 程序員應(yīng)該根據(jù)具體問題選擇使用那種方法通常 當(dāng)程序段較短或要求較快執(zhí)行時 應(yīng)選用宏 當(dāng)程序段較長或為減小目標(biāo)代碼時 要選用子程序 比較結(jié)論 宏 子程序 5 2 2重復(fù)匯編 重復(fù)匯編指在匯編過程中 重復(fù)展開一段 基本 相同的語句重復(fù)匯編沒有名字 不能被調(diào)用重復(fù)匯編常用在宏定義體中 也可以在一般匯編語句中使用重復(fù)匯編偽指令有三個 REPEAT 按參數(shù)值重復(fù)FOR 按參數(shù)個數(shù)重復(fù)FORC 按參數(shù)的字符個數(shù)重復(fù)最后 用ENDM結(jié)束 按參數(shù)值重復(fù) REPEAT重復(fù)次數(shù)重復(fù)體ENDM char A REPEAT26dbcharchar char 1ENDM 1dbchar 等效于db A 1char char 11dbchar 等效于db B 1char char 1 1dbchar 等效于db Z 1char char 1 按參數(shù)個數(shù)重復(fù) FOR形參 實參表 重復(fù)體ENDM FORregad pushregadENDM 1pushax1pushbx1pushcx1pushdx 按參數(shù)字符個數(shù)重復(fù) FORC形參 字符串重復(fù)體ENDM FORCregad dcbapop regad xENDM 1popdx1popcx1popbx1popax 5 2 3條件匯編 條件匯編偽指令在匯編過程中 根據(jù)條件決定匯編的語句IFxx表達(dá)式 滿足 匯編分支語句體1分支語句體1 ELSE 不滿足 匯編分支語句體2分支語句體2 ENDIF 條件匯編結(jié)束 pdatamacronumIFnumlt100 如果num 100 則匯編如下語句dbnumdup ELSE 否則 匯編如下語句db100dup ENDIFendmpdata12 宏調(diào)用 db12dup 宏匯編結(jié)果 pdata102 宏調(diào)用 db100dup 宏匯編結(jié)果 例5 10 宏結(jié)構(gòu)的作用 宏匯編 重復(fù)匯編和條件匯編為源程序的編寫提供了很多方便 靈活運(yùn)用它們可以編寫出非常良好的源程序來匯編系統(tǒng)中有些以圓點(diǎn)起始的偽指令 如 startup exit等 實際上是一種宏結(jié)構(gòu) dstringMACROstring 定義字符串db 設(shè)置數(shù)據(jù)段地址movax dssegmovds axENDMdispmsgMACROmessagemovdx offsetmessagemovah 09hint21hENDM 例題5 4 1 3 mainendMACROretnum 返回DOS 可不帶參數(shù)ifbmovah 4ch 沒有參數(shù)elsemovax 4c00h retnumAND0ffh 有參數(shù)endifint21hENDM 例題5 4 2 3 modelsmall stack256 datamsg1equthisbytedstringmsg2equthisbytedstring codestart mainbegin data 建立DS內(nèi)容dispmsgmsg1 顯示msg1字符串dispmsgmsg2 顯示msg2字符串mainend 返回DOSendstart 例題5 4 3 3 將程序分段 采用子程序或宏結(jié)構(gòu)都是進(jìn)行模塊化程序設(shè)計本節(jié)介紹開發(fā)大型程序時采用的方法 源程序文件的包含目標(biāo)模塊連接子程序庫 5 3模塊化程序設(shè)計 例題5 12將鍵盤輸入的數(shù)據(jù)按升序輸出 把源程序分放在幾個文本文件中 在匯編時通過包含偽指令I(lǐng)NCLUDE結(jié)合成一體INCLUDE文件名可將常用的子程序形成 ASM匯編語言源文件可將常用的宏定義存放在 MAC宏庫文件中可將常量定義 聲明語句組織在 INC包含文件中例5 12a 宏庫文件lt512a mac 主程序文件lt512a asm 子程序文件sub512a asm 5 3 1源程序文件的包含 dispcharmacrochar 顯示char字符movdl charmovah 2int21hendmdispmsgmacromessage 顯示message字符串movdx offsetmessagemovah 9int21hendm Lt512a mac includelt512a mac dispmsgmsg1 提示輸入數(shù)據(jù)movbx offsetbufcallinput 數(shù)據(jù)輸入cmpcx 0jestart4 沒有輸入數(shù)據(jù)則退出movcount cx 顯示輸入的數(shù)據(jù) 數(shù)據(jù)排序 顯示經(jīng)排序后的數(shù)據(jù)start4 exit0includesub512a asmend Lt512a asm 子程序源文件有3個子程序ALdisp 顯示2位16進(jìn)制數(shù)子程序 例4 10 sorting 排序子程序 例4 8 input 鍵盤輸入子程序還包含一個宏convert 將DX兩位ASCII碼轉(zhuǎn)換為兩位16進(jìn)制數(shù) sub512a asm 讓我們重點(diǎn)分析鍵盤輸入子程序input 鍵盤輸入子程序 入口參數(shù) ds bx 存放數(shù)據(jù)的緩沖區(qū) 出口參數(shù) cx 數(shù)據(jù)個數(shù)inputprocpushaxpushdxxorcx cx 數(shù)據(jù)個數(shù)清0input01 xordx dx 輸入字符清0input02 movah 1 鍵盤輸入一個字符int21h input之一 input10 cmpal 0dhjeinput30 是回車 結(jié)束整個數(shù)據(jù)的輸入cmpal jeinput20 是空格和逗號 確認(rèn)輸入了一個數(shù)據(jù)cmpal jeinput20cmpal 08hjeinput17 是退格 丟棄本次輸入的數(shù)據(jù) 出錯 input之二 cmpal 0 有效數(shù)字判斷 圖5 2b jbinput17 小于 0 不是有效數(shù)字 出錯cmpal f jainput17 大于 f 不是有效數(shù)字cmpal a jbinput11subal 20h a f 轉(zhuǎn)換成大寫 A F jmpinput12input11 cmpal F jainput17 字符小于 a 大于 F 出錯cmpal A jaeinput12 是 A F 有效字符cmpal 9 jainput17 是 0 9 有效字符 input之三 input12 cmpdl 0 有效字符的處理jneinput13movdl al dl 0 輸入了一個數(shù)據(jù)的低位 則dl aljmpinput02 轉(zhuǎn)到字符輸入input13 cmpdh 0jneinput17 dl 0 dh 0輸入3位數(shù)據(jù) 出錯movdh dl dl 0 dh 0輸入了一個數(shù)據(jù)的高位movdl al dh dl dl aljmpinput02 轉(zhuǎn)到字符輸入 input之四 input17 movdl 7 輸入錯誤處理movah 2int21hmovdl movah 2int21hjmpinput01 轉(zhuǎn)到輸入一個數(shù)據(jù) input之五 轉(zhuǎn)換正確的輸入數(shù)據(jù) 圖5 2c input20 convertjmpinput01 轉(zhuǎn)到輸入一個數(shù)據(jù)input30 convertpopdxpopaxret 返回 出口參數(shù)已設(shè)定inputendp input之六 將DX兩位ASCII碼轉(zhuǎn)換為兩位16進(jìn)制數(shù) 圖5 2c convertmacrolocalinput21 input22localinput24 input25cmpdl 0 dl 0 沒有要轉(zhuǎn)換的數(shù)據(jù) 退出jeinput25 convert之一 cmpdl 9 jbeinput21subdl 7 字符A F 則減7input21 anddl 0fh 轉(zhuǎn)換低位cmpdh 0 dh 0 沒有高位數(shù)據(jù)jeinput24cmpdh 9 jbeinput22subdh 7input22 shldh 1shldh 1shldh 1shldh 1 轉(zhuǎn)換高位ordl dh 合并高 低位 convert之二 源文件包含的操作步驟 分別編輯生成各個文件 匯編 連接主程序文件 input24 mov bx dl 存入緩沖區(qū)incbxinccx 數(shù)據(jù)加1input25 endm convert之三 把常用子程序?qū)懗瑟?dú)立的源程序文件 單獨(dú)匯編 形成子程序的目標(biāo)文件 OBJ主程序也經(jīng)過獨(dú)立匯編之后形成目標(biāo)文件連接程序?qū)⑺心繕?biāo)文件連接起來 最終產(chǎn)生可執(zhí)行文件需要遵循的原則 聲明共用的變量 過程等 實現(xiàn)正確的段組合 處理好參數(shù)傳遞問題 5 3 2目標(biāo)代碼文件的連接 聲明共用的變量 過程 各個模塊間共用的變量 過程等要說明PUBLIC標(biāo)識符 標(biāo)識符 定義標(biāo)識符的模塊使用EXTERN標(biāo)識符 類型 標(biāo)識符 類型 調(diào)用標(biāo)識符的模塊使用標(biāo)識符是變量名 過程名等類型是byte word dword 變量 或near far 過程 在一個源程序中 public extern語句可以有多條各模塊間的public extern偽指令要互相配對 并且指明的類型互相一致 實現(xiàn)正確的段組合 子程序文件必須定義在代碼段中 也可以具有局部的數(shù)據(jù)變量采用簡化段定義格式 只要采用相同的存儲模式 容易實現(xiàn)正確的近或遠(yuǎn)調(diào)用完整段定義格式中 為了實現(xiàn)模塊間的段內(nèi)近調(diào)用 near類型 各自定義的段名 類別必須相同 組合類型都是public 實際的程序開發(fā)中 各個模塊往往由不同的程序員完成 不易實現(xiàn)段同名或類別相同 所以索性定義成遠(yuǎn)調(diào)用 far類型 定義數(shù)據(jù)段時 同樣也要注意這個問題 當(dāng)各個模塊的數(shù)據(jù)段不同時 要正確設(shè)置數(shù)據(jù)段DS寄存器的段基地址 處理好參數(shù)傳遞問題 少量參數(shù)可用寄存器或堆棧直接傳送數(shù)據(jù)本身大量數(shù)據(jù)可以安排在緩沖區(qū) 用寄存器或堆棧傳送數(shù)據(jù)的存儲地址還可利用變量傳遞參數(shù) 但是要采用public extern聲明為公共 全局 變量這些也是子程序間的參數(shù)傳遞方法另外 第7章混合編程介紹了更好的堆棧傳遞參數(shù)方法 可以采用 例5 12b 主程序lt512b asm并入宏定義子程序文件sub512b asm 要加上段定義語句 聲明語句等 但不需要起始點(diǎn)和結(jié)束點(diǎn) 模塊連接的操作步驟 分別編輯生成各個文件 分別匯編各個文件 連接各個目標(biāo)文件 形成可執(zhí)行文件 宏定義 codepubliccount 定義count共用externALdisp near sorting near input far 聲明其他模塊中的子程序 startup exit0 去掉 lt512a asm中的 包含語句end Lt512b asm modelsmall 定義同樣的存儲模式externcount word 在其他模塊定義了字變量count code 子程序在代碼段中publicaldisp sorting input 3個子程序是共用的Aldispproc 仍然作為近調(diào)用sortingproc 仍然作為近調(diào)用inputprocfar 修改為遠(yuǎn)調(diào)用 movcount cx 提供出口參數(shù) inputendpend 結(jié)束匯編 sub512b asm 把常用子程序?qū)懗瑟?dú)立的源文件 單獨(dú)匯編形成OBJ文件后 存入子程序庫主程序也單獨(dú)匯編形成OBJ文件主程序連接時 調(diào)入子程序庫中的子程序模塊 產(chǎn)生最終的可執(zhí)行文件例5 12c 主程序文件lt512c asm 子程序文件sub512c1 asm 子程序文件sub512c2 asm 子程序文件sub512c3 asm 5 3 3子程序庫的調(diào)入 子程序庫 子程序庫文件 LIB 是子程序模塊的集合 其中存放著各子程序的名稱 目標(biāo)代碼及有關(guān)定位信息存入庫的子程序的編寫與目標(biāo)文件連接方法中的要求一樣 只是為方便調(diào)用 更加嚴(yán)格子程序文件編寫完成后 匯編形成目標(biāo)文件 然后利用庫管理工具程序LIB EXE 把子程序目標(biāo)模塊逐一加入到庫中LIB庫文件名 子程序目標(biāo)文件名庫管理程序LIB幫助創(chuàng)建 組織和維護(hù)子程序模塊庫 例如增加 刪除 替換 合并庫文件等 宏定義 codeexternALdisp nea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/IEC 27031:2025 EN Cybersecurity - Information and communication technology readiness for business continuity
- 《倍數(shù)的理解與應(yīng)用課件》
- 橋隧工初級練習(xí)題及答案(附解析)
- 小螞蟻課件教學(xué)課件
- 2023年6月材料員(基礎(chǔ))模擬考試題與答案(附解析)
- 電腦系統(tǒng)啟動順序調(diào)整與優(yōu)化技巧考核試卷
- 技術(shù)服務(wù)國際市場拓展與國際貿(mào)易考核試卷
- 《td水泥廠節(jié)能評估》課件
- 安全監(jiān)控系統(tǒng)的安全運(yùn)維管理流程考核試卷
- 《T推行手冊》課件
- 2023年浙江省金華市義烏市小升初英語試卷
- 中南財經(jīng)政法大學(xué)場地使用申報表
- 煙草物理檢驗競賽考試題庫及答案附有答案
- QCT957-2023洗掃車技術(shù)規(guī)范
- 理智與情感:愛情的心理文化之旅智慧樹知到期末考試答案章節(jié)答案2024年昆明理工大學(xué)
- MOOC 樹木學(xué)-北京林業(yè)大學(xué) 中國大學(xué)慕課答案
- MOOC 國際交流英文寫作中國大學(xué)慕課答案
- GB/T 43632-2024供應(yīng)鏈安全管理體系供應(yīng)鏈韌性的開發(fā)要求及使用指南
- 《光伏發(fā)電工程預(yù)可行性研究報告編制規(guī)程》(NB/T32044-2018)中文版
- 自動焊錫機(jī)安全操作規(guī)程培訓(xùn)
- 空管自動化系統(tǒng)的基本組成與功能課件
評論
0/150
提交評論