




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
微機(jī)原理與接口技術(shù)錢(qián)曉捷主編課后習(xí)題答案(第五版)
第1章微型計(jì)算機(jī)系統(tǒng)
〔習(xí)題1.1)簡(jiǎn)答題
①處理器每個(gè)單位時(shí)間可以處理的二進(jìn)制數(shù)據(jù)位數(shù)稱(chēng)計(jì)算機(jī)字長(zhǎng)。
②總線信號(hào)分成三組,分別是數(shù)據(jù)總線、地址總線和控制總線。
③PC機(jī)主存采用DRAM組成。
④高速緩沖存儲(chǔ)器Cache是處理器與主存之間速度很快但容量較小的存儲(chǔ)器。
⑤ROM-BIOS是"基本輸入輸出系統(tǒng)",操作系統(tǒng)通過(guò)對(duì)BIOS的調(diào)用驅(qū)動(dòng)各
硬件設(shè)備,用戶也可以在應(yīng)用程序中調(diào)用BIOS中的許多功能。
⑥中斷是CPU正常執(zhí)行程序的流程被某種原因打斷、并暫時(shí)停止,轉(zhuǎn)向執(zhí)行事
先安排好的一段處理程序,待該處理程序結(jié)束后仍返回被中斷的指令繼續(xù)執(zhí)行的過(guò)
程。
⑦主板芯片組是主板的核心部件,它提供主板上的關(guān)鍵邏輯電路。
⑧MASM是微軟開(kāi)發(fā)的宏匯編程序。
⑨指令的處理過(guò)程。處理器的"取指一譯碼一執(zhí)行周期”是指處理器從主
存儲(chǔ)器讀取指令(簡(jiǎn)稱(chēng)取指),翻譯指令代碼的功能(簡(jiǎn)稱(chēng)譯碼),然后執(zhí)行指令
所規(guī)定的操作(簡(jiǎn)稱(chēng)執(zhí)行)的過(guò)程。
⑩機(jī)器語(yǔ)言層,即指令集結(jié)構(gòu)。
(學(xué)生很多認(rèn)為是:匯編語(yǔ)言層。前4章主要涉及匯編語(yǔ)言,但本書(shū)還有很多處
理器原理等內(nèi)容)
〔習(xí)題1.4〕
CPU:CPU也稱(chēng)處理器,是微機(jī)的核心。它采用大規(guī)模集成電路芯片,芯片內(nèi)
集成了控制器、運(yùn)算器和若干高速存儲(chǔ)單元(即寄存器)o處理器及其支持電路構(gòu)
成了微機(jī)系統(tǒng)的控制中心,對(duì)系統(tǒng)的各個(gè)部件進(jìn)行統(tǒng)一的協(xié)調(diào)和控制。
存儲(chǔ)器:存儲(chǔ)器是存放程序和數(shù)據(jù)的部件。
外部設(shè)備:外部設(shè)備是指可與微機(jī)進(jìn)行交互的輸入(Input)設(shè)備和輸出
(Output)設(shè)備,也稱(chēng)I/O設(shè)備。I/O設(shè)備通過(guò)I/O接口與主機(jī)連接。
總線:互連各個(gè)部件的共用通道,主要含數(shù)據(jù)總線、地址總線和控制總線信號(hào)。
〔習(xí)題1.5〕
通用微處理器:適合較廣的應(yīng)用領(lǐng)域的微處理器,例如裝在PC機(jī)、筆記本電腦、
工作站、服務(wù)器上的微處理器。
單片機(jī):是指通常用于控制領(lǐng)域的微處理器芯片,其內(nèi)部除CPU外還集成了計(jì)算
機(jī)的其他一些主要部件,只需配上少量的外部電路和設(shè)備,就可以構(gòu)成具體的應(yīng)用
系統(tǒng)。
DSP芯片:稱(chēng)數(shù)字信號(hào)處理器,也是一種微控制器,其更適合處理高速的數(shù)字信
號(hào),內(nèi)部集成有高速乘法器,能夠進(jìn)行快速乘法和加法運(yùn)算。
嵌入式系統(tǒng):利用微控制器、數(shù)字信號(hào)處理器或通用微處理器,結(jié)合具體應(yīng)用構(gòu)成
的控制系統(tǒng)。
〔習(xí)題1.6)
8086奠定了基本的16位指令集,80286提供了保護(hù)方式的各種指令,80386
將指令集全面提升為32位,80486融入了浮點(diǎn)數(shù)據(jù)處理指令,奔騰系列陸續(xù)增
加了多媒體指令MMX、SSE、SSE2和SSE3,最新的奔騰4處理器還支持64
位指令集。
〔習(xí)題1.7〕
助記符:人們采用便于記憶、并能描述指令功能的符號(hào)來(lái)表示機(jī)器指令操作碼,
該符號(hào)稱(chēng)為指令助記符。
匯編語(yǔ)言:用助記符表示的指令以及使用它們編寫(xiě)程序的規(guī)則就形成匯編語(yǔ)言。
匯編語(yǔ)言程序:用匯編語(yǔ)言書(shū)寫(xiě)的程序就是匯編語(yǔ)言程序,或稱(chēng)匯編語(yǔ)言源程序。
匯編程序:匯編語(yǔ)言源程序要翻譯成機(jī)器語(yǔ)言程序才可以由處理器執(zhí)行。這個(gè)翻譯
的過(guò)程稱(chēng)為“匯編",完成匯編工作的程序就是匯編程序(Assembler)。
〔習(xí)題1.8〕
路徑:操作系統(tǒng)以目錄形式管理磁盤(pán)上的文件,文件所在的分區(qū)和目錄就是該文件
的路徑。
絕對(duì)路徑:從根目錄到文件所在目錄的完整路徑稱(chēng)為"絕對(duì)路徑"。是保證文件唯
一性的標(biāo)示方法。
相對(duì)路徑:從系統(tǒng)當(dāng)前目錄到文件所在目錄的路徑稱(chēng)為相對(duì)路徑。
當(dāng)前目錄:用戶當(dāng)前所在的目錄就是當(dāng)前目錄。
指明的路徑不正確,或者執(zhí)行了另外一個(gè)同名的文件。
〔習(xí)題1.9)
每18個(gè)月,集成電路的性能將提高一^,而其價(jià)格將降低一半。(1965年,
Intel公司的創(chuàng)始人之一摩爾預(yù)言:集成電路上的晶體管密度每年將翻倍?,F(xiàn)在這
個(gè)預(yù)言通常表達(dá)為:每隔18個(gè)月硅片密度(晶體管容量)將翻倍;也常被表達(dá)為:
每18個(gè)月,集成電路的性能將提高一倍,而其價(jià)格將降低一半。)
不能。由于電子器件的物理極限在悄然逼近,摩爾定律不會(huì)永遠(yuǎn)持續(xù)。
〔習(xí)題1.10)
采用二進(jìn)制形式表示數(shù)據(jù)和指令。指令由操作碼和地址碼組成。
將程序和數(shù)據(jù)存放在存儲(chǔ)器中,計(jì)算機(jī)在工作時(shí)從存儲(chǔ)器取出指令加以執(zhí)行,自動(dòng)
完成計(jì)算任務(wù)。這就是“存儲(chǔ)程序"和"程序控制"(簡(jiǎn)稱(chēng)存儲(chǔ)程序控制)的概念。
指令的執(zhí)行是順序的,即一般按照指令在存儲(chǔ)器中存放的順序執(zhí)行,程序分支由轉(zhuǎn)
移指令實(shí)現(xiàn)。
計(jì)算機(jī)由存儲(chǔ)器、運(yùn)算器、控制器、輸入設(shè)備和輸出設(shè)備五大基本部件組成,并規(guī)
定了5部分的基本功能。
〔習(xí)題1.11)
最上層是用戶層。
第5層是高級(jí)語(yǔ)言層。
第4層是匯編語(yǔ)言層。
第3層是操作系統(tǒng)層。
第2層是機(jī)器語(yǔ)言層。
第1層是控制層。
第。層是數(shù)字電路層。
普通計(jì)算機(jī)用戶和軟件人員對(duì)計(jì)算機(jī)系統(tǒng)的認(rèn)識(shí)并不一樣。普通計(jì)算機(jī)用戶看到的
計(jì)算機(jī),也就是我們最熟悉的計(jì)算機(jī),屬于用戶層,而軟件人員看到的屬于高級(jí)語(yǔ)
言層或是匯編語(yǔ)言層。
〔習(xí)題1.12)
系列機(jī)是指在一個(gè)廠家生產(chǎn)的具有相同計(jì)算機(jī)結(jié)構(gòu),但具有不同組成和實(shí)現(xiàn)的一系
列(Family)不同檔次、不同型號(hào)的機(jī)器。
兼容機(jī)是指不同廠家生產(chǎn)的具有相同計(jì)算機(jī)結(jié)構(gòu)(不同的組成和實(shí)現(xiàn))的計(jì)算機(jī)。
兼容是一個(gè)廣泛的概念,包括軟件兼容、硬件兼容、系統(tǒng)兼容等。其中軟件兼容是
指同一個(gè)軟件可以不加修改地運(yùn)行于體系結(jié)構(gòu)相同的各檔機(jī)器,結(jié)果一樣但運(yùn)行
時(shí)間可能不同。軟件兼容可從機(jī)器性能和推出時(shí)間分成向上(向下)和向前(向后)
兼容。例如32位PC機(jī)就陸續(xù)增加了對(duì)浮點(diǎn)處理指令、多媒體指令等的支持。在
保證向后兼容的前提下,不斷改進(jìn)其組成和實(shí)現(xiàn),延續(xù)計(jì)算機(jī)結(jié)構(gòu)的生命,才使得
PC機(jī)具有如此強(qiáng)大的生命力。
〔習(xí)題1.13)
酷睿2多核處理器。
〔習(xí)題1.14]
高級(jí)語(yǔ)言與具體的計(jì)算機(jī)硬件無(wú)關(guān),其表達(dá)方式接近于所描述的問(wèn)題,易為人們接
受和掌握,用高級(jí)語(yǔ)言編寫(xiě)程序要比低級(jí)語(yǔ)言容易得多,并大大簡(jiǎn)化了程序的編制
和調(diào)試,使編程效率得到大幅度的提高。而匯編語(yǔ)言是為了便于理解與記憶,將機(jī)
器指令用助記符代替而形成的一種語(yǔ)言。匯編語(yǔ)言的語(yǔ)句通常與機(jī)器指令對(duì)應(yīng),因
此,匯編語(yǔ)言與具體的計(jì)算機(jī)有關(guān),屬于低級(jí)語(yǔ)言。它比機(jī)器語(yǔ)言直觀,容易理解
和記憶,用匯編語(yǔ)言編寫(xiě)的程序也比機(jī)器語(yǔ)言易閱讀、易排錯(cuò)。機(jī)器語(yǔ)言的每一條
機(jī)器指令都是二進(jìn)制形式的指令代碼,計(jì)算機(jī)硬件可以直接識(shí)別。高級(jí)語(yǔ)言程序通
常也需要翻譯成匯編語(yǔ)言程序,再進(jìn)一步翻譯成機(jī)器語(yǔ)言代碼。
〔習(xí)題1.15)
為了更好地進(jìn)行編程實(shí)踐,請(qǐng)進(jìn)入Windows操作系統(tǒng)下的控制臺(tái)環(huán)境(或MS-
DOS模擬環(huán)境),練習(xí)常用命令。
第2章處理器結(jié)構(gòu)〔解答〕
①ALU是算術(shù)邏輯運(yùn)算單元,負(fù)責(zé)處理器所能進(jìn)行的各種運(yùn)算,主要是算術(shù)運(yùn)算
和邏輯運(yùn)算。
②取指是指從主存取出指令代碼通過(guò)總線傳輸?shù)教幚砥鲀?nèi)部指令寄存器的過(guò)程。
8086分成總線接口單元和指令執(zhí)行單元,可以獨(dú)立操作。在執(zhí)行單元執(zhí)行一條指
令的同時(shí),總線接口單元可以讀取下一條指令,等到執(zhí)行時(shí)不需要進(jìn)行取指了,所
以稱(chēng)為預(yù)取。
③Pentium采用分離的Cache結(jié)構(gòu),一個(gè)用做指令Cache,一個(gè)用做數(shù)據(jù)
Cacheo
④堆棧的存取原則是先進(jìn)后出(也稱(chēng)為后進(jìn)先出)操作方式存取數(shù)據(jù)。
⑤標(biāo)志寄存器主要保存反映指令執(zhí)行結(jié)果和控制指令執(zhí)行形式的有關(guān)狀態(tài)。
⑥執(zhí)行了一條加法指令后,發(fā)現(xiàn)ZF=1,表明運(yùn)算結(jié)果為0。
⑦沒(méi)有。
⑧匯編語(yǔ)言的標(biāo)識(shí)符大4寫(xiě)不敏感,即表示字母大小寫(xiě)不同、但表示同一個(gè)符號(hào)。
⑨不會(huì)。
⑩指令的操作數(shù)需要通過(guò)存儲(chǔ)器地址或I/O地址,才能查找到數(shù)據(jù)本身,故稱(chēng)
數(shù)據(jù)尋址方式。
〔習(xí)題2.4)
處理器內(nèi)部有ALU、寄存器和指令處理三個(gè)基本單元。
8086有兩大功能部件:總線接口單元和執(zhí)行單元。
總線接口單元:管理著8086與系統(tǒng)總線的接口,負(fù)責(zé)處理器對(duì)存儲(chǔ)器和外設(shè)進(jìn)行
訪問(wèn)。8086所有對(duì)外操作必須通過(guò)BIU和這些總線進(jìn)行。
執(zhí)行單元EU:負(fù)責(zé)指令譯碼、數(shù)據(jù)運(yùn)算和指令執(zhí)行。
〔習(xí)題2.5〕
8086中,指令的讀取是在BIU單元,而指令的執(zhí)行是在EU單元。因?yàn)锽IU和
EU兩個(gè)單元相互獨(dú)立、分別完成各自操作,所以可以并行操作。也就是說(shuō),在
EU單元對(duì)一個(gè)指令進(jìn)行譯碼執(zhí)行時(shí),BIU單元可以同時(shí)對(duì)后續(xù)指令進(jìn)行讀取;這
就是最簡(jiǎn)單的指令流水線技術(shù)。
〔習(xí)題2.6)
標(biāo)志:用于反映指令執(zhí)行結(jié)果或控制指令執(zhí)行形式的一個(gè)或多個(gè)二進(jìn)制數(shù)位。例如,
有些指令執(zhí)行后會(huì)影響有關(guān)標(biāo)志位;有些指令的執(zhí)行要利用相關(guān)標(biāo)志。
狀態(tài)標(biāo)志:用來(lái)記錄程序運(yùn)行結(jié)果的狀態(tài)信息。
控制標(biāo)志:DF標(biāo)志,控制字符串操作的地址方向。
系統(tǒng)標(biāo)志:用于控制處理器執(zhí)行指令的方式。
狀態(tài)標(biāo)志在標(biāo)志寄存器EFLAGS中的位置和含義如下:
3111109876543210
……OFSFZFAFPFCF
〔習(xí)題2.7〕
進(jìn)位標(biāo)志CF表示無(wú)符號(hào)數(shù)運(yùn)算結(jié)果是否超出范圍,超出范圍后加上進(jìn)位或借位,
運(yùn)算結(jié)果仍然正確;溢出標(biāo)志OF表示有符號(hào)數(shù)運(yùn)算結(jié)果是否超出范圍,如果超出
范圍,運(yùn)算結(jié)果已經(jīng)不正確。
例1:3AH+7CH=B6H
無(wú)符號(hào)數(shù)運(yùn)算:58+124=182,范圍內(nèi),無(wú)進(jìn)位。
有符號(hào)數(shù)運(yùn)算:58+124=182,范圍外,有溢出。
例2:AAH+7CH=①26H
無(wú)符號(hào)數(shù)運(yùn)算:170+124=294,范圍外,有進(jìn)位。
有符號(hào)數(shù)運(yùn)算:-86+124=28,范圍內(nèi),無(wú)溢出。
〔習(xí)題2.8)
物理地址:在處理器地址總線上輸出的地址稱(chēng)為物理地址。每個(gè)存儲(chǔ)單元有一個(gè)唯
一的物理地址。
邏輯地址:在處理器內(nèi)部、程序員編程時(shí)采用邏輯地址,采用"段地址:偏移地址
"形式。某個(gè)存儲(chǔ)單元可以有多個(gè)邏輯地址,即處于不同起點(diǎn)的邏輯段中,但其物
理地址是唯一的。
邏輯地址轉(zhuǎn)換成物理地址:邏輯地址由處理器在輸出之前轉(zhuǎn)換為物理地址。將邏輯
地址中的段地址左移二進(jìn)制4位(對(duì)應(yīng)16進(jìn)制是一位,即乘以16),加上偏移
地址就得到20位物理地址。
①FFFFH:0=FFFF0H
②40H:17H=00417H
③2000H:4500H=24500H
④B821H:4567H=BC777H
〔習(xí)題2.9)
IA-32處理器有代碼段、數(shù)據(jù)段、堆棧段三類(lèi)基本段。
代碼段:存放程序的指令代碼。程序的指令代碼必須安排在代碼段,否則將無(wú)法正
常執(zhí)行。
數(shù)據(jù)段:存放當(dāng)前運(yùn)行程序所用的數(shù)據(jù)。程序中的數(shù)據(jù)默認(rèn)是存放在數(shù)據(jù)段,也可
以存放在其他邏輯段中。
堆棧段:主存中堆棧所在的區(qū)域。程序使用的堆棧一定在堆棧段。
〔習(xí)題2.10]
平展存儲(chǔ)模型下,對(duì)程序來(lái)說(shuō)存儲(chǔ)器是一個(gè)連續(xù)的地址空間,稱(chēng)為線性地址空間。
程序需要的代碼、數(shù)據(jù)和堆棧都包含在這個(gè)地址空間中。
段式存儲(chǔ)模型下,對(duì)程序來(lái)說(shuō)存儲(chǔ)器由一組獨(dú)立的地址空間組成,獨(dú)立的地址空
間稱(chēng)為段。通常,代碼、數(shù)據(jù)和堆棧位于分開(kāi)的段中。
實(shí)地址存儲(chǔ)模型是8086處理器的存儲(chǔ)模型。它是段式存儲(chǔ)模型的特例,其線性地
址空間最大為1MB容量,由最大為64KB的多個(gè)段組成。
〔習(xí)題2.11)
實(shí)地址方式:與8086具有相同的基本結(jié)構(gòu),只能尋址1MB物理存儲(chǔ)器空間,邏
輯段最大不超過(guò)64KB"旦可以使用32位寄存器、32位操作數(shù)和32位尋址方
式;相當(dāng)于可以進(jìn)行32位處理的快速8086。實(shí)地址工作方式只能支持實(shí)地址存
儲(chǔ)模型。
保護(hù)方式:具有強(qiáng)大的段頁(yè)式存儲(chǔ)管理和特權(quán)與保護(hù)能力,使用全部32條地址總
線,可尋址4GB物理存儲(chǔ)器。保護(hù)方式通過(guò)描述符實(shí)現(xiàn)分段存儲(chǔ)管理,每個(gè)邏輯
段可達(dá)4GB。處理器工作在保護(hù)方式時(shí),可以使用平展或段式存儲(chǔ)模型。
虛擬8086方式:在保護(hù)方式下運(yùn)行的類(lèi)似實(shí)方式的運(yùn)行環(huán)境,只能在1MB存儲(chǔ)
空間下使用"16位段"。處理器工作在虛擬8086方式時(shí),只能使用實(shí)地址存
儲(chǔ)模型。
〔習(xí)題2.12)
匯編語(yǔ)句有兩種:執(zhí)行性語(yǔ)句(處理器指令)、說(shuō)明性語(yǔ)句(偽指令)。
每個(gè)語(yǔ)句有:標(biāo)號(hào)、指令助記符、操作數(shù)或參數(shù)、注釋4個(gè)部分組成。
〔習(xí)題2.13)
匯編語(yǔ)言程序的開(kāi)發(fā)有4個(gè)步驟:
編輯:用文本編輯器形成一個(gè)以ASM為擴(kuò)展名的源程序文件。
匯編:用匯編程序?qū)SM文件轉(zhuǎn)換為OBJ模塊文件。
連接:用連接程序?qū)⒁粋€(gè)或多個(gè)目標(biāo)文件鏈接成一個(gè)EXE或COM可執(zhí)行文件。
調(diào)試:用調(diào)試程序排除錯(cuò)誤,生成正確的可執(zhí)行文件。
〔習(xí)題2.14〕
FFH,Again,next,h_ascii
〔習(xí)題2.15)
①32位存儲(chǔ)器尋址方式的組成公式
32位有效地址=基址寄存器+(變址寄存器x比例)+位移量
其中的4個(gè)組成部分是:
?基址寄存器任何8個(gè)32位通用寄存器之一;
?變址寄存器除ESP之外的任何32位通用寄存器之一;
?比例可以是1,2,4或8(因?yàn)椴僮鲾?shù)的長(zhǎng)度可以是1,2,4或8字
節(jié));
?位移量可以是8或32位有符號(hào)值。
②16位存儲(chǔ)器尋址方式的組成公式
16位有效地址=基址寄存器+變址寄存器+位移量
其中基址寄存器只能是BX或BP,變址寄存器只能是SI或DI,位移量是8或
16位有符號(hào)值。
〔習(xí)題2.16)
①立即數(shù)
②直接
③寄存器
④寄存器間接
⑤寄存器相對(duì)
⑥寄存器相對(duì)
⑦基址變址
⑧相對(duì)基址變址
⑨相對(duì)基址變址
⑩帶比例尋址
〔習(xí)題2.17]
使用本書(shū)配套的軟件包(或者按照本書(shū)說(shuō)明)創(chuàng)建MASM開(kāi)發(fā)環(huán)境,通過(guò)編輯例
題2-1和例題2-2程序、匯編連接生成可執(zhí)行程序和列表文件,掌握匯編語(yǔ)言的
開(kāi)發(fā)。
第3章數(shù)據(jù)處理
〔習(xí)題3.1〕簡(jiǎn)答題
①?zèng)]有。使用二進(jìn)制8位表達(dá)無(wú)符號(hào)整數(shù),257沒(méi)有對(duì)應(yīng)的編碼。
②字符"F"的ASCII碼就是數(shù)值46H,所以沒(méi)有區(qū)別。
③匯編程序在匯編過(guò)程中對(duì)數(shù)值表達(dá)式計(jì)算,得到一個(gè)確定的數(shù)值,故稱(chēng)數(shù)值表
達(dá)式為常量。
④不能。數(shù)值500大于一個(gè)字節(jié)所能表達(dá)的數(shù)據(jù)量,所以不能為字節(jié)變量賦值。
⑤源、目標(biāo)寄存器位數(shù)不同,不能用該指令進(jìn)行數(shù)據(jù)交換。
⑥前者在指令執(zhí)行時(shí)獲得偏移地址,是正確的;但后者的OFFSET只能在匯編
階段獲得偏移地址,但此時(shí)寄存器內(nèi)容是不可知的,所以無(wú)法獲得偏移地址。
⑦INC,DEC,NEG和NOT指令的操作數(shù)既是源操作數(shù)也是目的操作數(shù)。
⑧大小寫(xiě)字母轉(zhuǎn)換利用它們的ASCII碼相差20H。
⑨加減法不區(qū)別無(wú)符號(hào)數(shù)和有符號(hào)數(shù),但根據(jù)運(yùn)算結(jié)果分別設(shè)置標(biāo)志寄存器的
CF和OF標(biāo)志,可利用CF和OF進(jìn)行區(qū)別。
⑩邏輯與運(yùn)算規(guī)則類(lèi)似二進(jìn)制的乘法,所以稱(chēng)其為邏輯乘。
〔習(xí)題3.4)
①255
②0
③94
④239
〔習(xí)題3.5)
①12H
②24H
③68H
④99H
〔習(xí)題3.6)
①91
②89
③36
④90
〔習(xí)題3.7)
①00000000
②01111111
③10000001
④11000111
〔習(xí)題3.8)
①1234H+7802H=8A36H,無(wú)進(jìn)位
②F034H+5AB0H=4AF4H,有進(jìn)位
③C051H-1234H=BE1DH,無(wú)借位
④9876H-ABCDH=ECA9H,有借位
〔習(xí)題3.9〕
數(shù)碼0~9對(duì)應(yīng)的ASCII碼依次是30H~39H。
大寫(xiě)字母A~Z對(duì)應(yīng)的ASCII碼依次是:41H~5AH。
小寫(xiě)字母a~z對(duì)應(yīng)的ASCII碼依次是:61~7AH。
ASCII碼ODH和OAH分別對(duì)應(yīng)的是回車(chē)和換行字符。
〔習(xí)題3.10〕
mylbbyte'PersonalComputer'
my2bbyte20
my3bbyte14h
my4bbyte00010100b
my5wword20dup(?)
my6c=100
my7cequ<PersonalComputer>
〔習(xí)題3.11〕
numequ5
datalistbyte-10,2,5,4,?
〔習(xí)題3.12)
4142430A104546FF00040404FF00040404FF00040404
1000FBFF000000000000
〔習(xí)題3.13J
①EAX=0114H
②EAX=0006H
③EAX=0013H
④EAX=0003H
〔習(xí)題3.14〕
includeio32.inc
.data
tablebyte'|0123456789ABCDEF',13,10
byte'—+---------------------------------------',13,10
byte'20
|,,20h,20h,21h,20h,22h,20h,23h,20h,24h,20h,25h,20h,26h,20h,27h,20h,28h,2
0h,29h,20h
byte2ah,20h,2bh,20h,2ch,20h,2dh,20h,2eh,20h,2fh,20h,13,10
byte'30
|,,30h,20h,31h,20h,32h,20h,33h,20h,34h,20h,35h,20h,36h,20h,37h,20h,38h,2
0h,39h,20h
byte3ah,20h,3bh,20h,3ch,20h,3dh,20h,3eh,20h,3fh,20h,13,10
byte'40
|,,40h,20h,41h,20h,42h,20h,43h,20h,44h,20h,45h,20h,46h,20h,47h,20h,48h,2
0h,49h,20h
byte4ah,20h,4bh,20h,4ch,20h,4dh,20h,4eh,20h,4fh,20h,13,10
byte'50
|,,50h,20h,51h,20h,52h,20h,53h,20h,54h,20h,55h,20h,56h,20h,57h,20h,58h,2
0h,59h,20h
byte5ah,20h,5bh,20h,5ch,20h,5dh,20h,5eh,20h,5fh,20h,13,10
byte'60r,60h,20h,61h,20h,62h,20h,63h,20h,64h,20h,65h,20h,
66h,20h,67h,20h,68h,20h,69h,20h
byte6ah,20h,6bh,20h,6ch,20h,6dh,20h,6eh,20h,6fh,20h,13,10
byte70
r,70h,20h,71h,20h,72h,20h,73h,20h,74h,20h,75h,20h,76h,20h,77h,20h,78h,2
0h,79h,20h
byte7ah,20h,7bh,20h,7ch,20h,7dh,20h,7eh,20h,7fh,20h,13,10
byte0
.code
start:
moveax,offsettable
calldispmsg
exit0
endstart
〔習(xí)題3.15)
小端方式采用"低對(duì)低、高對(duì)高",即低字節(jié)數(shù)據(jù)存放在低地址存儲(chǔ)單元、高字節(jié)
數(shù)據(jù)存放在高地址存儲(chǔ)單元。以字節(jié)為單位按地址從低到高的順序,var變量的
內(nèi)容:78H、56H、34H、12H。
;EAX=12345678H
;BX=5678H
;CX=1234H
;DL=78H
;DH=12H
〔習(xí)題3.16)
pusheax;可以沒(méi)有
moveax,ebx
movebx,[edi]
mov[edi],eax
popeax;可以沒(méi)有
〔習(xí)題3.17〕
ESP=0012FFACH
ESP=0012FFAAH
ESP=0012FFA6H
ESP=0012FFAAH
ESP=0012FFACH
ESP=0012FFBOH
〔習(xí)題3.18]
;數(shù)據(jù)段
tablebyte18h,34h,05h,06h,09h,0ah,0ch,llh,12h,14h;定義格雷碼表
;代碼段
movebx,offsettable;EBX=格雷碼表首地址
moval,8;AL=8
xlat;AL=12H(8的格雷碼)
不使用XLAT指令:
movebx,offsettable;EBX=格雷碼表首地址
moveax,0
moval,8;AL=8
moval,[eax+ebx];AL=12H(8的格雷碼)
〔習(xí)題3.19]
①addedx,ebx
②addal,[ebx+esi]
③add[bx+0b2h],cx
④addvarw,3412h
(5)addeax,OaOh
〔習(xí)題3.20〕
(1)
;EAX=80H
;EAX=83H,CF=0,SF=0
;EAX=103H,CF=0,OF=0
;EAX=106H,CF=0,ZF=0
(2)
;EAX=100
;EAX=300,CF=0
(3)
;EAX=100
;EAX=44,CF=1(包含256的進(jìn)位含義:256+44=300)
(4)
moval,7fh;AL=7FH
subal,8;AL=77H,CF=0,SF=0
subal,80h;AL=F7H,CF=1,OF=1
sbbal,3;AL=F3H,CF=0,ZF=0
〔習(xí)題3.21〕
moval,89h;AL=89HCFZFSFOFPF
addal,al;AL=12H10011
addal,9dh;AL=OAFH00101
cmpal,0bch;AL=OAFH10101
subal,al;AL=OOH01001
decal;AL=OFFH00101
incal;AL=OOH01001
〔習(xí)題3.22)
;數(shù)據(jù)段
bufferlqword67883000h
buffer2qword67762000h
;代碼段
moveax,dwordptrbufferl
movedx,dwordptrbufferl+4
subeax,dwordptrbuffer2
sbbedx,dwordptrbuffer2+4
〔習(xí)題3.23〕
(1)
;ESI=9CH
;ESI=80H
;ESI=FFH
;ESI=01H
(2)
;EAX=1O1OB(可以有前導(dǎo)0,下同)
;EAX=OO1OB,CF=1
;EAX=0100B,CF=0
;EAX=0000B,CF=0
(3)
;EAX=1O11B(可以有前導(dǎo)0,下同)
;EAX=101100B,CF=0
;EAX=10110B,CF=0
;EAX=10111B,CF=0
(4)
;EAX=0,CF=0,OF=0
;ZF=1,SF=0,PF=1
〔習(xí)題3.24)
movax,1470h;AX=1470HCFOFSFZFPF
andax,ax;AX=1470H00000
orax,ax;AX=1470H00000
xorax,ax;AX=0000H00011
notax;AX=FFFFH00011
testax,OfOfOh;AX=OFOFOH00101
〔習(xí)題3.25〕
AND指令同"0"與實(shí)現(xiàn)復(fù)位,OR指令同"1"或?qū)崿F(xiàn)置位,XOR同"1"
異或?qū)崿F(xiàn)求反。
〔習(xí)題3.26)
;代碼段
movecx,3
again:shleax,l
rcledx,l
loopagain
〔習(xí)題3.28〕
;數(shù)據(jù)段
bedbyte92h
;代碼段
moval,bed
shral,4
addal,30h
calldispe
moval,bed
andal,Ofh
addal,30h
calldispc
〔習(xí)題3.29〕
MOVS指令的功能是:
ES:[EDI]-DS:[ESI];ESI-ESI±1/2/4,EDI-EDI±1/2/4
由此可看出串操作指令的尋址特點(diǎn):
源操作數(shù)用寄存器ESI間接尋址,默認(rèn)在DS指向的數(shù)據(jù)段,但可以改變;目的操
作數(shù)用寄存器EDI間接尋址,只能在ES指向的附加數(shù)據(jù)段;每執(zhí)行一次串操作,
源指針ESI和目的指針EDI將自動(dòng)修改:±1(字節(jié)),士2(字)或±4(雙
字)。指針的增量和減量控制由DF標(biāo)志確定,DF=0,進(jìn)行增量;DF=1,
進(jìn)行減量。
pusheax
moveax,[esi]
moves:[edi],eax
addesi,4
addedi,4
〔習(xí)題3.30)
顯示結(jié)果:welldone
EBX寄存器相對(duì)尋址:
moval,msg[ebx]
movmsg[ebx],al
〔習(xí)題3.31)
movarray2[ebx*4],eax
addebx,1
〔習(xí)題3.32)
上機(jī)實(shí)現(xiàn)本章的例題程序,編程實(shí)現(xiàn)本章的習(xí)題程序。
第4章匯編語(yǔ)言程序設(shè)計(jì)
①當(dāng)同一個(gè)程序被操作系統(tǒng)安排到不同的存儲(chǔ)區(qū)域執(zhí)行時(shí),指令間的位移沒(méi)有改
變,目標(biāo)地址采用相對(duì)尋址可方便操作系統(tǒng)的靈活調(diào)度。
②數(shù)據(jù)通信時(shí),數(shù)據(jù)的某一位用做傳輸數(shù)據(jù)的奇偶校驗(yàn)位,數(shù)據(jù)中包括校驗(yàn)位在
內(nèi)的"1"的個(gè)數(shù)恒為奇數(shù),就是奇校驗(yàn);恒為偶數(shù),就是偶校驗(yàn)。
③無(wú)符號(hào)數(shù)和有符號(hào)數(shù)的操作影響兩組不同的標(biāo)志狀態(tài)位,故判斷兩個(gè)無(wú)符號(hào)數(shù)
和有符號(hào)數(shù)的大小關(guān)系要利用不同的標(biāo)志位組合,所以有對(duì)應(yīng)的兩組指令。
④雙分支結(jié)構(gòu)中兩個(gè)分支體之間的JMP指令,用于實(shí)現(xiàn)結(jié)束前一個(gè)分支回到共
同的出口作用。
⑤完整的子程序注釋可方便程序員調(diào)用該子程序,子程序注釋包括子程序名、子
程序功能、入口參數(shù)和出口參數(shù)、調(diào)用注意事項(xiàng)和其他說(shuō)明等。
⑥子程序保持堆棧平衡,才能保證執(zhí)行RET指令時(shí)當(dāng)前棧頂?shù)膬?nèi)容是正確的返
回地址。主程序也要保持堆棧平衡,這樣才能釋放傳遞參數(shù)占用的堆棧空間,否則
多次調(diào)用該子程序可能就致使堆棧溢出。
⑦"傳值”是傳遞參數(shù)的一個(gè)拷貝,被調(diào)用程序改變這個(gè)參數(shù)不影響調(diào)用程序;
"傳址"時(shí),被調(diào)用程序可能修改通過(guò)地址引用的變量?jī)?nèi)容。
⑧INCLUDE語(yǔ)句包含的是文本文件、是源程序文件的一部分;INCLUDELIB語(yǔ)
句包含的是子程序庫(kù)文件。
⑨取長(zhǎng)補(bǔ)短。
⑩Windows程序在運(yùn)行時(shí)需要加載其配套的動(dòng)態(tài)鏈接庫(kù)DLL文件,當(dāng)其沒(méi)有被
搜索到時(shí)就會(huì)提示不存在。
〔習(xí)題4.4〕
jmplabll;相對(duì)尋址
nop
moveax,'?'
calldispc
labll:moveax,'l'
calldispc
jmpnearptrIabl2;相對(duì)近轉(zhuǎn)移
nop
moveax,'?'
calldispc
Iabl2:moveax,'2'
calldispc
moveax,offsetIabl3
jmpeax;寄存器間接尋址
nop
moveax,'?'
calldispc
Iabl3:moveax,'3'
calldispc
moveax,offsetIabl4
movnvar,eax
jmpnvar;存儲(chǔ)器間接尋址
nop
moveax,'?'
calldispc
Iabl4:moveax,'4'
calldispc
〔習(xí)題4.5〕
moveax,56h;假設(shè)一個(gè)數(shù)據(jù)
shreax,2;DI位移入CF標(biāo)志
jncnom;DI=0條件成立,轉(zhuǎn)移
...;余同原程序
〔習(xí)題4.6)
CF=1ZF=OSF=1OF=0PF=1
可以使得條件成立、發(fā)生轉(zhuǎn)移的指令有:JCJSJPJNZJNO
〔習(xí)題4.7〕
includeio32.inc
.data
msglbyte'Pleaseinputacharacter:',0
msg2byte'TheASCIIcodeofthecharateryouenteredis:',0
msg3byte'Thecodewithevenparityis:',0
.code
start:
moveax,offsetmsgl
calldispmsg
callreadc
calldispcrlf
movebx,eax
moveax,offsetmsg2
calldispmsg
moveax,ebx
calldispbb
calldispcrlf
andal,7fh
jpnext
oral,80h
next:movebx,eax
moveax,offsetmsg3
calldispmsg
moveax,ebx
calldispbb
exit0
endstart
〔習(xí)題4.8〕
;數(shù)據(jù)段
Rdatabyte57h"呆存接收的數(shù)據(jù)
errorbyte'Error!',0
;代碼段
moval,Rdata
andal,Offh;標(biāo)志PF反映"1"的個(gè)數(shù)
jpdone;個(gè)數(shù)為偶數(shù),正確繼續(xù)
moveax,offseterror;個(gè)數(shù)為奇數(shù),顯示出錯(cuò)
calldispmsg
done:
〔習(xí)題4.9〕
testeax,8000h;測(cè)試最高位
jznextl;最高位為0(ZF=1),轉(zhuǎn)移到標(biāo)號(hào)NEXT1
movedx,Offffffffh;最高位為1,順序執(zhí)行:設(shè)置EDX=FFFFFFFFH
jmpdone;無(wú)條件轉(zhuǎn)移,跳過(guò)另一個(gè)分支
nextl:movdx,0;最高位為0轉(zhuǎn)移到此執(zhí)行:設(shè)置EDX=0
done:
〔解答2〕
使用移位指令更好。
roleax,l
rcredx,l
saredx,31
roreax,l
〔習(xí)題4.10〕
;數(shù)據(jù)段
dvardword57h
;代碼段
moveax,dvar
testeax,80000000h
jnznextl
testeax,l
jnznextr
moval,'M'
jmpdone
nextl:moval,'L'
jmpdone
nextr:moval,'R'
done:calldispc
〔習(xí)題4.11]
;數(shù)據(jù)段
inmsgbyte'Inputnumber(0-9):',0
ermsgbyteOdh,Oah,'Error!Inputagain:',0
;代碼段
moveax,offsetinmsg;提示輸入數(shù)字
calldispmsg
again:callreadc;等待按鍵
cmpal,'O';數(shù)字<0?
jberdisp
cmpal,9;數(shù)字>9?
jaerdisp
calldispcrlf
calldispc
jmpdone
erdisp:moveax,offsetermsg
calldispmsg
jmpagain
done:
〔習(xí)題4.12)
求這20個(gè)雙字的和,保存在TOTAL變量,不關(guān)進(jìn)心進(jìn)位和溢出。
〔習(xí)題4.13〕
;數(shù)據(jù)段
stringbyte'DoyouhavefunwithAssembly?',0;以0結(jié)尾的字符串
spacedword?
;代碼段
movesi,offsetstring
xorebx,ebx;EBX用于記錄空格數(shù)
again:moval,[esi]
cmpal,0
jzdone
cmpal,20h;空格的ASCII碼是20H
jnenext;不相等、不是空格,轉(zhuǎn)移
incbx;相等、是空格,空格個(gè)數(shù)加1
next:incesi
jmpagain;繼續(xù)循環(huán)
done:movspace,ebx;保存結(jié)果
〔習(xí)題4.14)
;數(shù)據(jù)段
arrayword2005,2008,98dup(1394);假設(shè)100個(gè)16降整數(shù)
wordsumword?
errorbyte'Overflow!,,0
;代碼段
andebx,0
movecx,100
xorax,ax
again:addax,array[ebx*2]
jcover
incebx
loopagain
movwordsum,ax
over:moveax,offseterror
calldispmsg
〔習(xí)題4.15〕
;數(shù)據(jù)段
stringbyte'Ifyoufindanyerrorintheprogram,youcanDEBUGit."
count=sizeofstring
bugbyte'BUG'
;代碼段
movecx,count
movedi,offsetstring
LI:movesi,offsetbug
pushedi
movedx,sizeofbug
LN:moval,[esi]
cmp[edi],al
jneL2
incesi
incedi
decedx
jneLN
popedi
moval,'Y'
jmpL3
L2:popedi
incedi
loopLI
moval,'N'
L3:calldispc
〔習(xí)題4.16)
;數(shù)據(jù)段
beddword00371002h
;代碼段
movesi,bcd
empesi,0
jnzgoon
moval,'O'
calldispc
jmpdone
goon:movecx,8
xorebx,ebx;EBX=0,表示可能是前導(dǎo)0
again:rolesi,4
moveax,esi
andeax,Ofh;EAX低4位保存當(dāng)前要顯示的BCD碼
cmpebx,0;EBXH0,說(shuō)明不是前導(dǎo)0,要顯示
jnzdisp;EBX=0,說(shuō)明可能是前導(dǎo)0
cmpeax,0
jznext;EAX=0,說(shuō)明是前導(dǎo)0,不顯示
movebx,l;EAX/0,沒(méi)有前導(dǎo)0了,令EBX=1/0
disp:addal,30h
calldispc
next:loopagain
done:
〔習(xí)題4.17)
;數(shù)據(jù)段
stringbyte'Letushaveatry!',0dh,0ah,0
;代碼段
movecx,sizeofstring
cmpecx,2
jbdone
leaeax,string;顯示處理前的字符串
calldispmsg
movesi,ecx
decesi
outlp:cmpstring[esi],'';檢測(cè)是否是空格
jnznext;不是空格繼續(xù)循環(huán)
movedi,esi;是空格,進(jìn)入剔除空格分支
dececx
inlp:incedi
moval,string[edi];前移一個(gè)位置
movstring[edi-l],al
cmpedi,ecx
jbinlp
next:decesi;繼續(xù)進(jìn)行
cmpesi,0
jnzoutlp;為0結(jié)束
leaeax,string;顯示處理后的字符串
calldispmsg
done:
〔習(xí)題4.18)
includeio32.inc
.data
tablebyte'|0123456789ABCDEF',13,10
byte'—+---------------------------------------',13,10
tabibyte6dup(36dup(?),13,10)
byte0
.code
start:
movebx,offsettabi
movedx,'|02'
movax,2020h
movesi,6
againO:mov[ebx],edx
addebx,4
movecx,16
againl:movwordptr[ebx],ax
addebx,2
incal
loopagainl
addebx,2
addedx,l
decesi
jnzagainO
moveax,offsettable
calldispmsg
exit0
endstart
〔習(xí)題4.19〕
asctobproc
shldh,4
moval,dh
anddl,Ofh
oral,dl
ret
asctobendp
〔習(xí)題4.20)
disp99proc
xorah,ah
aam
addax,3030h
pushax
moval,ah
calldispc
popax
calldispc
ret
disp99endp
〔習(xí)題4.22J
;代碼段,主程序
again:callreadc
cmpal,lbh
jzdone
movbl,al
moval,':'
calldispc
moval,bl
rolal,4
callhtoasc;調(diào)用子程序
calldispc;顯示一個(gè)字符
moval,bl
callhtoasc;調(diào)用子程序
calldispc;顯示一個(gè)字符
calldispcrlf
jmpagain
done:
〔習(xí)題4.22)
;代碼段,主程序
moveax,8F98FF00H
calldispbd;調(diào)用子程序
;代碼段,子程序
dispbdproc;32位二進(jìn)制數(shù)的輸出
pushecx
pushedx
movecx,32;要輸出的字符個(gè)數(shù)
dbd:roleax,l;AL循環(huán)左移一位
pusheax
andal,01h;取AL最低位
addal,30h;轉(zhuǎn)化成相應(yīng)的ASCLL碼值
calldispc;以二進(jìn)制的形式顯示
popeax
loopdbd
popedx
popecx
ret
dispbdendp
〔習(xí)題4.23)
;數(shù)據(jù)段
arrayword12345,-1234,32767,-32768,0,667
writebufbyte6dup(0)
;代碼段,主程序
movecxjengthofarray
movebx,0
again:
movax,array[ebx*2]
callwrite
calldispcrlf
incebx;此時(shí)ebx代表array中的第幾個(gè)數(shù)
dececx;此時(shí)ecx代表循環(huán)的次數(shù)
jnzagain
;代碼段,子程序
writeproc;子程序開(kāi)始
pushebx
pushecx
pushedx
movebx,offsetwritebuf;ebx指向顯示緩沖區(qū)
testax,ax
jnzwritel
movbyteptr[ebx],30h
incebx
jmpwrite5
writel:;若不為0則首先判斷是正是負(fù)
jnswrite2;若為正則跳過(guò)下面兩步到write2
movbyteptr[ebx],'-'
incebx
negax
write2:
movex,10
pushex;將cx=10壓入棧,作為退出標(biāo)志
write3:;write3是讓eax循環(huán)除以10并把余數(shù)的ASCII碼壓入棧
empax,0
jzwrite4
xordx,dx
divex
adddx,30h
pushdx
jmpwrite3
write4:;余數(shù)的ASCII碼出棧,遇到10終止并轉(zhuǎn)到write5顯示結(jié)果
popdx
empdx,cx
jzwrite5
movbyteptr[ebx],dl
incebx
jmpwrite4
write5:;顯示結(jié)果
movbyteptr[ebx],0
moveax,offsetwritebuf
calldispmsg
popedx
popecx
popebx
ret
writeendp
〔習(xí)題4.24)
;數(shù)據(jù)段
count=10
arraydwordcountdup(0)
tempdword?
readbufbyte30dup(0)
errmsgbyte'Inputerror,enteragain!',13,10,0
msglbyte'Inputtenunsignednumbers,eachnumberendswithenter
key:',13,10,0
msg2byte'Checkthenumbersyourinputted:',13,10,0
;代碼段,主程序
moveax,offsetmsgl
calldispmsg
movecx,count
movebx,offsetarray
again:
callread
moveax,temp
mov[ebx],eax
addebx,4
dececx
jnzagain
moveax,offsetmsg2
calldispmsg
movedx,offsetarray
movecx,count
next:
moveax,[edx]
calldispuid
calldispcrlf
addedx,4
dececx
jnznext
;代碼段,子程序
readproc
pusheax
pushecx
pushebx
pushedx
readO:
moveax,offsetreadbuf
callreadmsg
testeax,eax
jzreaderr
cmpeax,12
jareaderr
movedx,offsetreadbuf
xorebx,ebx
xorecx,ecx
moval,[edx]
cmpal,'+'
jzreadl
cmpal,'-'
jnzread2
jmpreaderr
readl:
incedx
moval,[edx]
testal,al
jzread3;如果為0,則說(shuō)明該字符串已結(jié)束
read2:
cmpal,'O'
jbreaderr
cmpal,'9'
jareaderr
subal,30h
imulebx,10;ebx用來(lái)存儲(chǔ)處理過(guò)的數(shù)據(jù)
jcreaderr
movzxeax,al
addebx,eax
jncreadl
readerr:
moveax,offseterrmsg
calldispmsg
jmpreadO
read3:
movtemp,ebx
popedx
popebx
popecx
popeax
ret
readendp
〔習(xí)題4.25)
;計(jì)算字節(jié)校驗(yàn)和的通用過(guò)程
;入口參數(shù):DS:EBX=數(shù)組的段地址:偏移地址,ECX=元素個(gè)數(shù)
;出口參數(shù):AL=校驗(yàn)和
;說(shuō)明:除EAX/EBX/ECX外,不影響其他寄存器
checksumproc
xoral,al;累加器清0
sum:addal,[ebx];求和
incebx;指向下一個(gè)字節(jié)
loopsum
ret
checksumendp
〔習(xí)題4.26]
(1)
;數(shù)據(jù)段
wvarword307281AFH
;代碼段,主程序
moveax,wvar
calldisp
moval,'H'
calldispc
;代碼段,子程序
dispproc
pushebx
pushecx
movecx,8;8位
dhwl:roleax,4
movebx,eax
andal,Ofh;轉(zhuǎn)換為ASCII碼
addal,30h
cmpal,'9'
jbedhw2
addal,7
dhw2:calldispc
moveax,ebx
loopdhwl
popecx
popebx
ret
dispendp
(2)
;數(shù)據(jù)段
wvarword307281AFH
tempword?
;代碼段,主程序
moveax,wvar
movtemp,eax
calldisp
moval,'H"
calldispc
;代碼段,子程序
dispproc
pushebx
pushecx
movecx,8;8位
moveax,temp
dhwl:roleax,4
movebx,eax
andal,Ofh;轉(zhuǎn)換為ASCII碼
addal,3Oh
cmpal,'9'
jbedhw2
addal,7
dhw2:calldispc;顯示一個(gè)字符
moveax,ebx
loopdhwl
popecx
popebx
ret
dispendp
(3)
;數(shù)據(jù)段
wvarword307281AFH
;代碼段,主程序
pushwvar
calldisp
addesp,4
moval,'H'
calldispc
;代碼段,子程序
dispproc
pushebp
movebp,esp
pushebx
pushecx
movecx,8;8位
moveax,[ebp+8]
dhwl:roleax,4
movebx,eax
andal,Ofh;轉(zhuǎn)換為ASCII碼
addal,3Oh
cmpal,'9'
jbedhw2
addal,7
dhw2:calldispc
moveax,ebx
loopdhwl
popecx
popebx
popebp
ret
dispendp
〔習(xí)題4.27)
;ex0427.asm
includeio32.inc
.data
keybyte?
msgObyte'Enteryourpassword:',0
passwbyte50dup(O)
errormsgbyte'Passworderror,inputagain!',13,10,0
bufnum=255
bufferbytebufnum+1dup(O);定義鍵盤(pán)輸入需要的緩沖區(qū)
msglbyte'Entermessge:',0
msg2byte'Encryptedmessage:',0
msg3byte'Originalmessge:',0
.code
start:
moveax,offsetmsgO;提示輸入加密密碼
calldispmsg
moveax,offsetpassw;設(shè)置入口參數(shù)EAX
callreadmsg;調(diào)用輸入字符串子程序輸入密碼
movecx,eax
dececx
xorebx,ebx
moval,passw[ebx]
againO:incebx
xoral,passw[ebx];使用簡(jiǎn)單的異或方法得到加密關(guān)鍵字
loopagainO
movkey,aI;保存加密關(guān)鍵字
moveax,offsetmsgl;提示輸入字符串
calldispmsg
moveax,offsetbuffer;設(shè)置入口參數(shù)EAX
callreadmsg;調(diào)用輸入字符串子程序
pusheax;字符個(gè)數(shù)保存進(jìn)入堆棧
movecx,eax;ECX=實(shí)際輸入的字符個(gè)數(shù),作為循環(huán)的次數(shù)
xorebx,ebx;EBX指向輸入字符
encrypt:moval,key;AL=加密關(guān)鍵字
xorbuffer[ebx],al;異或加密
incebx
dececx;等同于指令:loopencrypt
jnzencrypt;處理下一個(gè)字符
moveax,offsetmsg2
calldispmsg
moveax,offsetbuffer;顯示加密后的密文
calldispmsg
calldispcrlf
again:moveax,offsetmsgO;提示輸入解密密碼
calldispmsg
moveax,offsetpassw;設(shè)置入口參數(shù)EAX
callreadmsg;調(diào)用輸入字符串子程序輸入密碼
movecx,eax
dececx
xorebx,ebx
moval,passw[ebx]
againl:incebx
xoral,passw[ebx];使用簡(jiǎn)單的異或方法得到加密關(guān)鍵字
loopagainl
cmpkey,al;與原加密關(guān)鍵字比較
jznext;密碼相同,則進(jìn)行解密
moveax,offseterrormsg;提示輸入解密密碼錯(cuò)誤
calldispmsg
jmpagain
next:popecx;從堆棧彈出字符個(gè)數(shù),作為循環(huán)的次數(shù)
xorebx,ebx;EBX指向輸入字符
decrypt:moval,key;AL=解密關(guān)鍵字
xorbuffer[ebx],al;異或解密
incebx
dececx
jnzdecrypt;處理下一個(gè)字符
moveax,offsetmsg3
calldispmsg
moveax,offsetbuffer;顯示解密后的明文
calldispmsg
〔習(xí)題4.28〕
;ex0428.asm
includeio32.inc
.data
msglbyte'Entertheintegers:',13,10,0
msg2byte13,10,'Enterspacetocontinue!Enteranyotherkeyto
exit!,,13,10,0
.code
start:
moveax,offsetmsgl
calldispmsg
callreadsid
movebx,eax
moval,'+'
calldispc
calldispcrlf
callreadsid
addebx,eax
moval,'='
calldispc
moveax,ebx
calldispsid
calldispcrlf
moveax,offsetmsg2
calldispmsg
callreadc
cmpal,20h
jestart
exit0
endstart
〔習(xí)題4.29)
;ex0429.asminWindowsConsole
includeio32.inc
.data
varbyte'Thisisatest!'
.code
start:;主程序
moveax,offsetvar
movecx,sizeofvar
calldispmem
exit0
;子程序
dispmemproc
pushebx
movebx,eax
dispml:moval,[ebx]
calldisphb
moval,''
calldispc
incebx
loopdispml
popebx
ret
dispmemendp
endstart
〔習(xí)題4.30)
將例題4-19分別使用子程序模塊、子程序庫(kù)和子程序庫(kù)包含方法生成最終可執(zhí)行
文件。
〔習(xí)題4.31]
宏定義:就是對(duì)宏進(jìn)行說(shuō)明,由一對(duì)宏匯編偽指令MACRO和ENDM來(lái)完成。
宏調(diào)用:宏定義之后的使用。在使用宏指令的位置寫(xiě)下宏名,后跟實(shí)體參數(shù)。
宏指令:使用宏時(shí),其形式很像指令,所以稱(chēng)為宏指令。
宏展開(kāi):在匯編時(shí),匯編程序用對(duì)應(yīng)的代碼序列替代宏指令。
宏匯編:指使用宏的方法進(jìn)行匯編語(yǔ)言程序設(shè)計(jì)。
〔習(xí)題4.32]
直接使用控制臺(tái)輸入和輸出函數(shù)實(shí)現(xiàn)例題4-21的功能(不使用READMSG和
DISPMSG子程序)。
〔解答〕
〔習(xí)題4.33〕
直接使用控制臺(tái)輸出函數(shù)實(shí)現(xiàn)某個(gè)主存區(qū)域內(nèi)容的顯示(習(xí)題4.29的功能)。可
以改進(jìn)顯示形式,例如每行顯示16個(gè)字節(jié)(128位),每行開(kāi)始先顯示首個(gè)主
存單元的偏移地址,然后用冒號(hào)分隔主存內(nèi)容。
〔解答〕
〔習(xí)題4.34)
將MB_OK常量定義為1,即:
MB_OKequ1
〔習(xí)題4.35〕
上機(jī)實(shí)踐例題4-23和例題4-24,并在創(chuàng)建可執(zhí)行文件的過(guò)程中生成匯編語(yǔ)言列
表文件。
〔習(xí)題4.36〕
處理器含有一個(gè)位的時(shí)間標(biāo)記計(jì)數(shù)器()
Pentium64Time-StampCountero
該計(jì)數(shù)器每個(gè)時(shí)鐘周期遞增(加1);在上電和復(fù)位后,該計(jì)數(shù)器清0。指令
"RDTSC”執(zhí)行后將在EDX(高32位)和EAX(低32位)返回當(dāng)前的64
位時(shí)間標(biāo)記計(jì)數(shù)器值。利
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025云南省建筑安全員知識(shí)題庫(kù)
- 鄭州工業(yè)安全職業(yè)學(xué)院《大數(shù)據(jù)快速運(yùn)算》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧裝備制造職業(yè)技術(shù)學(xué)院《醫(yī)學(xué)微生物學(xué)實(shí)驗(yàn)轉(zhuǎn)專(zhuān)業(yè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東管理學(xué)院《診斷胸肺檢查》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州城建職業(yè)學(xué)院《電子商務(wù)技術(shù)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 太原科技大學(xué)《城市規(guī)劃與管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 玉溪職業(yè)技術(shù)學(xué)院《軋制工藝學(xué)管材生產(chǎn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 商丘職業(yè)技術(shù)學(xué)院《表面活性劑化學(xué)與應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 五年級(jí)教師2025年第一季度工作計(jì)劃
- 做賬實(shí)操-商貿(mào)企業(yè)成本核算方法
- 寒假日常生活勞動(dòng)清單及評(píng)價(jià)表
- 專(zhuān)題06 現(xiàn)代文閱讀(原卷版)2015-2024單招考試語(yǔ)文(四川真題)
- 校園超市招商政策
- 《數(shù)據(jù)采集技術(shù)》課件-網(wǎng)絡(luò)爬蟲(chóng)
- 網(wǎng)絡(luò)地址轉(zhuǎn)換NAT
- 【MOOC】營(yíng)養(yǎng)學(xué)-武漢大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 工資薪金管理制度模版(3篇)
- 廣東省茂名市高州市五校聯(lián)考2024-2025學(xué)年高一上學(xué)期12月月考化學(xué)試題(含答案)
- 高等數(shù)學(xué)(二)(山東聯(lián)盟)知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋青島科技大學(xué)
- 《高級(jí)算法設(shè)計(jì)》課件 第2章 高級(jí)圖算法
- 小兒泌尿系統(tǒng)感染的護(hù)理
評(píng)論
0/150
提交評(píng)論