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

正文內(nèi)容

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

2024-08-31 17:41 本頁(yè)面
 

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