freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

匯編語言程序設(shè)計(編輯修改稿)

2025-08-31 17:41 本頁面
 

【文章內(nèi)容簡介】 X] 。BX所指內(nèi)存雙字單元的值是子程序的偏移量和段值 第 7章 子程序和庫 當(dāng)子程序執(zhí)行完時,需要返回到調(diào)用它的程序之中。為了實現(xiàn)此功能,指令系統(tǒng)提供了一條專用的子程序返回指令。其格式如下: RET/RETN/RETF [Imm] 子程序的返回在功能上是子程序調(diào)用的逆操作。為了與子程序的遠、近調(diào)用相對應(yīng),子程序的返回也分:遠返回和近返回。 返回指令 第 7章 子程序和庫 如果返回指令后面帶有立即數(shù) (其值通常為偶數(shù) ),則表示在得到返回地址之后,SP還要增加的偏移量,它不是類似于高級語言中子程序的返回值。 例如: RET ??赡苁墙祷?,也可能是遠返回 RETN 。近返回指令 RETF 。遠返回指令 RET 6 。子程序返回后, (SP)←(SP) + 6 第 7章 子程序和庫 例 :編寫一個子程序 UPPER,實現(xiàn)把寄存器 AL中存放的字符變大寫。 解: 。子程序功能:把 AL中存放的字符變大寫 。入口參數(shù): AL 。出口參數(shù): AL 。算法描述:判斷 AL中字符必須在’ a?~?z?之間才能把該字符變?yōu)榇髮? UPPER PROC CMP AL, ?a? 。書寫’ a?的 ASCII碼 61H也可以 JB over CMP AL, ?z? JA over SUB AL, 20H 。書寫指令 AND AL, 0DFH也可以 over: RET UPPER ENDP 例 :編寫一個求字符串長度的子程序 StrLen,該字符串以 0為結(jié)束標(biāo)志,其首地址存放在 DS:DX,其長度保存在 CX中返回。 解: 。子程序功能:求字符串的長度 。入口參數(shù): DS:DX存放字符串的首地址,該字符串以 0為結(jié)束標(biāo)志 。出口參數(shù): CX存放該字符串的長度 。算法描述:用 BX來指針來掃描字符串中的字符,如果遇到其結(jié)束標(biāo) 志,則停止掃描字符串操作 StrLen PROC PUSH AX PUSH BX 。用堆棧來保存子程序所用到的寄存器內(nèi)容 XOR CX, CX XOR AL, AL MOV BX, DX again: CMP [BX], AL JZ over INC CX 。增加字符串的長度 INC BX 。訪問字符串的指針向后移 JMP again over: POP BX ?;謴?fù)在子程序開始時所保存的寄存器內(nèi)容 POP AX RET StrLen ENDP 第 7章 子程序和庫 一方面,由于 CPU中的寄存器在任何程序中都是“可見”的,一個程序?qū)δ臣拇嫫髻x值后,在另一個程序中就能直接使用,所以,用寄存器來傳遞參數(shù)最直接、簡便,也是最常用的參數(shù)傳遞方式。但另一方面, CPU中寄存器的個數(shù)和容量都是非常有限,所以,該方法適用于傳遞較少的參數(shù)信息。 例 ,子程序處理的數(shù)據(jù)被保存在寄存器 AL中。假設(shè)有下列的程序段: … MOV AL, ?b? CALL UPPER 。子返回時, (AL)=?B? … MOV AL, ?2? CALL UPPER 。子返回時, AL的值不變,因為’ 2?不是字母 … 子程序的參數(shù)傳遞 寄存器傳遞參數(shù) 第 7章 子程序和庫 例 :按五位十進制的形式顯示寄存器 BX中的內(nèi)容,如果 BX的值小于 0,則應(yīng) 在顯示數(shù)值之前顯示負號‘ ?。 例如: (BX)=123,顯示: 00123; (BX)=234,顯示: 00234; 解: 見書,略。 第 7章 子程序和庫 在調(diào)用子程序時,當(dāng)需要向子程序傳遞大量數(shù)據(jù)時,因受到寄存器容量的限制,就不能采用寄存器傳遞參數(shù)的方式,而要改用約定存儲單元的傳送方式。 例 ,所處理的數(shù)據(jù)不是直接傳給子程序,而是把存儲它們的地址告訴子程序。 約定存儲單元傳遞參數(shù) 例 :編寫一個子程序分類統(tǒng)計出一個字符串中數(shù)字字符、字母和其它字符的個數(shù)。該字符串的首地址用 DS:DX來指定 (以 0為字符串結(jié)束 ),各類字符個數(shù)分別存放 BX、 CX和 DI中。 解: 見書,略。 例 :顯示出任意字符串中數(shù)字字符、字母和其它字符的個數(shù)。 解: 見書,略。 第 7章 子程序和庫 堆棧是一個特殊的數(shù)據(jù)結(jié)構(gòu),它通常是用來保存程序的返回地址。當(dāng)用它來傳遞參數(shù)時,勢必會造成數(shù)據(jù)和返回地址混合在一起的局面,用起來要特別仔細。 具體做法如下: 堆棧傳遞參數(shù) ?當(dāng)用堆棧傳遞入口參數(shù)時,要在調(diào)用子程序前把有關(guān)參數(shù)依次壓棧,子程序從堆棧中取到入口參數(shù); ?當(dāng)用堆棧傳遞出口參數(shù)時,要在子程序返回前,把有關(guān)參數(shù)依次壓棧 (這里還需要做點額外操作,要保證返回地址一定在棧頂 ),調(diào)用程序就可以從堆棧中取到出口參數(shù)。 第 7章 子程序和庫 用堆棧傳遞入口參數(shù)的調(diào)用方法: … PUSH Para1 … PUSH Paran 。把 n個字的參數(shù)壓棧 CALL SUBPRO 。調(diào)用子程序 SUBPRO … 第 7章 子程序和庫 用堆棧傳遞入口參數(shù)的調(diào)用方法: … PUSH Para1 … PUSH Paran 。把 n個字的參數(shù)壓棧 CALL SUBPRO 。調(diào)用子程序 SUBPRO … 第 7章 子程序和庫 在子程序中取入口參數(shù)的方法 ?段內(nèi)調(diào)用子程序 SUB1 PROC NEAR PUSH BP 。保護寄存器 BP MOV BP, SP 。用寄存器 BP來訪問堆棧,讀取參數(shù) … 。保護其它寄存器的指令 MOV Paran, [BP+4] … MOV Para1, [BP+4+2*(n1)] … SUB1 ENDP 從堆棧中取入口參數(shù) 第 7章 子程序和庫 ?段間調(diào)用子程序 在段間調(diào)用子程序時, CALL指令會把返回地址的偏移量和段寄存器 CS的內(nèi)容都壓棧。 在進入子程序后,需要用 BP來讀取傳遞過來的參數(shù),所以,也要先保護 BP原來的值,再把當(dāng)前 SP的值傳送給 BP。 當(dāng)前 BP所指向的堆棧單元與最后一個參數(shù)Paran之間隔著 BP的原值、返回地址的偏移量和段地址,所以,二者之間相差 6個字節(jié)。 第 7章 子程序和庫 在子程序中,保存和恢復(fù)寄存器內(nèi)容的主要方法是:在子程序的開始把它所用到的寄存器壓進棧,在返回前,再把它們彈出棧。這樣編寫的好處是該子程序可以被任何其它程序來調(diào)用。 在調(diào)用指令前,不需要保存寄存器,在調(diào)用指令后,也無需恢復(fù)寄存器。 利用堆棧來保存和恢復(fù)寄存器內(nèi)容方法的一般形式如下: XXXXX PROC PUSH REG1 。把所使用的寄存器壓棧, REGi代表某個寄存器 … PUSH REGn … 。子程序的處理功能語句 POP REGn 。前面壓棧的寄存器彈出,注意它們的次序 … POP REG1 RET XXXXX ENDP 寄存器的保護與恢復(fù) 第 7章 子程序和庫 在子程序中利用堆棧來保存和恢復(fù)寄存器內(nèi)容 。 利用堆棧來實現(xiàn)此項功能時 ,應(yīng)注意以下幾點: ?用堆棧保存和恢復(fù)寄存器的內(nèi)容,要注意堆?!跋冗M后出”的操作特點 ?通常情況下不保護入口參數(shù)寄存器的內(nèi)容,當(dāng)然,也可以根據(jù)事先的約定而對它們加以保護 ?如果用寄存器帶回子程序的處理結(jié)果,那么,這些寄存器一定不能加以保護 ?整個子程序的執(zhí)行幾乎肯定要改變標(biāo)志位,可用 PUSHF和 POPF來保護和恢復(fù)標(biāo)志位,但一般在子程序中不保護標(biāo)志位,除非有此特殊需要 第 7章 子程序和庫 子程序名 PROC [distance] [langtype] [visibility] [prologuearg] [USES 寄存器列表 ] [,參數(shù) [:數(shù)據(jù)類型 ]]... [LOCAL varlist] 子程序的程序體 子程序名 ENDP 定義子程序時,可使用參數(shù)表來直接指明其所要的參數(shù),但程序員必須先用.MODEL偽指令,或使用 langtype參數(shù)來說明本子程序所使用的程序設(shè)計語言類型。 程序員在定義子程序時,最好先說明該子程序的原型 (用偽指令 PROTO)。這樣,在調(diào)用時,系統(tǒng)可以自動進行類型檢查,也可以使用更方便的調(diào)用偽指令I(lǐng)NVOKE來調(diào)用該子程序。 子程序的完全定義 子程序完全定義格式 第 7章 子程序和庫 子程序的位距 (Distance)有: Near、 Far、 Near1 Far1 Near32和 Far32。 子程序位距描述符告訴匯編程序該子程序是在本段之內(nèi) (Near),還是在本段之外 (Far)。 子程序的位距 子程序語言類型 (Language Type)可以是任何一種有效的程序設(shè)計語句類型,由它來告訴匯編程序?qū)⑹褂檬裁礃拥臉?biāo)識符的命名風(fēng)格、子程序的調(diào)用和返回約定。該語言類型說明可使匯編語言程序與其它語言程序達到共享的目的。 程序員可用另外三種方法來設(shè)置程序的語言類型: .MODEL、 OPTION LANGTYPE:和命令行選項 /Gx。 若在程序和命令行中都說明了語言類型,那么,前者的說明優(yōu)先。 子程序的語言類型 第 7章 子程序和庫 子程序的可見性 (Visibility)決定該子程序?qū)ζ渌K是否可用。它共有三個屬性值: PRIVATE、 PUBLIC和 EXPORT。 子程序的可見性 當(dāng)程序員想用自己定義的宏來替代缺省的“起始”和“結(jié)束”的代碼段時,可用下列說明語句來實現(xiàn): OPTION PROLOGUE : MacroName1 OPTION EPILOGUE : MacroName2 PROLOGUE和 EPILOGUE分別指定 MacroName1和 MacroName2為“起始”和“結(jié)束”代碼段的宏名。 若程序員不要匯編程序自動產(chǎn)生“起始”和“結(jié)束”代碼,則可用 NONE來代替說明語句中的宏名,即: OPTION PROLOGUE : NONE OPTION EPILOGUE : NONE 子程序的 ” 起始 ” 和 ” 結(jié)束 ” 操作 第 7章 子程序和庫 保護寄存器說明子句的說明格式: USES 寄存器列表 該說明子句要求匯編程序為其生成保護和恢復(fù)寄存器的指令序列: ?在進入子程序執(zhí)行指令之前,把寄存器列表中的寄存器壓進堆棧; ?在結(jié)束子程序時,把先前壓進堆棧的寄存器彈出,以達到保護寄存器的目的。 寄存器列表:列舉出在子程序中需要保護的寄存器名,即:在子程序開始時需要把內(nèi)容進棧的寄存器名。若有多個寄存器名,則在寄存器名之間要用“ 空格 ”來分開。 寄存器的保護和恢復(fù) 第 7章 子程序和庫 例如: Dsip PROC USES AX DX, FUNC:WORD, MSG:PTR BYTE MOV DX, MSG MOV AX, FUNC INT 21H RET Disp ENDP 匯編程序在處理該子程序時,會根據(jù)子句 USES的作用,在第一條指令“ MOV DX, MSG”之前,插入把寄存器 AX和 DX進棧的指令序列,即: PUSH AX PUSH DX 而在返回指令 RET之前插入把寄存器 DX和 AX的值彈出的指令序列,即: POP DX POP AX 注意:若子程序含有多個 RET或 IRET指令,那么,匯編程序在每個 RET或IRET指令前都將增加相應(yīng)的彈出堆棧指令序列。 第 7章 子程序和庫 子程序參數(shù)是用來向子程序傳遞信息的數(shù)據(jù)。若有多個參數(shù),則參數(shù)之間
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1