久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

微機原理與接口技術習題解答(錢曉婕)

時間:2019-05-14 14:17:28下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《微機原理與接口技術習題解答(錢曉婕)》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《微機原理與接口技術習題解答(錢曉婕)》。

第一篇:微機原理與接口技術習題解答(錢曉婕)

“微機原理與接口技術”習題解答 第1章 微型計算機系統 〔習題1.1〕簡答題 〔解答〕

① 處理器每個單位時間可以處理的二進制數據位數稱計算機字長。② 總線信號分成三組,分別是數據總線、地址總線和控制總線。③ PC機主存采用DRAM組成。

④ 高速緩沖存儲器Cache是處理器與主存之間速度很快但容量較小的存儲器。⑤ ROM-BIOS是“基本輸入輸出系統”,操作系統通過對BIOS的調用驅動各硬件設備,用戶也可以在應用程序中調用BIOS中的許多功能。⑥ 中斷是CPU正常執行程序的流程被某種原因打斷、并暫時停止,轉向執行事先安排好的一段處理程序,待該處理程序結束后仍返回被中斷的指令繼續執行的過程。⑦ 主板芯片組是主板的核心部件,它提供主板上的關鍵邏輯電路。⑧ MASM是微軟開發的宏匯編程序。

⑨ 指令的處理過程。處理器的“取指―譯碼―執行周期” 是指處理器從主存儲器讀取指令(簡稱取指),翻譯指令代碼的功能(簡稱譯碼),然后執行指令所規定的操作(簡稱執行)的過程。

⑩ 機器語言層,即指令集結構。

(學生很多認為是:匯編語言層。前4章主要涉及匯編語言,但本書還有很多處理器原理等內容)

〔習題1.2〕判斷題

① 錯 ② 錯 ③ 對 ④ 錯 ⑤ 對

⑥ 錯 ⑦ 錯 ⑧ 對 ⑨ 錯 ⑩ 錯 〔

〔解答〕

① Central Processing Unit,中央處理單元,處理器 ② 1MB,4GB ③ 216,64KB ④ EXE,COM(BAT老師講的)⑤ Instruction Set Architecture ⑥ 目錄

⑦ MMX,SSE3 ⑧ 64 ⑨ IBM,DOS ⑩ PCI 〔習題1.4〕

說明微型計算機系統的硬件組成及各部分作用。〔解答〕

CPU:CPU也稱處理器,是微機的核心。它采用大規模集成電路芯片,芯片內集成了控制器、運算器和若干高速存儲單元(即寄存器)。處理器及其支持電路構成了微機系統的控制中心,對系統的各個部件進行統一的協調和控制。存儲器:存儲器是存放程序和數據的部件。

外部設備:外部設備是指可與微機進行交互的輸入(Input)設備和輸出(Output)設備,也稱I/O設備。I/O設備通過I/O接口與主機連接。總線:互連各個部件的共用通道,主要含數據總線、地址總線和控制總線信號。〔習題1.5〕

什么是通用微處理器、單片機(微控制器)、DSP芯片、嵌入式系統? 〔解答〕

通用微處理器:適合較廣的應用領域的微處理器,例如裝在PC機、筆記本電腦、工作站、服務器上的微處理器。

單片機:是指通常用于控制領域的微處理器芯片,其內部除CPU外還集成了計算機的其他一些主要部件,只需配上少量的外部電路和設備,就可以構成具體的應用系統。

DSP芯片:稱數字信號處理器,也是一種微控制器,其更適合處理高速的數字信號,內部集成有高速乘法器,能夠進行快速乘法和加法運算。

嵌入式系統:利用微控制器、數字信號處理器或通用微處理器,結合具體應用構成的控制系統。

〔習題1.6〕

綜述Intel 80x86系列處理器在指令集方面的發展。〔解答〕

8086奠定了基本的16位指令集,80286提供了保護方式的各種指令,80386將指令集全面提升為32位,80486融入了浮點數據處理指令,奔騰系列陸續增加了多媒體指令MMX、SSE、SSE2和SSE3,最新的奔騰4處理器還支持64位指令集。

題外話:大家可以通過閱讀相關資料、查詢互聯網獲得更加詳細的發展情況。可以考慮組織成一篇或多篇論文。〔習題1.7〕

區別如下概念:助記符、匯編語言、匯編語言程序和匯編程序。〔解答〕

助記符:人們采用便于記憶、并能描述指令功能的符號來表示機器指令操作碼,該符號稱為指令助記符。

匯編語言:用助記符表示的指令以及使用它們編寫程序的規則就形成匯編語言。匯編語言程序:用匯編語言書寫的程序就是匯編語言程序,或稱匯編語言源程序。匯編程序:匯編語言源程序要翻譯成機器語言程序才可以由處理器執行。這個翻譯的過程稱為“匯編”,完成匯編工作的程序就是匯編程序(Assembler)。〔習題1.8〕

區別如下概念:路徑、絕對路徑、相對路徑、當前目錄。系統磁盤上存在某個可執行文件,但在DOS環境輸入其文件名卻提示沒有這個文件,是什么原因? 〔解答〕

路徑:操作系統以目錄形式管理磁盤上的文件,文件所在的分區和目錄就是該文件的路徑。絕對路徑:從根目錄到文件所在目錄的完整路徑稱為“絕對路徑”。是保證文件唯一性的標示方法。

相對路徑:從系統當前目錄到文件所在目錄的路徑稱為相對路徑。當前目錄:用戶當前所在的目錄就是當前目錄。

指明的路徑不正確,或者執行了另外一個同名的文件。〔習題1.9〕

什么是摩爾定律?它能永久成立嗎? 〔解答〕

每18個月,集成電路的性能將提高一倍,而其價格將降低一半。(1965年,Intel公司的創始人之一摩爾預言:集成電路上的晶體管密度每年將翻倍。現在這個預言通常表達為:每隔18個月硅片密度(晶體管容量)將翻倍;也常被表達為:每18個月,集成電路的性能將提高一倍,而其價格將降低一半。)

不能。由于電子器件的物理極限在悄然逼近,摩爾定律不會永遠持續。〔習題1.10〕

馮?諾依曼計算機的基本設計思想是什么? 〔解答〕

采用二進制形式表示數據和指令。指令由操作碼和地址碼組成。將程序和數據存放在存儲器中,計算機在工作時從存儲器取出指令加以執行,自動完成計算任務。這就是“存儲程序”和“程序控制”(簡稱存儲程序控制)的概念。指令的執行是順序的,即一般按照指令在存儲器中存放的順序執行,程序分支由轉移指令實現。

計算機由存儲器、運算器、控制器、輸入設備和輸出設備五大基本部件組成,并規定了5部分的基本功能。〔習題1.11〕

計算機系統通常劃分為哪幾個層次?普通計算機用戶和軟件開發人員對計算機系統的認識一樣嗎?

〔解答〕

最上層是用戶層。第5層是高級語言層。第4層是匯編語言層。第3層是操作系統層。第2層是機器語言層。第1層是控制層。第0層是數字電路層。

普通計算機用戶和軟件人員對計算機系統的認識并不一樣。普通計算機用戶看到的計算機,也就是我們最熟悉的計算機,屬于用戶層,而軟件人員看到的屬于高級語言層或是匯編語言層。

〔習題1.12〕

什么是系列機和兼容機?你怎樣理解計算機中的“兼容”特性?例如,你可以用PC機為例,談談你對軟件兼容(或兼容性)的認識,說明為什么PC機具有如此強大的生命力? 〔解答〕

系列機是指在一個廠家生產的具有相同計算機結構,但具有不同組成和實現的一系列(Family)不同檔次、不同型號的機器。

兼容機是指不同廠家生產的具有相同計算機結構(不同的組成和實現)的計算機。

兼容是一個廣泛的概念,包括軟件兼容、硬件兼容、系統兼容等。其中軟件兼容是指同一個軟件可以不加修改地運行于體系結構相同的各檔機器,結果一樣但運行時間可能不同。軟件兼容可從機器性能和推出時間分成向上(向下)和向前(向后)兼容。例如32位PC機就陸續增加了對浮點處理指令、多媒體指令等的支持。在保證向后兼容的前提下,不斷改進其組成和實現,延續計算機結構的生命,才使得PC機具有如此強大的生命力。〔習題1.13〕

英特爾公司最新Intel 80x86處理器是什么?請通過查閱相關資料(如英特爾公司網站),說明其主要特點和采用的新技術。〔解答〕

酷睿2多核處理器。〔習題1.14〕

說明高級語言、匯編語言、機器語言三者的區別,談談你對匯編語言的認識。〔解答〕

高級語言與具體的計算機硬件無關,其表達方式接近于所描述的問題,易為人們接受和掌握,用高級語言編寫程序要比低級語言容易得多,并大大簡化了程序的編制和調試,使編程效率得到大幅度的提高。而匯編語言是為了便于理解與記憶,將機器指令用助記符代替而形成的一種語言。匯編語言的語句通常與機器指令對應,因此,匯編語言與具體的計算機有關,屬于低級語言。它比機器語言直觀,容易理解和記憶,用匯編語言編寫的程序也比機器語言易閱讀、易排錯。機器語言的每一條機器指令都是二進制形式的指令代碼,計算機硬件可以直接識別。高級語言程序通常也需要翻譯成匯編語言程序,再進一步翻譯成機器語言代碼。〔習題1.15〕

為了更好地進行編程實踐,請進入Windows操作系統下的控制臺環境(或MS-DOS模擬環境),練習常用命令。第2章 處理器結構 〔習題2.1〕簡答題 〔解答〕

① ALU是算術邏輯運算單元,負責處理器所能進行的各種運算,主要是算術運算和邏輯運算。

② 取指是指從主存取出指令代碼通過總線傳輸到處理器內部指令寄存器的過程。8086分成總線接口單元和指令執行單元,可以獨立操作。在執行單元執行一條指令的同時,總線接口單元可以讀取下一條指令,等到執行時不需要進行取指了,所以稱為預取。

③ Pentium采用分離的Cache結構,一個用做指令Cache,一個用做數據Cache。④ 堆棧的存取原則是先進后出(也稱為后進先出)操作方式存取數據。⑤ 標志寄存器主要保存反映指令執行結果和控制指令執行形式的有關狀態。⑥ 執行了一條加法指令后,發現ZF=1,表明運算結果為0。⑦ 沒有。

⑧ 匯編語言的標識符大小寫不敏感,即表示字母大小寫不同、但表示同一個符號。⑨ 不會。

⑩ 指令的操作數需要通過存儲器地址或I/O地址,才能查找到數據本身,故稱數據尋址方式。

〔習題2.2〕判斷題

〔解答〕

① 錯 ② 對 ③ 對 ④ 對 ⑤ 錯 ⑥ 對 ⑦ 對 ⑧ 錯 ⑨ 對 ⑩ 對 〔習題2.3〕填空題

〔解答〕

① 32,DX,DH ② 16 ③ 段地址,偏移地址,EIP,IP ④ 00100110,0 ⑤ 73C00H,73800H ⑥ EBX,ECX,ESI,EDI,EBP,ESP ⑦ 實地址,64KB ⑧ ASM,目標模塊,FLAT ⑨ 立即數尋址、寄存器尋址和存儲器尋址 ⑩ DS,SS 〔習題2.4〕

處理器內部具有哪3個基本部分?8086分為哪兩大功能部件?其各自的主要功能是什么? 〔解答〕

處理器內部有ALU、寄存器和指令處理三個基本單元。8086有兩大功能部件:總線接口單元和執行單元。總線接口單元:管理著8086與系統總線的接口,負責處理器對存儲器和外設進行訪問。8086所有對外操作必須通過BIU和這些總線進行。

執行單元EU:負責指令譯碼、數據運算和指令執行。〔習題2.5〕

8086怎樣實現了最簡單的指令流水線? 〔解答〕

8086中,指令的讀取是在BIU單元,而指令的執行是在EU單元。因為BIU和EU兩個單元相互獨立、分別完成各自操作,所以可以并行操作。也就是說,在EU單元對一個指令進行譯碼執行時,BIU單元可以同時對后續指令進行讀取;這就是最簡單的指令流水線技術。〔習題2.6〕

什么是標志?什么是IA-32處理器的狀態標志、控制標志和系統標志?說明狀態標志在標志寄存器EFLAGS的位置和含義。〔解答〕

標志:用于反映指令執行結果或控制指令執行形式的一個或多個二進制數位。例如,有些指令執行后會影響有關標志位;有些指令的執行要利用相關標志。狀態標志:用來記錄程序運行結果的狀態信息。控制標志:DF標志,控制字符串操作的地址方向。系統標志:用于控制處理器執行指令的方式。

狀態標志在標志寄存器EFLAGS中的位置和含義如下:

11 10 9 8 7 6 5 4 3 2 1 0 ?? OF

SF ZF AF PF CF

〔習題2.7〕

舉例說明CF和OF標志的差異。〔解答〕

進位標志CF表示無符號數運算結果是否超出范圍,超出范圍后加上進位或借位,運算結果仍然正確;溢出標志OF表示有符號數運算結果是否超出范圍,如果超出范圍,運算結果已經不正確。

例1:3AH + 7CH=B6H 無符號數運算:58+124=182,范圍內,無進位。有符號數運算:58+124=182,范圍外,有溢出。例2:AAH + 7CH=①26H 無符號數運算:170+124=294,范圍外,有進位。有符號數運算:-86+124=28,范圍內,無溢出。〔習題2.8〕 什么是8086中的邏輯地址和物理地址?邏輯地址如何轉換成物理地址?請將如下邏輯地址用物理地址表達(均為十六進制形式):

① FFFF∶0

② 40∶17

③ 2000∶4500

④ B821∶4567 〔解答〕 物理地址:在處理器地址總線上輸出的地址稱為物理地址。每個存儲單元有一個唯一的物理地址。

邏輯地址:在處理器內部、程序員編程時采用邏輯地址,采用“段地址:偏移地址“形式。某個存儲單元可以有多個邏輯地址,即處于不同起點的邏輯段中,但其物理地址是唯一的。邏輯地址轉換成物理地址:邏輯地址由處理器在輸出之前轉換為物理地址。將邏輯地址中的段地址左移二進制4位(對應16進制是一位,即乘以16),加上偏移地址就得到20位物理地址。

① FFFFH:0=FFFF0H ② 40H:17H=00417H ③ 2000H:4500H=24500H ④ B821H:4567H=BC777H 〔習題2.9〕

IA-32處理器有哪三類基本段,各是什么用途? 〔解答〕

IA-32處理器有代碼段、數據段、堆棧段三類基本段。

代碼段:存放程序的指令代碼。程序的指令代碼必須安排在代碼段,否則將無法正常執行。數據段:存放當前運行程序所用的數據。程序中的數據默認是存放在數據段,也可以存放在其他邏輯段中。

堆棧段:主存中堆棧所在的區域。程序使用的堆棧一定在堆棧段。〔習題2.10〕

什么是平展存儲模型、段式存儲模型和實地址存儲模型? 〔解答〕

平展存儲模型下,對程序來說存儲器是一個連續的地址空間,稱為線性地址空間。程序需要的代碼、數據和堆棧都包含在這個地址空間中。

段式存儲模型下,對程序來說存儲器由一組獨立的地址空間組成,獨立的地址空間稱為段。通常,代碼、數據和堆棧位于分開的段中。

實地址存儲模型是8086處理器的存儲模型。它是段式存儲模型的特例,其線性地址空間最大為1MB容量,由最大為64KB的多個段組成。〔習題2.11〕

什么是實地址方式、保護方式和虛擬8086方式?它們分別使用什么存儲模型? 〔解答〕

實地址方式:與8086具有相同的基本結構,只能尋址1MB物理存儲器空間,邏輯段最大不超過64KB;但可以使用32位寄存器、32位操作數和32位尋址方式;相當于可以進行32位處理的快速8086。實地址工作方式只能支持實地址存儲模型。

保護方式:具有強大的段頁式存儲管理和特權與保護能力,使用全部32條地址總線,可尋址4GB物理存儲器。保護方式通過描述符實現分段存儲管理,每個邏輯段可達4GB。處理器工作在保護方式時,可以使用平展或段式存儲模型。

虛擬8086方式:在保護方式下運行的類似實方式的運行環境,只能在1MB存儲空間下使用“16位段”。處理器工作在虛擬8086方式時,只能使用實地址存儲模型。〔習題2.12〕 匯編語句有哪兩種,每個語句由哪4個部分組成? 〔解答〕

匯編語句有兩種:執行性語句(處理器指令)、說明性語句(偽指令)。每個語句有:標號、指令助記符、操作數或參數、注釋4個部分組成。〔習題2.13〕

匯編語言程序的開發有哪4個步驟,分別利用什么程序完成、產生什么輸出文件。〔解答〕

匯編語言程序的開發有4個步驟:

編輯:用文本編輯器形成一個以ASM為擴展名的源程序文件。匯編:用匯編程序將ASM文件轉換為OBJ模塊文件。

連接:用連接程序將一個或多個目標文件鏈接成一個EXE或COM可執行文件。調試:用調試程序排除錯誤,生成正確的可執行文件。〔習題2.14〕

MASM匯編語言中,下面哪些是程序員可以使用的正確的標識符。FFH,DS,0xvab,Again,next,@data,h_ascii,6364b,.exit,small 〔解答〕

FFH,Again,next,h_ascii 〔習題2.15〕

給出IA-32處理器的32位尋址方式和16位尋址方式的組成公式,并說明各部分作用。〔解答〕

① 32位存儲器尋址方式的組成公式

32位有效地址 = 基址寄存器+(變址寄存器×比例)+位移量 其中的4個組成部分是:

?基址寄存器??任何8個32位通用寄存器之一;

?變址寄存器??除ESP之外的任何32位通用寄存器之一;

?比例??可以是1,2,4或8(因為操作數的長度可以是1,2,4或8字節); ?位移量??可以是8或32位有符號值。② 16位存儲器尋址方式的組成公式

16位有效地址 = 基址寄存器+變址寄存器+位移量

其中基址寄存器只能是BX或BP,變址寄存器只能是SI或DI,位移量是8或16位有符號值。

〔習題2.16〕

說明下列指令中源操作數的尋址方式?假設VARD是一個雙字變量。(1)mov edx,1234h(2)mov edx,vard(3)mov edx,ebx(4)mov edx,[ebx](5)mov edx,[ebx+1234h](6)mov edx,vard[ebx](7)mov edx,[ebx+edi](8)mov edx,[ebx+edi+1234h](9)mov edx,vard[esi+edi](10)mov edx,[ebp*4] 〔解答〕 ① 立即數 ② 直接 ③ 寄存器 ④ 寄存器間接 ⑤ 寄存器相對 ⑥ 寄存器相對 ⑦ 基址變址 ⑧ 相對基址變址 ⑨ 相對基址變址 ⑩ 帶比例尋址 〔習題2.17〕

使用本書配套的軟件包(或者按照本書說明)創建MASM開發環境,通過編輯例題2-1和例題2-2程序、匯編連接生成可執行程序和列表文件,掌握匯編語言的開發。第3章 數據處理 〔習題3.1〕簡答題 〔解答〕

① 沒有。使用二進制8位表達無符號整數,257沒有對應的編碼。② 字符“'F'”的ASCII碼就是數值46H,所以沒有區別。

③ 匯編程序在匯編過程中對數值表達式計算,得到一個確定的數值,故稱數值表達式為常量。

④ 不能。數值500大于一個字節所能表達的數據量,所以不能為字節變量賦值。⑤ 源、目標寄存器位數不同,不能用該指令進行數據交換。

⑥ 前者在指令執行時獲得偏移地址,是正確的;但后者的OFFSET只能在匯編階段獲得偏移地址,但此時寄存器內容是不可知的,所以無法獲得偏移地址。

⑦ INC,DEC,NEG和NOT指令的操作數既是源操作數也是目的操作數。⑧ 大小寫字母轉換利用它們的ASCII碼相差20H。

⑨ 加減法不區別無符號數和有符號數,但根據運算結果分別設置標志寄存器的CF和OF標志,可利用CF和OF進行區別。

⑩ 邏輯與運算規則類似二進制的乘法,所以稱其為邏輯乘。〔習題3.2〕判斷題

〔解答〕

① 對 ② 對 ③ 對 ④ 錯 ⑤ 錯

⑥ 對 ⑦ 錯 ⑧ 錯 ⑨ 對 ⑩ 對 〔習題3.3〕填空題 〔解答〕

① BYTE,OFFSET ② 97,61,小寫字母a ③ 0DH(13),0AH(10)④ 8843H ⑤ DWORD,4,WORD PTR XYZ ⑥ 3 ⑦ 78894111 ⑧ 0,0,0 ⑨ ***2H,83H ⑩ 4 〔習題3.4〕

下列十六進制數表示無符號整數,請轉換為十進制形式的真值: ① FFH

② 0H

③ 5EH

④ EFH 〔解答〕 ① 255 ② 0 ③ 94 ④ 239 〔習題3.5〕

將下列十進制數真值轉換為壓縮BCD碼: ① 12

② 24

③ 68

④ 99 〔解答〕 ① 12H ② 24H ③ 68H ④ 99H 〔習題3.6〕

將下列壓縮BCD碼轉換為十進制數:

① 10010001

② 10001001

③ 00110110

④ 10010000 〔解答〕 ① 91 ② 89 ③ 36 ④ 90 〔習題3.7〕

將下列十進制數用8位二進制補碼表示: ① 0

② 127

③-127

④ -57 〔解答〕 ① 00000000 ② 01111111 ③ 10000001 ④ 11000111 〔習題3.8〕

進行十六進制數據的加減運算,并說明是否有進位或借位: ① 1234H+7802H ② F034H+5AB0H ③ C051H-1234H ④ 9876H-ABCDH 〔解答〕

① 1234H+7802H=8A36H,無進位 ② F034H+5AB0H=4AF4H,有進位 ③ C051H-1234H=BE1DH,無借位 ④ 9876H-ABCDH=ECA9H,有借位 〔習題3.9〕

數碼0~

9、大寫字母A~Z、小寫字母a~z對應的ASCII碼分別是多少?ASCII碼0DH和0AH分別對應什么字符? 〔解答〕

數碼0~9對應的ASCII碼依次是30H~39H。

大寫字母A~Z對應的ASCII碼依次是:41H~5AH。小寫字母a~z對應的ASCII碼依次是:61~7AH。ASCII碼0DH和0AH分別對應的是回車和換行字符。〔習題3.10〕

設置一個數據段,按照如下要求定義變量或符號常量: ① my1b為字符串變量:Personal Computer ② my2b為用十進制數表示的字節變量:20 ③ my3b為用十六進制數表示的字節變量:20 ④ my4b為用二進制數表示的字節變量:20 ⑤ my5w為20個未賦值的字變量 ⑥ my6c為100的常量

⑦ my7c表示字符串:Personal Computer 〔解答〕

my1b byte 'Personal Computer' my2b byte 20 my3b byte 14h my4b byte 00010100b my5w word 20 dup(?)my6c = 100 my7c equ

〔習題3.11〕

定義常量NUM,其值為5;數據段中定義字數組變量DATALIST,它的頭5個字單元中依次存放-10,2,5和4,最后1個單元初值不定。〔解答〕 num equ 5 datalist byte-10,2,5,4,? 〔習題3.12〕

從低地址開始以字節為單位,用十六進制形式給出下列語句依次分配的數值:

byte 'ABC',10,10h,'EF',3 dup(-1,?,3 dup(4))word 10h,-5,3 dup(?)〔解答〕

0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 FF 00 04 04 04 10 00 FB FF 00 00 00 00 00 00 〔習題3.13〕

設在某個程序中有如下片段,請寫出每條傳送指令執行后寄存器EAX的內容:

;數據段

org 100h varwword 1234h,5678h varb byte 3,4 vard dword 12345678h buff byte 10 dup(?)mess byte 'hello';代碼段

mov eax,offset mess mov eax,type buff+type mess+type vard mov eax,sizeof varw+sizeof buff+sizeof mess mov eax,lengthof varw+lengthof vard 〔解答〕

EAX=0114H ②

EAX=0006H ③

EAX=0013H ④

EAX=0003H 〔習題3.14〕

按照如下輸出格式,在屏幕上顯示ASCII表:

| 0 1 2 3 4 5 6 7 8 9 A B C D E F---+-20 |

!“ #...30 | 0 1 2 3...40 | @ A B C...50 | P Q R S...60 | ‘ a b c...70 | p q r s...表格最上一行的數字是對應列ASCII代碼值的低4位(用十六進制形式),而表格左邊的數字對應行ASCII代碼值的高4位(用十六進制形式)。編程在數據段直接構造這樣的表格、填寫相應ASCII代碼值(不是字符本身),然后使用字符串顯示子程序DISPMSG實現顯示。〔解答〕

include io32.inc.data table byte '

|0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 byte '20 |',20h,20h,21h,20h,22h,20h,23h,20h,24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h byte 2ah,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,20h,39h,20h byte 3ah,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,20h,49h,20h byte 4ah,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,20h,59h,20h byte 5ah,20h,5bh,20h,5ch,20h,5dh,20h,5eh,20h,5fh,20h,13,10 byte '60 |',60h,20h,61h,20h,62h,20h,63h,20h,64h,20h,65h,20h,66h,20h,67h,20h,68h,20h,69h,20h byte 6ah,20h,6bh,20h,6ch,20h,6dh,20h,6eh,20h,6fh,20h,13,10 byte '70 |',70h,20h,71h,20h,72h,20h,73h,20h,74h,20h,75h,20h,76h,20h,77h,20h,78h,20h,79h,20h byte 7ah,20h,7bh,20h,7ch,20h,7dh,20h,7eh,20h,7fh,20h,13,10 byte 0.code start: mov eax,offset table call dispmsg exit 0 end start 〔習題3.15〕

數據段有如下定義,IA-32處理器將以小端方式保存在主存: var dword 12345678h 現以字節為單位按地址從低到高的順序,寫出這個變量內容。并說明如下指令的執行結果:

mov eax,var;EAX=__________ mov bx,var;BX=__________ mov cx,var+2;CX=__________ mov dl,var;DL=__________ mov dh,var+3;DH=__________ 可以編程使用十六進制字節顯示子程序DSIPHB順序顯示各個字節進行驗證,還可以使用十六進制雙字顯示子程序DSIPHD顯示該數據進行對比。〔解答〕

小端方式采用“低對低、高對高”,即低字節數據存放在低地址存儲單元、高字節數據存放在高地址存儲單元。以字節為單位按地址從低到高的順序,var變量的內容:78H、56H、34H、12H。

;EAX=12345678H;BX=5678H;CX=1234H;DL=78H;DH=12H 〔習題3.16〕

使用若干MOV指令實現交互指令“XCHG EBX,[EDI]”功能。〔解答〕

push eax;可以沒有

mov eax,ebx mov ebx,[edi] mov [edi],eax pop eax;可以沒有 〔習題3.17〕

假設當前ESP=0012FFB0H,說明下面每條指令后,ESP等于多少?

push eax push dx push dword ptr 0f79h pop eax pop word ptr [bx] pop ebx 〔解答〕

ESP=0012FFACH ESP=0012FFAAH ESP=0012FFA6H ESP=0012FFAAH ESP=0012FFACH ESP=0012FFB0H 〔習題3.18〕

已知數字0~9對應的格雷碼依次為:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H;請為如下程序的每條指令加上注釋,說明每條指令的功能和執行結果。

;數據段

table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;代碼段

mov ebx,offset table mov al,8 xlat 為了驗證你的判斷,不妨使用本書的I/O子程序庫提供的子程序DISPHB顯示換碼后AL的值。如果不使用XLAT指令,應如何修改? 〔解答〕

;數據段

table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;定義格雷碼表

;代碼段

mov ebx,offset table;EBX=格雷碼表首地址

mov al,8;AL=8 xlat;AL=12H(8的格雷碼)不使用XLAT指令:

mov ebx,offset table;EBX=格雷碼表首地址

mov eax,0 mov al,8;AL=8 mov al,[eax+ebx];AL=12H(8的格雷碼)〔習題3.19〕

請分別用一條匯編語言指令完成如下功能:

(1)把EBX寄存器和EDX寄存器的內容相加,結果存入EDX寄存器。(2)用寄存器EBX和ESI的基址變址尋址方式把存儲器的一個字節與AL寄存器的內容相加,并把結果送到AL中。

(3)用EBX和位移量0B2H的寄存器相對尋址方式把存儲器中的一個雙字和ECX寄存器的內容相加,并把結果送回存儲器中。

(4)將32位變量VARD與數3412H相加,并把結果送回該存儲單元中。(5)把數0A0H與EAX寄存器的內容相加,并把結果送回EAX中。〔解答〕

① add edx,ebx ② add al,[ebx+esi] ③ add [bx+0b2h],cx ④ add varw,3412h ⑤ add eax,0a0h 〔習題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的進位含義:256+44=300)(4)

mov al,7fh;AL=7FH sub al,8;AL=77H,CF=0,SF=0 sub al,80h;AL=F7H,CF=1,OF=1 sbb al,3;AL=F3H,CF=0,ZF=0 〔習題3.21〕

給出下列各條指令執行后AL值,以及CF、ZF、SF、OF和PF的狀態:

mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al 〔解答〕

mov al,89h;AL=89H CF ZF SF OF PF add al,al;AL=12H 1 0 0 1 1 add al,9dh;AL=0AFH 0 0 1 0 1 cmp al,0bch;AL=0AFH 1 0 1 0 1 sub al,al;AL=00H 0 1 0 0 1 dec al;AL=0FFH 0 0 1 0 1 inc al;AL=00H 0 1 0 0 1 〔習題3.22〕 有兩個64位無符號整數存放在變量buffer1和buffer2中,定義數據、編寫代碼完成EDX.EAX←buffer1-buffer2功能。〔解答〕

;數據段

buffer1 qword 67883000h buffer2 qword 67762000h;代碼段

mov eax,dword ptr buffer1 mov edx,dword ptr buffer1+4 sub eax,dword ptr buffer2 sbb edx,dword ptr buffer2+4 〔習題3.23〕

分別執行如下程序片斷,說明每條指令的執行結果: 〔解答〕(1)

;ESI=9CH;ESI=80H;ESI=FFH;ESI=01H(2)

;EAX=1010B(可以有前導0,下同)

;EAX=0010B,CF=1;EAX=0100B,CF=0;EAX=0000B,CF=0(3)

;EAX=1011B(可以有前導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 〔習題3.24〕

3.24 給出下列各條指令執行后AX的結果,以及狀態標志CF、OF、SF、ZF、PF的狀態。

mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 〔解答〕

mov ax,1470h;AX=1470H CF OF SF ZF PF and ax,ax;AX=1470H 0 0 0 0 0 or ax,ax;AX=1470H 0 0 0 0 0 xor ax,ax;AX=0000H 0 0 0 1 1 not ax;AX=FFFFH 0 0 0 1 1 test ax,0f0f0h;AX=0F0F0H 0 0 1 0 1 〔習題3.25〕

邏輯運算指令怎么實現復位、置位和求反功能? 〔解答〕

AND指令同“0”與實現復位,OR指令同“1”或實現置位,XOR同“1”異或實現求反。〔習題3.26〕

說明如下程序段的功能:

mov ecx,16 mov bx,ax next:shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx 〔解答〕

將AX的每一位依次重復一次,所得的32位結果保存于EAX中。〔習題3.27〕

編程將一個64位數據邏輯左移3位,假設這個數據已經保存在EDX.EAX寄存器對中。〔解答〕

;代碼段

mov ecx,3 again: shl eax,1 rcl edx,1 loop again 〔習題3.28〕

編程將一個壓縮BCD碼變量(例如92H)轉換為對應的ASCII碼,然后調用DISPC子程序(在輸入輸出子程序庫中)顯示。〔解答〕

;數據段 bcd byte 92h;代碼段

mov al,bcd shr al,4 add al,30h call dispc mov al,bcd and al,0fh add al,30h call dispc 〔習題3.29〕

以MOVS指令為例,說明串操作指令的尋址特點,并用MOV和ADD等指令實現MOVSD的功能(假設DF=0)。〔解答〕

MOVS指令的功能是:

ES:[EDI]←DS:[ESI];ESI←ESI±1/2/4,EDI←EDI±1/2/4 由此可看出串操作指令的尋址特點:

源操作數用寄存器ESI間接尋址,默認在DS指向的數據段,但可以改變;目的操作數用寄存器EDI間接尋址,只能在ES指向的附加數據段;每執行一次串操作,源指針ESI和目的指針EDI將自動修改:±1(字節),±2(字)或±4(雙字)。指針的增量和減量控制由DF標志確定,DF=0,進行增量;DF=1,進行減量。

push eax mov eax,[esi] mov es:[edi],eax add esi,4 add edi,4 〔習題3.30〕

說明如下程序執行后的顯示結果:

;數據段

msg byte 'WELLDONE',0;代碼段

mov ecx,(lengthof msg)-1 mov ebx,offset msg again: mov al,[ebx] add al,20h mov [ebx],al add ebx,1 loop again mov eax,offset msg call dispmsg 如果將其中語句“mov ebx,offset msg”改為“xor ebx,ebx”,則利用EBX間接尋址的兩個語句如何修改成EBX寄存器相對尋址,就可以實現同樣功能? 〔解答〕

顯示結果:welldone EBX寄存器相對尋址:

mov al,msg[ebx] mov msg[ebx],al 〔習題3.31〕

下面程序的功能是將數組ARRAY1的每個元素加固定值(8000H),將和保存在數組ARRAY2。在空白處填入適當的語句或語句的一部分。

;數據段

array1 dword 1,2,3,4,5,6,7,8,9,10 array2 dword 10 dup(?);代碼段

mov ecx,lengthof array1 mov ebx,0 again: mov eax,array1[ebx*4] add eax,8000h mov ______________ add ebx,__________ loop again 〔解答〕

mov array2[ebx*4],eax add ebx,1 〔習題3.32〕

上機實現本章的例題程序,編程實現本章的習題程序。第4章 匯編語言程序設計 〔習題4.1〕簡答題 〔解答〕

① 當同一個程序被操作系統安排到不同的存儲區域執行時,指令間的位移沒有改變,目標地址采用相對尋址可方便操作系統的靈活調度。

② 數據通信時,數據的某一位用做傳輸數據的奇偶校驗位,數據中包括校驗位在內的“1”的個數恒為奇數,就是奇校驗;恒為偶數,就是偶校驗。

③ 無符號數和有符號數的操作影響兩組不同的標志狀態位,故判斷兩個無符號數和有符號數的大小關系要利用不同的標志位組合,所以有對應的兩組指令。

④ 雙分支結構中兩個分支體之間的JMP指令,用于實現結束前一個分支回到共同的出口作用。

⑤ 完整的子程序注釋可方便程序員調用該子程序,子程序注釋包括子程序名、子程序功能、入口參數和出口參數、調用注意事項和其他說明等。

⑥ 子程序保持堆棧平衡,才能保證執行RET指令時當前棧頂的內容是正確的返回地址。主程序也要保持堆棧平衡,這樣才能釋放傳遞參數占用的堆棧空間,否則多次調用該子程序可能就致使堆棧溢出。

⑦ “傳值”是傳遞參數的一個拷貝,被調用程序改變這個參數不影響調用程序;“傳址”時,被調用程序可能修改通過地址引用的變量內容。

⑧ INCLUDE語句包含的是文本文件、是源程序文件的一部分;INCLUDELIB語句包含的是子程序庫文件。⑨ 取長補短。

⑩ Windows程序在運行時需要加載其配套的動態鏈接庫DLL文件,當其沒有被搜索到時就會提示不存在。〔習題4.2〕判斷題 〔解答〕

① 對 ② 錯 ③ 錯 ④ 錯 ⑤ 錯 ⑥ 對 ⑦ 對 ⑧ 錯 ⑨ 對 ⑩ 錯 〔習題4.3〕填空題 〔解答〕

① 相對尋址,間接尋址,直接尋址,間接尋址 ② 1256H,3280H ③ 3721H,1 ④ EAH ⑤ 循環初始,循環控制 ⑥ REPT1標號的地址 ⑦ TEST ENDP,ENDM ⑧ EBP ⑨ PUBLIC,EXTERN ⑩ 38H 0DH 0AH 〔習題4.4〕

為了驗證例題4-1程序的執行路徑,可以在每個標號前后增加顯示功能。例如使得程序運行后顯示數碼1234。〔解答〕

jmp labl1;相對尋址

nop mov eax,'?' call dispc labl1: mov eax,'1' call dispc jmp near ptr labl2;相對近轉移

nop mov eax,'?' call dispc labl2: mov eax,'2' call dispc mov eax,offset labl3

jmp eax;寄存器間接尋址

nop mov eax,'?' call dispc labl3: mov eax,'3' call dispc mov eax,offset labl4 mov nvar,eax jmp nvar;存儲器間接尋址

nop mov eax,'?' call dispc labl4: mov eax,'4' call dispc 〔習題4.5〕

使用“SHR EAX,2”將EAX中的D1位移入CF標志,然后用JC/JNC指令替代JZ/JNZ指令完成例題4-3的功能。〔解答〕

mov eax,56h;假設一個數據

shr eax,2;D1位移入CF標志

jnc nom;D1=0條件成立,轉移

...;余同原程序 〔習題4.6〕

執行如下程序片斷后,CMP指令分別使得5個狀態標志CF、ZF、SF、OF和PF為0還是為1?它會使得哪些條件轉移指令指令Jcc的條件成立、發生轉移?

mov eax,20h cmp eax,80h 〔解答〕

CF=1 ZF=0 SF=1 OF=0 PF=1 可以使得條件成立、發生轉移的指令有:JC JS JP JNZ JNO 〔習題4.7〕

將例題4-4程序修改為實現偶校驗。建議進一步增加顯示有關提示信息的功能,使得程序具有更加良好的交互性。〔解答〕

include io32.inc.data msg1 byte 'Please input a character: ',0 msg2 byte 'The ASCII code of the charater you entered is: ',0 msg3 byte 'The code with even parity is: ',0.code start: mov eax,offset msg1 call dispmsg call readc call dispcrlf mov ebx,eax mov eax,offset msg2 call dispmsg mov eax,ebx call dispbb call dispcrlf and al,7fh jp next or al,80h next:mov ebx,eax mov eax,offset msg3 call dispmsg mov eax,ebx call dispbb exit 0 end start 〔習題4.8〕

在采用奇偶校驗傳輸數據的接收端應該驗證數據傳輸的正確性。例如,如果采用偶校驗,那么在接收到的數據中,其包含“1”的個數應該為0或偶數個,否則說明出現傳輸錯誤。現在,在接收端編寫一個這樣的程序,如果偶校驗不正確顯示錯誤信息,傳輸正確則繼續。假設傳送字節數據、最高位作為校驗位,接收到的數據已經保存在Rdata變量中。〔解答〕

;數據段

Rdata byte 57h;保存接收的數據 error byte 'Error!',0;代碼段

mov al,Rdata and al,0ffh;標志PF反映“1”的個數

jp done;個數為偶數,正確繼續

mov eax,offset error;個數為奇數,顯示出錯

call dispmsg done: 〔習題4.9〕

指令CDQ將EAX符號擴展到EDX,即:EAX最高為0,則EDX=0;EAX最高為1,則EDX=FFFFFFFFH。請編程實現該指令功能。〔解答1〕

test eax,8000h;測試最高位

jz next1;最高位為0(ZF=1),轉移到標號NEXT1 mov edx,0ffffffffh;最高位為1,順序執行:設置EDX=FFFFFFFFH jmp done;無條件轉移,跳過另一個分支

next1: mov dx,0;最高位為0轉移到此執行:設置EDX=0 done: 〔解答2〕

使用移位指令更好。

rol eax,1 rcr edx,1 sar edx,31 ror eax,1 〔習題4.10〕

編程,首先測試雙字變量DVAR的最高位,如果為1,則顯示字母“L”;如果最高位不為1,則繼續測試最低位,如果最低位為1,則顯示字母“R”;如果最低位也不為1,則顯示字母“M”。〔解答〕

;數據段 dvar dword 57h;代碼段

mov eax,dvar test eax,80000000h jnz nextl test eax,1 jnz nextr mov al,'M' jmp done nextl: mov al,'L' jmp done nextr: mov al,'R' done: call dispc 〔習題4.11〕編寫一個程序,先提示輸入數字“Input Number:0~9”,然后在下一行顯示輸入的數字,結束;如果不是鍵入了0~9數字,就提示錯誤“Error!”,繼續等待輸入數字。〔解答〕

;數據段

inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error!Input again: ',0;代碼段

mov eax,offset inmsg;提示輸入數字

call dispmsg again: call readc;等待按鍵

cmp al,'0';數字 < 0?

jb erdisp cmp al,'9';數字 > 9?

ja erdisp call dispcrlf call dispc jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again done: 〔習題4.12〕

有一個首地址為ARRAY的20個雙字的數組,說明下列程序段的功能。

mov ecx,20 mov eax,0 mov esi,eax sumlp: add eax,array[esi] add esi,4 loop sumlp mov total,eax 〔解答〕

求這20個雙字的和,保存在TOTAL變量,不關進心進位和溢出。〔習題4.13〕

編程中經常要記錄某個字符出現的次數。現編程記錄某個字符串中空格出現的次數,結果保存在SPACE單元。〔解答〕

;數據段

string byte 'Do you have fun with Assembly ?',0;以0結尾的字符串 space dword ?;代碼段

mov esi,offset string xor ebx,ebx;EBX用于記錄空格數 again: mov al,[esi] cmp al,0 jz done cmp al,20h;空格的ASCII碼是20H jne next;不相等、不是空格,轉移

inc bx;相等、是空格,空格個數加1 next:inc esi jmp again;繼續循環 done: mov space,ebx;保存結果 〔習題4.14〕

編寫計算100個16位正整數之和的程序。如果和不超過16位字的范圍(65535),則保存其和到WORDSUM,如超過則顯示‘Overflow!’。〔解答〕

;數據段 array word 2005,2008,98 dup(1394);假設100個16位正整數 wordsum word ? error byte 'Overflow!',0;代碼段

and ebx,0 mov ecx,100 xor ax,ax again: add ax,array[ebx*2] jc over inc ebx loop again mov wordsum,ax over: mov eax,offset error call dispmsg 〔習題4.15〕

在一個已知長度的字符串中查找是否包含“BUG”子字符串。如果存在,顯示“Y”,否則顯示“N”。〔解答〕

;數據段

string byte 'If you find any error in the program, you can DEBUG it.' count = sizeof string bug byte 'BUG';代碼段

mov ecx,count mov edi,offset string L1: mov esi,offset bug push edi mov edx,sizeof bug LN: mov al,[esi] cmp [edi],al jne L2 inc esi inc edi dec edx jne LN pop edi mov al,'Y' jmp L3 L2: pop edi inc edi loop L1 mov al,'N' L3: call dispc 〔習題4.16〕

主存中有一個8位壓縮BCD碼數據,保存在一個雙字變量中。現在需要進行顯示,但要求不顯示前導0。由于位數較多,需要利用循環實現,但如何處理前導0和數據中間的0呢?不妨設置一個標記。編程實現。〔解答〕

;數據段

bcd dword 00371002h;代碼段

mov esi,bcd cmp esi,0 jnz goon mov al,'0' call dispc jmp done goon: mov ecx,8 xor ebx,ebx;EBX=0,表示可能是前導0 again: rol esi,4 mov eax,esi and eax,0fh;EAX低4位保存當前要顯示的BCD碼

cmp ebx,0;EBX≠0,說明不是前導0,要顯示

jnz disp;EBX=0,說明可能是前導0 cmp eax,0

jz next;EAX=0,說明是前導0,不顯示

mov ebx,1;EAX≠0,沒有前導0了,令EBX=1≠0 disp: add al,30h call dispc next:loop again done: 〔習題4.17〕

已知一個字符串的長度,剔除其中所有的空格字符。請從字符串最后一個字符開始逐個向前判斷、并進行處理。〔解答〕

;數據段

string byte 'Let us have a try!',0dh,0ah,0;代碼段

mov ecx,sizeof string cmp ecx,2 jb done lea eax,string;顯示處理前的字符串

call dispmsg mov esi,ecx dec esi outlp: cmp string[esi],' ';檢測是否是空格

jnz next;不是空格繼續循環

mov edi,esi;是空格,進入剔除空格分支

dec ecx inlp: inc edi mov al,string[edi];前移一個位置

mov string[edi-1],al cmp edi,ecx jb inlp next:dec esi;繼續進行

cmp esi,0 jnz outlp;為0結束

lea eax,string;顯示處理后的字符串

call dispmsg done: 〔習題4.18〕

第3章習題3.14在屏幕上顯示ASCII表,現僅在數據段設置表格緩沖區,編程將ASCII代碼值填入留出位置的表格,然后調用顯示功能實現(需要利用雙重循環)。〔解答〕

include io32.inc.data table byte '

|0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 tab1 byte 6 dup(36 dup(?),13,10)

byte 0.code start: mov ebx,offset tab1 mov edx,'| 02' mov ax,2020h mov esi,6 again0: mov [ebx],edx add ebx,4 mov ecx,16 again1: mov word ptr [ebx],ax add ebx,2 inc al loop again1

add ebx,2 add edx,1 dec esi jnz again0

mov eax,offset table call dispmsg exit 0 end start 〔習題4.19〕

請按如下說明編寫子程序:

子程序功能:把用ASCII碼表示的兩位十進制數轉換為壓縮BCD碼 入口參數:DH=十位數的ASCII碼,DL=個位數的ASCII碼 出口參數:AL=對應BCD碼 〔解答〕 asctob proc shl dh,4 mov al,dh and dl,0fh or al,dl ret asctob endp 〔習題4.20〕

乘法的非壓縮BCD碼調整指令AAM執行的操作是:AH←AL÷10的商,AL←AL÷10的余數。利用AAM可以實現將AL中的100內數據轉換為ASCII碼,程序如下:

xor ah,ah aam add ax,3030h 利用這段程序,編寫一個顯示AL中數值(0~99)的子程序。〔解答〕 disp99 proc xor ah,ah aam add ax,3030h push ax mov al,ah call dispc pop ax call dispc ret disp99 endp 〔習題4.21〕

編寫一個源程序,在鍵盤上按一個鍵,將其返回的ASCII碼值顯示出來,如果按下ESC鍵(對應ASCII碼是1BH)則程序退出。請調用書中的HTOASC子程序。〔解答〕

;代碼段,主程序 again: call readc cmp al,1bh jz done mov bl,al mov al,':' call dispc mov al,bl rol al,4 call htoasc;調用子程序

call dispc;顯示一個字符

mov al,bl call htoasc;調用子程序

call dispc;顯示一個字符

call dispcrlf jmp again done: 〔習題4.22〕

編寫一個子程序,它以二進制形式顯示EAX中32位數據,并設計一個主程序驗證。〔解答〕

;代碼段,主程序

mov eax,8F98FF00H call dispbd;調用子程序

;代碼段,子程序

dispbd proc;32位二進制數的輸出

push ecx push edx mov ecx,32;要輸出的字符個數 dbd: rol eax,1;AL循環左移一位

push eax and al,01h;取AL最低位

add al,30h;轉化成相應的ASCLL碼值

call dispc;以二進制的形式顯示

pop eax loop dbd pop edx pop ecx ret dispbd endp 〔習題4.23〕

將例題4-16的32位寄存器改用16位寄存器,僅實現輸出-215~+215-1之間的數據。〔解答〕

;數據段 array word 12345,-1234,32767,-32768,0,667 writebuf byte 6 dup(0);代碼段,主程序

mov ecx,lengthof array mov ebx,0 again:

mov ax,array[ebx*2]

call write

call dispcrlf

inc ebx

;此時ebx代表array中的第幾個數

dec ecx

;此時ecx代表循環的次數

jnz again;代碼段,子程序

write proc

;子程序開始

push ebx

push ecx

push edx

mov ebx,offset writebuf

;ebx指向顯示緩沖區

test ax,ax

jnz write1

mov byte ptr [ebx],30h

inc ebx

jmp write5 write1:

;若不為0則首先判斷是正是負

jns write2

;若為正則跳過下面兩步到write2

mov byte ptr [ebx],'-'

inc ebx

neg ax write2:

mov cx,10

push cx

;將cx=10壓入棧,作為退出標志

write3:

;write3是讓eax循環除以10并把余數的ASCII碼壓入棧

cmp ax,0

jz write4

xor dx,dx

div cx

add dx,30h

push dx

jmp write3 write4:

;余數的ASCII碼出棧,遇到10終止并轉到write5顯示結果

pop dx

cmp dx,cx

jz write5

mov byte ptr [ebx],dl

inc ebx

jmp write4 write5:

;顯示結果

mov byte ptr [ebx],0

mov eax,offset writebuf

call dispmsg

pop edx

pop ecx

pop ebx

ret write endp 〔習題4.24〕

參考例題4-17,編寫實現32位無符號整數輸入的子程序,并設計一個主程序驗證。〔解答〕

;數據段 count =10 array dword count dup(0)tempdword ? readbuf byte 30 dup(0)errmsg byte 'Input error,enter again!',13,10,0 msg1 byte 'Input ten unsigned numbers,each number ends with enter key:',13,10,0 msg2 byte 'Check the numbers your inputted:',13,10,0;代碼段,主程序

mov eax,offset msg1

call dispmsg

mov ecx,count

mov ebx,offset array again:

call read

mov eax,temp

mov [ebx],eax

add ebx,4

dec ecx

jnz again

mov eax,offset msg2

call dispmsg

mov edx,offset array

mov ecx,count next:

mov eax,[edx]

call dispuid

call dispcrlf

add edx,4

dec ecx

jnz next;代碼段,子程序 read

proc

push eax

push ecx

push ebx

push edx read0:

mov eax,offset readbuf

call readmsg

test eax,eax

jz readerr

cmp eax,12

ja readerr

mov edx,offset readbuf

xor ebx,ebx

xor ecx,ecx

mov al,[edx]

cmp al,'+'

jz read1

cmp al,'-'

jnz read2

jmp readerr read1:

inc edx

mov al,[edx]

test al,al

jz read3

;如果為0,則說明該字符串已結束 read2:

cmp al,'0'

jb readerr

cmp al,'9'

ja readerr

sub al,30h

imul ebx,10

;ebx用來存儲處理過的數據

jc readerr

movzx eax,al

add ebx,eax

jnc read1 readerr:

mov eax,offset errmsg

call dispmsg

jmp read0 read3:

mov temp,ebx

pop edx

pop ebx

pop ecx

pop eax

ret read

endp 〔習題4.25〕

編寫一個計算字節校驗和的子程序。所謂“校驗和”是指不記進位的累加,常用于檢查信息的正確性。主程序提供入口參數,有數據個數和數據緩沖區的首地址。子程序回送求和結果這個出口參數。〔解答〕

;計算字節校驗和的通用過程

;入口參數:DS:EBX=數組的段地址:偏移地址,ECX=元素個數

;出口參數:AL=校驗和

;說明:除EAX/EBX/ECX外,不影響其他寄存器 checksumproc xor al,al;累加器清0 sum: add al,[ebx];求和

inc ebx;指向下一個字節

loop sum ret checksumendp 〔習題4.26〕

編制3個子程序把一個32位二進制數用8位十六進制形式在屏幕上顯示出來,分別運用如下3種參數傳遞方法,并配合3個主程序驗證它。(1)采用EAX寄存器傳遞這個32位二進制數(2)采用temp變量傳遞這個32位二進制數(3)采用堆棧方法傳遞這個32位二進制數 〔解答〕(1)

;數據段

wvarword 307281AFH;代碼段,主程序

mov eax,wvar call disp mov al,'H' call dispc;代碼段,子程序 disp proc push ebx push ecx mov ecx,8;8位 dhw1: rol eax,4 mov ebx,eax and al,0fh;轉換為ASCII碼

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp

(2)

;數據段

wvarword 307281AFH tempword ?;代碼段,主程序

mov eax,wvar mov temp,eax call disp mov al,'H' call dispc;代碼段,子程序 disp proc push ebx push ecx mov ecx,8;8位

mov eax,temp dhw1: rol eax,4 mov ebx,eax and al,0fh;轉換為ASCII碼

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc

;顯示一個字符

mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp(3)

;數據段

wvarword 307281AFH;代碼段,主程序

push wvar call disp add esp,4 mov al,'H' call dispc;代碼段,子程序 disp proc push ebp mov ebp,esp push ebx push ecx mov ecx,8;8位

mov eax,[ebp+8] dhw1: rol eax,4 mov ebx,eax and al,0fh;轉換為ASCII碼

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx pop ebp ret disp endp 〔習題4.27〕

配合例題4-11的簡單加密解密程序,設計一個輸入密碼的程序,將輸入的若干字符經過適當算法得到一個字節量密碼。〔解答〕;ex0427.asm include io32.inc.data key byte ? msg0 byte 'Enter your password:',0 passw byte 50 dup(0)errormsg byte 'Password error, input again!',13,10,0 bufnum = 255 buffer byte bufnum+1 dup(0);定義鍵盤輸入需要的緩沖區 msg1 byte 'Enter messge: ',0 msg2 byte 'Encrypted message: ',0 msg3 byte 'Original messge: ',0.code start: mov eax,offset msg0;提示輸入加密密碼

call dispmsg mov eax,offset passw;設置入口參數EAX call readmsg;調用輸入字符串子程序輸入密碼

mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again0: inc ebx xor al,passw[ebx];使用簡單的異或方法得到加密關鍵字

loop again0 mov key,al;保存加密關鍵字

mov eax,offset msg1;提示輸入字符串

call dispmsg mov eax,offset buffer;設置入口參數EAX call readmsg;調用輸入字符串子程序

push eax;字符個數保存進入堆棧

mov ecx,eax;ECX=實際輸入的字符個數,作為循環的次數

xor ebx,ebx;EBX指向輸入字符 encrypt: mov al,key;AL=加密關鍵字

xor buffer[ebx],al;異或加密

inc ebx dec ecx;等同于指令:loop encrypt jnz encrypt;處理下一個字符

mov eax,offset msg2 call dispmsg mov eax,offset buffer;顯示加密后的密文

call dispmsg call dispcrlf;again: mov eax,offset msg0;提示輸入解密密碼

call dispmsg mov eax,offset passw;設置入口參數EAX call readmsg;調用輸入字符串子程序輸入密碼

mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again1: inc ebx xor al,passw[ebx];使用簡單的異或方法得到加密關鍵字

loop again1 cmp key,al;與原加密關鍵字比較

jz next;密碼相同,則進行解密

mov eax,offset errormsg;提示輸入解密密碼錯誤

call dispmsg jmp again

next:pop ecx;從堆棧彈出字符個數,作為循環的次數

xor ebx,ebx;EBX指向輸入字符 decrypt: mov al,key;AL=解密關鍵字

xor buffer[ebx],al;異或解密

inc ebx dec ecx jnz decrypt;處理下一個字符

mov eax,offset msg3 call dispmsg mov eax,offset buffer;顯示解密后的明文

call dispmsg 〔習題4.28〕

設計一個簡單的兩個整數的加法器程序。〔解答〕;ex0428.asm include io32.inc.data msg1 byte 'Enter the integers:',13,10,0 msg2 byte 13,10,'Enter space to continue!Enter any other key to exit!',13,10,0.code start: mov eax,offset msg1 call dispmsg call readsid mov ebx,eax mov al,'+' call dispc call dispcrlf

call readsid add ebx,eax mov al,'=' call dispc mov eax,ebx call dispsid call dispcrlf

mov eax,offset msg2 call dispmsg call readc cmp al,20h je start

exit 0 end start 〔習題4.29〕

利用十六進制字節顯示子程序DISPHB設計一個從低地址到高地址逐個字節顯示某個主存區域內容的子程序DISPMEM。其入口參數:EAX=主存偏移地址,ECX=字節個數(主存區域的長度)。同時編寫一個主程序進行驗證。〔解答〕

;ex0429.asm in Windows Console include io32.inc.data var byte 'This is a test!'.code start:;主程序

mov eax,offset var mov ecx,sizeof var call dispmem exit 0;子程序 dispmem proc push ebx mov ebx,eax dispm1: mov al,[ebx] call disphb mov al,' ' call dispc inc ebx loop dispm1 pop ebx ret dispmem endp end start 〔習題4.30〕

將例題4-19分別使用子程序模塊、子程序庫和子程序庫包含方法生成最終可執行文件。〔習題4.31〕

區別如下概念:宏定義、宏調用、宏指令、宏展開、宏匯編。〔解答〕

宏定義:就是對宏進行說明,由一對宏匯編偽指令MACRO和ENDM來完成。宏調用:宏定義之后的使用。在使用宏指令的位置寫下宏名,后跟實體參數。宏指令:使用宏時,其形式很像指令,所以稱為宏指令。宏展開:在匯編時,匯編程序用對應的代碼序列替代宏指令。宏匯編:指使用宏的方法進行匯編語言程序設計。〔習題4.32〕

直接使用控制臺輸入和輸出函數實現例題4-21的功能(不使用READMSG和DISPMSG子程序)。〔解答〕

〔習題4.33〕

直接使用控制臺輸出函數實現某個主存區域內容的顯示(習題4.29的功能)。可以改進顯示形式,例如每行顯示16個字節(128位),每行開始先顯示首個主存單元的偏移地址,然后用冒號分隔主存內容。〔解答〕

〔習題4.34〕

如何進行很簡單的修改,使得例題4-22程序的消息窗有“OK”和“Cancel”兩個按鈕。〔解答〕

將MB_OK常量定義為1,即: MB_OK equ 1 〔習題4.35〕

上機實踐例題4-23和例題4-24,并在創建可執行文件的過程中生成匯編語言列表文件。〔習題4.36〕

Pentium處理器含有一個64位的時間標記計數器(Time-Stamp Counter)。該計數器每個時鐘周期遞增(加1);在上電和復位后,該計數器清0。指令“RDTSC”執行后將在EDX(高32位)和EAX(低32位)返回當前的64位時間標記計數器值。利用RDTSC指令在某個函數運行前獲得時間標記計數器值,然后運行該函數后,立即再次執行RDTSC指令,并將再次獲得的時間標記計數器值與之前的計數值相減,得到的差值就是運行該函數需要的時鐘周期數(乘以時鐘周期,等于運行時間)。請利用混合編程方法顯示某個函數的運行時鐘周期數。〔解答〕 第5章 微機總線 〔習題5.1〕簡答題 〔解答〕

① 數據總線承擔著處理器與存儲器、外設之間的數據交換,既可以輸入也可以輸出,故其是雙向的。

② 為減少引腳個數,8086采用了地址總線和數據總線分時復用。即數據總線在不同時刻還具有地址總線的功能。

③ 具有三態能力的引腳當輸出呈現高阻狀態時,相當于連接了一個阻抗很高的外部器件,信號無法正常輸出;即放棄對該引腳的控制,與其他部件斷開連接。

④ 處理器的運行速度遠遠快于存儲器和I/O端口。處理器檢測到存儲器或I/O端口不能按基本的總線周期進行數據交換時,插入一個等待狀態Tw。等待狀態實際上是一個保持總線信號狀態不變的時鐘周期。

⑤ 猝發傳送是處理器只提供首地址、但可以從后續連續的存儲單元中讀寫多個數據。⑥ 總線上可能連接多個需要控制總線的主設備,需要確定當前需要控制總線的主設備,所以需要總線仲裁。

⑦ 異步時序是由總線握手(Handshake)聯絡(應答)信號控制,不是由總線時鐘控制。故總線時鐘信號可有可無。

⑧ 單總線結構限制了許多需要高速傳輸速度的部件。32位PC機采用多種總線并存的系統結構。各種專用局部總線源于處理器芯片總線,以接近處理器芯片引腳的速度傳輸數據,它為高速外設提供速度快、性能高的共用通道。⑨ 4個。

⑩ 即插即用技術是指32位PC機的主板、操作系統和總線設備配合,實現自動配置功能。〔習題5.2〕判斷題 〔解答〕

① 對 ② 對 ③ 錯 ④ 對 ⑤ 對 ⑥ 錯 ⑦ 對 ⑧ 對 ⑨ 對 ⑩ 錯 〔習題5.3〕填空題 〔解答〕 ① 0 ② 讀,寫

③ 存儲器讀,存儲器讀,存儲器寫 ④ 4,2,10ns ⑤ 低有效,0010 ⑥ 尋址,數據傳送

⑦ 127,1.5Mb/s,12Mb/s ⑧ 地址,數據 ⑨,⑩,I/O CH RDY 〔習題5.4〕

處理器有哪4種最基本的總線操作(周期)? 〔解答〕

存儲器讀、存儲器寫,I/O讀、I/O寫。〔習題5.5〕

8086處理器的輸入控制信號有RESET,HOLD,NMI和INTR,其含義各是什么?當它們有效時,8086 CPU將出現何種反應? 〔解答〕

RESET:復位輸入信號,高電平有效。該引腳有效時,將迫使處理器回到其初始狀態;轉為無效時,CPU重新開始工作。

HOLD:總線請求,是一個高電平有效的輸入信號。該引腳有效時,表示其他總線主控設備向處理器申請使用原來由處理器控制的總線。

NMI:不可屏蔽中斷請求,是一個利用上升沿有效的輸入信號。該引腳信號有效時,表示外界向CPU申請不可屏蔽中斷。

INTR:可屏蔽中斷請求,是一個高電平有效的輸入信號。該引腳信號有效時,表示中斷請求設備向處理器申請可屏蔽中斷。〔習題5.6〕

區別概念:指令周期、總線周期(機器周期)、時鐘周期、T狀態。〔解答〕

指令周期:一條指令從取指、譯碼到最終執行完成的過程。總線周期(機器周期):有數據交換的總線操作。時鐘周期:處理器的基本工作節拍,由時鐘信號產生,一個高電平和一個低電平為一個周期。T狀態:完成特定操作的一個時鐘周期。由于時間上一個T狀態等于一個時鐘周期,所以常常將兩者混為一談。〔習題5.7〕

總結8086各個T狀態的主要功能。〔解答〕

T1狀態:總線周期的第一個時鐘周期主要用于輸出存儲器地址或I/O地址; T2狀態:輸出讀/寫控制信號。

T3狀態:鎖存地址、處理器提供的控制信號和數據在總線上繼續維持有效,且T3時鐘的前沿(下降沿)對READY引腳進行檢測。READY信號有效,進入T4周期。

T4狀態:總線周期的最后一個時鐘周期,處理器和存儲器或I/O端口繼續進行數據傳送,直到完成,并為下一個總線周期做好準備。

Tw狀態:等待狀態。處理器在T3前沿發現READY信號無效后,插入Tw。Tw狀態的引腳信號延續T3時的狀態、維持不變。〔習題5.8〕 請解釋8086(最小組態)以下引腳信號的含義:CLK,A19/S6~A16/S3,AD15~AD0,ALE,和。默畫它們在具有一個等待狀態的存儲器讀總線周期中的波形示意。〔解答〕

CLK:時鐘輸入。時鐘信號是一個頻率穩定的數字信號,其頻率就是處理器的工作頻率,工作頻率的倒數就是時鐘周期的時間長度。

A19/S6~A16/S3:地址/狀態分時復用引腳,是一組4個具有三態能力的輸出信號。這些引腳在訪問存儲器的第一個時鐘周期輸出高4位地址A19~A16,在訪問外設的第一個時鐘周期輸出低電平無效;其他時間輸出狀態信號S6~S3。

AD15~AD0:地址/數據分時復用引腳,共16個引腳,用作地址總線時是單向輸出信號;用作數據總線時是雙向信號,具有三態輸出能力。ALE:地址鎖存允許,是一個三態、輸出、高電平有效的信號。有效時,表示復用引腳(AD15~AD0和A19/S6~A16/S3)上正在傳送地址信號。

:訪問存儲器或者I/O,是一個三態輸出信號,該引腳高電平時,表示處理器將訪問存儲器,此時地址總線A19~A0提供20位的存儲器物理地址。該引腳低電平時,表示處理器將訪問I/O端口,此時地址總線A15~A0提供16位的I/O地址。

:讀控制,也是一個三態、輸出低電平有效信號。有效時,表示處理器正在從存儲單元或I/O端口讀取數據。

:寫控制,是一個三態、輸出低電平有效信號。有效時,表示處理器正將數據寫到存儲單元或I/O端口。〔習題5.9〕

區別如下總線概念:芯片總線、局部總線、系統總線;并行總線、串行總線;地址總線、數據總線、控制總線;ISA總線、PCI總線。〔解答〕

芯片總線:是指大規模集成電路芯片內部,或系統中各種不同器件連接在一起的總線;用于芯片級互連。

局部總線:位于處理器附件的器件相互連接的總線,相對于芯片總線。系統總線:通常是指微機系統的主要總線。并行總線:采用并行傳輸方式的總線。

串行總線:將多位數據按二進制位的順序在數據線上逐位傳送的總線。地址總線:實現地址信息互連和交換的一組導線。數據總線:實現數據信息互連和交換的一組導線。

控制總線:控制協調處理器和內存、外設交互信息的一組導線。

ISA總線:即IBM PC/AT總線,以處理器80286引腳形成的總線,分成支持8位操作的前62信號和擴展16位操作的后36信號。

PCI總線:外設部件互連總線,不僅適用于IA-32處理器,也適用其它處理器,支持32位和64位操作,廣泛用于32位通用微型計算機中。〔習題5.10〕

什么是同步時序、半同步時序和異步時序? 〔解答〕

同步時序:總線操作的各個過程由共用的總線時鐘信號控制。半同步時序:總線操作仍由共用的總線時鐘信號控制,但慢速模塊可以通過等待信號讓快速模塊等待。

異步時序:總線操作需要握手(Handshake)聯絡(應答)信號控制,總線時鐘信號可有可無。

〔習題5.11〕

EISA總線的時鐘頻率是8MHz,每2個時鐘可以傳送一個32位數據,計算其總線帶寬。〔解答〕

(32×8)÷(2×8)=16MBps 〔習題5.12〕

PCI總線有什么特點? 〔解答〕

PCI總線與處理器無關,具有32位和64位數據總線,有+5V和+3.3V兩種設計,采用集中式總線仲裁、支持多處理器系統,通過橋(Bridge)電路兼容ISA/EISA總線,具有即插即用的自動配置能力等一系列優勢。〔習題5.13〕

PCI總線操作如何插入等待狀態? 〔解答〕

主設備利用IRDY#信號無效、從設備利用TRDY#信號無效要求對方等待,即插入等待狀態。〔習題5.14〕

什么是USB總線支持的“熱插拔”,這個特性有什么意義? 〔解答〕

“熱插拔”是在PC機正常工作狀態進行插入或拔出。這個特性可以使用戶隨時連接USB設備。

〔習題5.15〕

簡述USB總線的主要特征?

〔解答〕

使用方便、擴充能力強。

支持多種傳輸速度、適用面廣。低功耗、低成本、占用系統資源少。〔習題5.16〕

USB總線的集線器有什么作用?主機上是否需要集線器? 〔解答〕

集線器是專門用于提供額外USB接入點的USB設備。主機需要集線器,被稱為根集線器。〔習題5.17〕

USB總線協議支持哪幾種數據傳輸方式?簡述之。〔解答〕

USB的數據傳輸有4種:

控制傳輸――在USB設備初次安裝時,USB系統軟件使用控制傳輸方式設置USB設備參數、發送控制指令、查詢狀態等。批量傳輸――對于打印機、掃描儀等設備需要傳輸大量數據,可以使用批量傳輸方式連續傳輸一批數據。

中斷傳輸――該方式傳輸的數據量很小,但需要及時處理,以保證實時性,主要用于鍵盤、鼠標等設備上。

同步傳輸――該方式以穩定的速率發送和接收信息,保證數據的連續和及時,用于數據傳輸正確性要求不高而對實時性要求高的外設,例如麥克風、喇叭、電話等。第6章 存儲系統 〔習題6.1〕簡答題 〔解答〕

① 因為各種存儲器件在容量、速度和價格方面存在矛盾。速度快,則單位價格高;容量大,單位價格低,但存取速度慢。故存儲系統不能采用一種存儲器件。② Cache中復制著主存的部分內容。當處理器試圖讀取主存的某個字時,Cache控制器首先檢查Cache中是否已包含有這個字。若有,則處理器直接讀取Cache,這種情況稱為高速命中;若無,則稱為高速缺失。

③ 標簽存儲器保存著該數據所在主存的地址信息。④ 主存塊與Cache行之間的對應關系稱“地址映射”,Cache通過地址映射確定一個主存塊應放到哪個Cache行組中。

⑤ 寫入策略用于解決寫入Cache時引起主存和Cache內容不一致性的問題。

⑥ 存取時間是指從讀/寫命令發出,到數據傳輸操作完成所經歷的時間;存取周期表示兩次存儲器訪問所允許的最小時間間隔。存取周期大于等于存取時間。

⑦ 虛擬存儲器是由操作系統利用輔助存儲器、以磁盤文件形式建立的、在主存儲器與輔助存儲器之間的一個存儲器。⑧ DRAM芯片容量大、芯片小,高集成度,引腳數量少。故DRAM芯片將地址引腳分時復用,即用一組地址引腳傳送兩批地址。第一批地址稱行地址,第二批地址稱列地址。⑨ 譯碼電路中只有部分地址線參與譯碼會造成地址重復,也就是一個存儲單元占有多個存儲器地址。

⑩頁表項的P位稱為存在位(Present),表示該頁面是否在物理存儲器中。〔習題6.2〕判斷題。

〔解答〕

① 錯 ② 對 ③ 對 ④ 對 ⑤ 對 ⑥ 錯 ⑦ 錯 ⑧ 對 ⑨ 錯 ⑩ 對 〔習題6.3〕填空題

〔解答〕

① 8,1024,1024,1024,1024,240 ② 8KB,4 ③ 隨機存取存儲器,丟失,只讀存儲器,讀取,不會丟失 ④ 8,13,8 ⑤ 2 ⑥(UV-)EPROM,Flash Memory ⑦ 58000H,5FFFFH,32KB ⑧ 32,4,64,8 ⑨ 直接映射,組合相關映射,全相關映射,2路組合相關映射 ⑩ 00820000H,02000H 〔習題6.4〕

舉例說明存儲訪問的局部性原理。〔解答〕

處理器訪問存儲器時,無論是讀取指令還是存取數據,所訪問的存儲單元在一段時間內都趨向于一個較小的連續區域中,這就是存儲訪問的局部性原理。例如,求平均值的函數。long mean(long d[], long num){

long i,temp=0;

for(i=0;i

temp=temp/num;

return(temp);} 函數中的變量temp體現了時間局部,因為每次循環都要使用它。順序訪問數組d[]的各個元素(相鄰存放在主存),體現了空間局部。循環體內的指令順序存放,依次讀取執行體現了空間局部;同時重復執行循環體,又體現了時間局部。〔習題6.5〕

簡述存儲系統的層次結構及各層存儲部件特點。〔解答〕

為解決容量、速度和價格的矛盾,存儲系統采用金字塔型層次結構,單位價格和速度自上而下逐層減少,容量自上而下逐層增加。

存儲系統的各層存儲部件自上而下依次是:CPU寄存器、高速緩存、主存存儲器(RAM/ROM),輔助存儲器如磁盤、光盤等。CPU寄存器、高速緩存器集成在CPU芯片上,對用戶來說,是透明的,它們用于暫存主存和處理器交互的數據,以減少頻繁讀取主存而影響處理器速度;主存儲器則可和處理器直接交換數據,而輔助存儲器必須經過主存存儲器,才可與處理器進行數據交換。〔習題6.6〕

在半導體存儲器件中,什么是SRAM、DRAM和NVRAM? 〔解答〕

SRAM是靜態讀寫存儲器芯片,它以觸發器為基本存儲單元,以其兩種穩定狀態表示邏輯0和邏輯1。

DRAM是動態讀寫存儲器芯片,它以單個MOS管為基本存儲單元,以極間電容充放電表示兩種邏輯狀態,需要不斷刷新保持信息正確。NVRAM多指帶有后備電池的SRAM芯片,這種芯片采用CMOS制造工藝設計以減少用電。〔習題6.7〕

SRAM芯片的片選信號有什么用途?對應讀寫控制的信號是什么? 〔解答〕

片選信號 :片選有效時,才可以對該芯片進行讀/寫操作;無效時,數據引腳呈現高阻狀態、與系統數據總線隔離,并可降低內部功耗。

讀控制信號 :在芯片被選中的前提下,若 有效,則芯片將允許地址信號選擇的存儲單元內的數據輸出到數據引腳上。

寫控制信號 :在芯片被選中的前提下,若 有效,則芯片將數據引腳上的數據寫入地址信號選擇的存儲單元內。〔習題6.8〕

DRAM為什么要刷新,存儲系統如何進行刷新? 〔解答〕

DRAM以單個MOS管為基本存儲單元,以極間電容充放電表示兩種邏輯狀態。由于極間電容的容量很小,充電電荷自然泄漏會很快導致信息丟失,所以要不斷對它進行刷新操作、即讀取原內容、放大再寫入。

存儲系統的刷新控制電路提供刷新行地址,將存儲DRAM芯片中的某一行選中刷新。實際上,刷新控制電路是將刷新行地址同時送達存儲系統中所有DRAM芯片,所有DRAM芯片都在同時進行一行的刷新操作。刷新控制電路設置每次行地址增量,并在一定時間間隔內啟動一次刷新操作,就能夠保證所有DRAM芯片的所有存儲單元得到及時刷新。〔習題6.9〕

什么是掩摸ROM、OTP-ROM、EPROM、EEPROM和Flash ROM? 〔解答〕

掩膜ROM:通過掩膜工藝、將要保存的信息直接制作在芯片當中,以后再也不能更改。OTP-ROM:該類芯片出廠時存儲的信息為全“1”,允許用戶進行一次性編程,此后便不能更改。

EPROM:一般指可用紫外光擦除、并可重復編程的ROM。

EEPROM:也常表達為E2PROM,其擦除和編程(即擦寫)通過加電的方法來進行,可實現“在線編程”和“在應用編程”

Flash ROM:是一種新型的電擦除可編程ROM芯片,能夠很快擦除整個芯片內容。〔習題6.10〕

請給出教材圖6-7中138譯碼器的所有譯碼輸出引腳對應的地址范圍。〔解答〕

~ 的地址范圍依次是:

E0000H~E3FFFH,E4000H~E7FFFH,E8000H~EBFFFH,EC000H~EFFFFH,F0000H~F3FFFH,F4000H~F7FFFH,F8000H~FBFFFH,FC000H~FFFFFH。〔習題6.11〕

什么是存儲器芯片的全譯碼和部分譯碼?各有什么特點? 〔解答〕

全譯碼:使用全部系統地址總線進行譯碼。特點是地址唯一,一個存儲單元只對應一個存儲器地址(反之亦然),組成的存儲系統其地址空間連續。

部分譯碼:只使用部分系統地址總線進行譯碼。其特點:有一個沒有被使用的地址信號就有兩種編碼,這兩個編碼指向同一個存儲單元,出現地址重復。〔習題6.12〕

區別如下各個主存名稱的含義:常規主存,擴展主存,擴充主存;上位主存區UMA和上位主存塊UMB,高端主存區HMA,影子主存。〔解答〕

常規主存:8088和8086提供20個地址線A19~A0,尋址1MB的存貯空間,其中,最低640KB的系統RAM區被稱為常規主存或基本主存。

擴展主存:IA-32處理器在1MB之后的主存空間都作為RAM區域使用,被稱為擴展主存。擴充主存:處理器不可以直接訪問,利用“體交換技術”實現處理器訪問。上位主存區UMA:在常規主存其后384KB(A0000H~FFFFFH)主存稱為上位主存區UMA。上位主存塊UMB:上位主存區UMA沒有被使用部分,被開辟為上位主存塊UMB。

高端主存區HMA:在實方式下,通過控制A20開放,程序可以訪問的1MB之后的64KB區域。

影子主存:PC機啟動后可以將ROM-BIOS映射到RAM中,這部分用作ROM-BIOS、并被操作系統設置為只讀的RAM區域。〔習題6.13〕

開機后,微機系統常需要檢測主存儲器是否正常。例如,可以先向所有存儲單元寫入數據55H(或00H)、然后讀出看是否還是55H(或00H);接著再向所有存儲單元寫入數據AAH(或FFH)、然后讀出看是否還是AAH(或FFH)。利用兩個二進制各位互反的“花樣”數據的反復寫入、讀出和比較就能夠識別出有故障的存儲單元。利用獲得的有故障存儲單元所在的物理地址,如果能夠分析出該存儲單元所在的存儲器芯片,就可以實現芯片級的維修。試利用匯編語言編寫一個檢測常規主存最高64KB(邏輯地址從9000H∶0000H到9000H∶FFFFH)的程序,如果發現錯誤請顯示其邏輯地址。〔解答〕

;代碼段

mov ax,9000h mov ds,ax mov ah,55h;先用55H push ax again: mov bx,0 mov al,ah again1: mov [bx],al;寫入

dec bx jnz again1 again2: mov al,[bx];讀出

cmp al,ah;檢測

jz next2 dispcrlf push ax mov ax,ds call disphw;顯示段地址

mov al,':' call dispc mov ax,bx call disphw;顯示偏移地址

pop ax next2: dec bx jnz again2 pop ax cmp ah,0aah;后用0AAH jz done mov ah,0aah jmp again done: 〔習題6.14〕

什么是LRU替換算法?80486片內Cache中,如果3個替換算法位B2B1B0=010,則將替換哪個Cache行,并給出你的判斷過程。〔解答〕

LRU算法是近期最少使用、即選擇最長時間未被使用的數據塊進行替換的算法。

B0=0,說明最近訪問了L2/L3行,所以應該替換L0或L1行。B1=1,說明最近訪問了L0行,所以應該替換L1。因為LRU算法是選擇最長時間未被訪問的Cache行進行替換。〔習題6.15〕

高速緩沖存儲器Cache的寫入策略是解決什么問題的?有哪兩種寫入策略,各自的寫入策略是怎樣的? 〔解答〕

寫入策略用于在寫命中時Cache與主存內容保持一致。

直寫式寫入策略指處理器對Cache寫入的同時,將數據也寫入到主存,這樣來保證主存和Cache內容一致。它簡單可靠。

回寫Cache只有在行替換時才可能寫入主存,寫入主存的次數,會少于處理器實際執行的寫入操作數。回寫Cache的性能要高于直寫Cache,但實現結構略為復雜。〔習題6.16〕

80486片上8KB Cache的標簽存儲器為什么只需要21位? 〔解答〕

80486片上Cache共有8KB容量,采用4路組合地址映射方式。對于4GB容量的主存來說,以Cache路為單位,可以分成4GB÷2KB=232÷211=221個Cache路。這樣每個Cache行只要設計一個21位的標簽存儲器,記錄該Cache行映射到哪個主存的Cache路。再結合直接映射的組號就可以明確該Cache行對應哪個主存塊。〔習題6.17〕 高速緩存的寫入操作有幾個很近似的英文詞匯,它們分別表示什么含義?(1)Write Through(2)Write Back(3)Write Around(4)Fetch on Write 〔解答〕

(1)Write Through:寫命中時的直寫策略。(2)Write Back:寫命中時的回寫策略。

(3)Write Around:寫未命中時的不寫分配法,即繞寫法。(4)Fetch on Write:寫未命中時的寫分配法,即寫時取法。〔習題6.18〕

區別如下高速緩存中的概念:(1)主存數據塊Block(2)高速緩存行Line(3)高速緩存組Set(4)高速緩存路Way 〔解答〕

(1)主存數據塊Block:高速緩存與主存間的數據傳送以數據塊(Block)為單位,例如B個字。主存數據塊Block是主存中連續的B個字數據。

(2)高速緩存行Line:指高速緩存中包含B個字的一個單元。

(3)高速緩存組Set:組合相關映射將多個Cache行作為一個組(Set)。

(4)高速緩存路Way:組合相關映射將所有組中同位置Cache行稱為一路(Way)。〔習題6.19〕

什么是段選擇器、描述符、描述符表和描述符表寄存器? 〔解答〕

段選擇器:保護方式下的16位段寄存器就是段選擇器。

描述符:是保護方式引入的數據結構,有8個字節64位,具有段基地址、訪問權限、段界限等字段。IA-32處理器利用它來實現存儲管理、特權與保護。描述符表:描述符表是存放描述符的一個特殊區域段。描述符表寄存器:指明描述符表所在主存地址的寄存器。〔習題6.20〕

IA-32處理器在保護方式下,段寄存器是什么內容?若DS=78H,說明在保護方式其具體的含義。〔解答〕

段寄存器是段選擇器,包含3個域,指向一個段描述符。

DS=78H,說明當前數據段描述符是全局描述符表中的第0FH個描述符。本次訪問數據的特權級別為0,最高。〔習題6.21〕

采用4KB分頁,說明IA-32處理器將線性地址轉換為物理地址的過程。〔解答〕

通過2級查表來實現線性地址轉換為位物理地址。

(1)在CR3中包含著當前任務的頁目錄的起始地址,將其加上線性地址最高10位A31~A22確定的頁目錄項的偏移量,便訪問到指定的頁目錄項。(2)在此頁目錄項中包含著指向的頁表的起始地址,將其加上線性地址中間的10位A21~A12確定的頁表項的偏移量,便訪問到指定的頁表項。

(3)在此頁表項中包含著要訪問的頁面的起始地址,將其加上線性地址最低12位A11~A0的偏移量,就從這一頁中訪問到所尋址的物理單元。第7章 輸入輸出接口 〔習題7.1〕簡答題 〔解答〕

① 外部設備,在工作原理、驅動方式、信息格式、以及工作速度等方面彼此差別很大,與處理器的工作方式也大相徑庭。所以,外設不能像存儲器芯片那樣直接與處理器相連,必須經過一個中間電路。

② 數據緩沖用于匹配快速的處理器與相對慢速的外設或兩個功能部件速度不匹配的數據交換。

③ 處理器向接口芯片相應端口寫入特定的數據,用于選擇I/O芯片的工作方式或控制外設工作,該數據稱命令字或控制字。

④ PC機中CMOS RAM不屬于主存空間,CMOS RAM有64個字節容量,以8位I/O接口形式與處理器連接,通過兩個I/O地址訪問。

⑤ 在輸入接口中,為避免多個設備同時向總線發送數據,需要安排一個三態緩沖器。只有當處理器選通時,才允許被選中設備將數據送到系統總線,此時其他輸入設備與數據總線隔離。

⑥ 透明鎖存器的控制端為有效電平時,輸出隨輸入變化,常稱為直通或透明。非透明鎖存器不論其控制端為低或為高電平,輸出狀態都不隨輸入變化。

⑦ 如發光二極管、按鍵和開關等簡單設備,它們的工作方式十分簡單;相對處理器而言,其狀態很少發生變化或變化很慢。這些設備與處理器交換數據時,可采用無條件傳送。⑧ 在查詢程序中,當查詢超過了規定的時間,設備仍未就緒時,就引發超時錯誤。

⑨ 遠調用CALL指令利用直接或間接尋址調用另一個代碼段的子程序;INT n指令利用中斷向量表(地址表)的方法調用另一個代碼段的中斷服務程序,還有保存標志寄存器的功能。⑩ 外部中斷是由處理器外部提出中斷請求引起的程序中斷。相對于處理器來說,外部中斷是隨機產生的,所以是真正意義上的中斷。〔習題7.2〕判斷題 〔解答〕

① 對 ② 對 ③ 對 ④ 錯 ⑤ 錯 ⑥ 錯 ⑦ 對 ⑧ 錯 ⑨ 對 ⑩ 錯 〔習題7.3〕填空題 〔解答〕

① 數字量、開關量、脈沖量

② I/O獨立,輸入輸出(I/O)指令,直接尋址,DX寄存器間接尋址 ③ I/O端口(接口,外設),處理器(主機),I/O讀 ④ 寄存器,I/O地址的直接尋址 ⑤ I/O地址的間接尋址,寄存器

⑥ 直接存儲器存取,DMA請求,總線請求,總線響應,高阻,DMAC(DMA控制器)⑦ 除法錯,2 ⑧ 1,STI,CLI,0 ⑨ 1KB,20H,4,F010H∶2300H ⑩ IR3,IR3請求的 〔習題7.4〕

一般的I/O接口電路安排有哪三類寄存器?它們各自的作用是什么? 〔解答〕

① 數據寄存器

保存處理器與外設之間交換的數據。② 狀態寄存器

保存外設當前的工作狀態信息。處理器通過該寄存器掌握外設狀態,進行數據交換。③ 控制寄存器

保存處理器控制接口電路和外設操作的有關信息。處理器向控制寄存器寫入控制信息,選擇接口電路的不同工作方式和與外設交換數據形式。〔習題7.5〕

什么是I/O獨立編址和統一編址,各有什么特點? 〔解答〕

獨立編址是將I/O端口單獨編排地址,獨立于存儲器地址。

統一編址是將I/O端口與存儲器地址統一編排,共享一個地址空間。端口獨立編址方式,處理器除要具有存儲器訪問的指令和引腳外,還需要設計I/O訪問的I/O指令和I/O引腳,其優點是:不占用存儲器空間;I/O指令使程序中I/O操作一目了然;較小的I/O地址空間使地址譯碼簡單。但I/O指令功能簡單,尋址方式沒有存儲器指令豐富。統一編址方式,處理器不再區分I/O口訪問和存儲器訪問。其優點是:處理器不用設計I/O指令和引腳,豐富的存儲器訪問方法同樣能夠運用于I/O訪問。缺點是:I/O端口會占用存儲器的部分地址空間,通過指令不易辨認I/O操作。〔習題7.6〕

簡述主機與外設進行數據交換的幾種常用方式。〔解答〕

主機與外設進行數據交換的幾種常用方式:

① 無條件傳送方式,常用于簡單設備,處理器認為它們總是處于就緒狀態,隨時進行數據傳送。

② 程序查詢方式:處理器首先查詢外設工作狀態,在外設就緒時進行數據傳送。

③ 中斷方式:外設在準備就緒的條件下通過請求引腳信號,主動向處理器提出交換數據的請求。處理器無其他更緊迫任務,則執行中斷服務程序完成一次數據傳送。

④ DMA傳送: DMA控制器可接管總線,作為總線的主控設備,通過系統總線來控制存儲器和外設直接進行數據交換。此種方式適用于需要大量數據高速傳送的場合。〔習題7.7〕 參看圖7-5,編程實現以下功能:當K0鍵單獨按下時,發光二極管L0~L7將依次點亮(L0,L1,L2,??L7),每個維持200ms;當K1鍵單獨按下時,發光二極管L0~L7將反向依次點亮(L7,L6,L5,??L0),每個也維持200ms;在其他情況下各發光二極管均不點亮。假定有延時200ms的子程序DELAY可直接調用。〔解答〕

again: mov dx,8000h in al,dx cmp al,0feh;D7~D0=11111110B ?

jz next1;單獨按下K0,轉移到next1 cmp al,0fdh;D7~D0=11111101B ?

jz next2;單獨按下K1,轉移到next2 jmp again;其它情況不點亮 next1: mov cx,8 mov al,1;從K0開始

next11: out dx,al;某個LED電亮

call delay;延時200ms shl al,1;rol al,1 loop next11 jmp again next2: mov cx,8 mov al,80h;從K7開始 next21: out dx,al;某個LED電亮

call delay;延時200ms shr al,1;ror al,1 loop next21 jmp again 〔習題7.8〕

現有一個輸入設備,其數據端口地址為FFE0H,狀態端口地址為FFE2H。當狀態標志D0=1時,表明一個字節的輸入數據就緒。請編寫利用查詢方式進行數據傳送的程序段,要求從該設備讀取100個字節保存到BUFFER緩沖區。〔解答〕

mov bx, offset buffer mov cx,100 again: mov dx,0ffe2h status: in al,dx;查詢一次

test al,01h jz status mov dx,0ffe0h in al,dx;輸入一個字節

mov [bx],al inc bx loop again;循環,輸入100個字節 〔習題7.9〕

某個字符輸出設備,其數據端口和狀態端口的地址均為80H。在讀取狀態時,當標志位D7=0時,表明該設備閑,可以接收一個字符。請編寫利用查詢方式進行數據傳送的程序段,要求將存放于緩沖區ADDR處的一串字符(以0為結束標志)輸出給該設備。〔解答〕

mov bx,offset addr again: cmp byte ptr [bx],0 jz done status: in al,80h;查詢

test al,80h jnz status mov al,[bx] out 80h,al;輸出一個字節

inc bx jmp again;循環 done: 〔習題7.10〕

以可屏蔽中斷為例,說明一次完整的中斷過程主要包括哪些環節? 〔解答〕

中斷請求:外設通過硬件信號的形式、向處理器引腳發送有效請求信號。中斷響應:在滿足一定條件時,處理器進入中斷響應總線周期。關中斷:處理器在響應中斷后會自動關閉中斷。

斷點保護:處理器在響應中斷后將自動保護斷點地址。中斷源識別:處理器識別出當前究竟是哪個中斷源提出了請求,并明確與之相應的中斷服務程序所在主存位置。

現場保護:對處理器執行程序有影響的工作環境(主要是寄存器)進行保護。中斷服務:處理器執行相應的中斷服務程序,進行數據傳送等處理工作。恢復現場:完成中斷服務后,恢復處理器原來的工作環境。開中斷:處理器允許新的可屏蔽中斷。

中斷返回:處理器執行中斷返回指令,程序返回斷點繼續執行原來的程序。〔習題7.11〕

什么是中斷源?為什么要安排中斷優先級?什么是中斷嵌套?什么情況下程序會發生中斷嵌套? 〔解答〕

計算機系統中,凡是能引起中斷的事件或原因,被稱為中斷源。處理器隨時可能會收到多個中斷源提出的中斷請求,因此,為每個中斷源分配一級中斷優先權,根據它們的高低順序決定響應的先后。

一個中斷處理過程中又有一個中斷請求、并被響應處理,被稱為中斷嵌套。必須在中斷服務程序中打開中斷,程序才會發生中斷嵌套。〔習題7.12〕

明確如下中斷有關的概念:中斷源、中斷請求、中斷響應、關中斷、開中斷、中斷返回、中斷識別、中斷優先權、中斷嵌套、中斷處理、中斷服務。〔解答〕

中斷源:能引起中斷的事件或原因。

中斷請求:是外設通過硬件信號的形式、向處理器引腳發送有效請求信號。中斷響應:中斷響應是在滿足一定條件時,處理器進入中斷響應總線周期。關中斷:禁止處理器響應可屏蔽中斷。開中斷:允許處理器響應可屏蔽中斷。

中斷返回:處理器執行中斷返回指令,將斷點地址從堆棧中彈出,程序返回斷點繼續執行原來的程序。中斷識別:處理器識別出當前究竟是哪個中斷源提出了請求,并明確與之相應的中斷服務程序所在主存位置。中斷優先權:為每個中斷源分配一級中斷優先權,即系統設計者事先為每個中斷源確定處理器響應他們的先后順序。

中斷嵌套:在一個中斷處理過程中又有一個中斷請求被響應處理,稱為中斷嵌套。中斷處理:接到中斷請求信號后,隨之產生的整個工作過程,稱中斷處理。中斷服務:指處理器執行相應的中斷服務程序,進行數據傳送等處理工作。〔習題7.13〕

按照圖7-10所示的中斷查詢接口與相應的流程圖,編寫用于中斷服務的程序段。具體要求是,當程序查到中斷設備0有中斷請求(對應數據線D0),它將調用名為PROC0的子程序;如此,依次去查中斷設備1~中斷設備3,并分別調用名為PROC1~PROC3的子程序。〔解答〕

第二篇:微機原理與接口技術(錢曉捷版)課后習題答案

“微機原理與接口技術”習題解答 第1章 微型計算機系統 〔習題1.1〕簡答題 〔解答〕

① 處理器每個單位時間可以處理的二進制數據位數稱計算機字長。② 總線信號分成三組,分別是數據總線、地址總線和控制總線。③ PC機主存采用DRAM組成。

④ 高速緩沖存儲器Cache是處理器與主存之間速度很快但容量較小的存儲器。⑤ ROM-BIOS是“基本輸入輸出系統”,操作系統通過對BIOS的調用驅動各硬件設備,用戶也可以在應用程序中調用BIOS中的許多功能。

⑥ 中斷是CPU正常執行程序的流程被某種原因打斷、并暫時停止,轉向執行事先安排好的一段處理程序,待該處理程序結束后仍返回被中斷的指令繼續執行的過程。⑦ 主板芯片組是主板的核心部件,它提供主板上的關鍵邏輯電路。⑧ MASM是微軟開發的宏匯編程序。

⑨ 指令的處理過程。處理器的“取指—譯碼—執行周期” 是指處理器從主存儲器讀取指令(簡稱取指),翻譯指令代碼的功能(簡稱譯碼),然后執行指令所規定的操作(簡稱執行)的過程。⑩ 機器語言層,即指令集結構。

(學生很多認為是:匯編語言層。前4章主要涉及匯編語言,但本書還有很多處理器原理等內容)〔習題1.2〕判斷題

① 錯 ② 錯 ③ 對 ④ 錯 ⑤ 對

⑥ 錯 ⑦ 錯 ⑧ 對 ⑨ 錯 ⑩ 錯 〔

〔解答〕

① Central Processing Unit,中央處理單元,處理器 ② 1MB,4GB ③ 216,64KB ④ EXE,COM(BAT老師講的)⑤ Instruction Set Architecture ⑥ 目錄

⑦ MMX,SSE3 ⑧ 64 ⑨ IBM,DOS ⑩ PCI 〔習題1.4〕

說明微型計算機系統的硬件組成及各部分作用。〔解答〕

CPU:CPU也稱處理器,是微機的核心。它采用大規模集成電路芯片,芯片內集成了控制器、運算器和若干高速存儲單元(即寄存器)。處理器及其支持電路構成了微機系統的控制中心,對系統的各個部件進行統一的協調和控制。

存儲器:存儲器是存放程序和數據的部件。

外部設備:外部設備是指可與微機進行交互的輸入(Input)設備和輸出(Output)設備,也稱I/O設備。I/O設備通過I/O接口與主機連接。

總線:互連各個部件的共用通道,主要含數據總線、地址總線和控制總線信號。〔習題1.5〕

什么是通用微處理器、單片機(微控制器)、DSP芯片、嵌入式系統? 〔解答〕

通用微處理器:適合較廣的應用領域的微處理器,例如裝在PC機、筆記本電腦、工作站、服務器上的微處理器。單片機:是指通常用于控制領域的微處理器芯片,其內部除CPU外還集成了計算機的其他一些主要部件,只需配上少量的外部電路和設備,就可以構成具體的應用系統。

DSP芯片:稱數字信號處理器,也是一種微控制器,其更適合處理高速的數字信號,內部集成有高速乘法器,能夠進行快速乘法和加法運算。

嵌入式系統:利用微控制器、數字信號處理器或通用微處理器,結合具體應用構成的控制系統。〔習題1.6〕

綜述Intel 80x86系列處理器在指令集方面的發展。〔解答〕

8086奠定了基本的16位指令集,80286提供了保護方式的各種指令,80386將指令集全面提升為32位,80486融入了浮點數據處理指令,奔騰系列陸續增加了多媒體指令MMX、SSE、SSE2和SSE3,最新的奔騰4處理器還支持64位指令集。

題外話:大家可以通過閱讀相關資料、查詢互聯網獲得更加詳細的發展情況。可以考慮組織成一篇或多篇論文。〔習題1.7〕

區別如下概念:助記符、匯編語言、匯編語言程序和匯編程序。〔解答〕

助記符:人們采用便于記憶、并能描述指令功能的符號來表示機器指令操作碼,該符號稱為指令助記符。

匯編語言:用助記符表示的指令以及使用它們編寫程序的規則就形成匯編語言。匯編語言程序:用匯編語言書寫的程序就是匯編語言程序,或稱匯編語言源程序。

匯編程序:匯編語言源程序要翻譯成機器語言程序才可以由處理器執行。這個翻譯的過程稱為“匯編”,完成匯編工作的程序就是匯編程序(Assembler)。〔習題1.8〕

區別如下概念:路徑、絕對路徑、相對路徑、當前目錄。系統磁盤上存在某個可執行文件,但在DOS環境輸入其文件名卻提示沒有這個文件,是什么原因? 〔解答〕

路徑:操作系統以目錄形式管理磁盤上的文件,文件所在的分區和目錄就是該文件的路徑。絕對路徑:從根目錄到文件所在目錄的完整路徑稱為“絕對路徑”。是保證文件唯一性的標示方法。相對路徑:從系統當前目錄到文件所在目錄的路徑稱為相對路徑。當前目錄:用戶當前所在的目錄就是當前目錄。

指明的路徑不正確,或者執行了另外一個同名的文件。〔習題1.9〕

什么是摩爾定律?它能永久成立嗎? 〔解答〕

每18個月,集成電路的性能將提高一倍,而其價格將降低一半。(1965年,Intel公司的創始人之一摩爾預言:集成電路上的晶體管密度每年將翻倍。現在這個預言通常表達為:每隔18個月硅片密度(晶體管容量)將翻倍;也常被表達為:每18個月,集成電路的性能將提高一倍,而其價格將降低一半。)

不能。由于電子器件的物理極限在悄然逼近,摩爾定律不會永遠持續。〔習題1.10〕

馮·諾依曼計算機的基本設計思想是什么? 〔解答〕

采用二進制形式表示數據和指令。指令由操作碼和地址碼組成。

將程序和數據存放在存儲器中,計算機在工作時從存儲器取出指令加以執行,自動完成計算任務。這就是“存儲程序”和“程序控制”(簡稱存儲程序控制)的概念。

指令的執行是順序的,即一般按照指令在存儲器中存放的順序執行,程序分支由轉移指令實現。計算機由存儲器、運算器、控制器、輸入設備和輸出設備五大基本部件組成,并規定了5部分的基本功能。〔習題1.11〕

計算機系統通常劃分為哪幾個層次?普通計算機用戶和軟件開發人員對計算機系統的認識一樣嗎?

〔解答〕

最上層是用戶層。

第5層是高級語言層。第4層是匯編語言層。第3層是操作系統層。第2層是機器語言層。第1層是控制層。

第0層是數字電路層。

普通計算機用戶和軟件人員對計算機系統的認識并不一樣。普通計算機用戶看到的計算機,也就是我們最熟悉的計算機,屬于用戶層,而軟件人員看到的屬于高級語言層或是匯編語言層。〔習題1.12〕

什么是系列機和兼容機?你怎樣理解計算機中的“兼容”特性?例如,你可以用PC機為例,談談你對軟件兼容(或兼容性)的認識,說明為什么PC機具有如此強大的生命力? 〔解答〕

系列機是指在一個廠家生產的具有相同計算機結構,但具有不同組成和實現的一系列(Family)不同檔次、不同型號的機器。

兼容機是指不同廠家生產的具有相同計算機結構(不同的組成和實現)的計算機。

兼容是一個廣泛的概念,包括軟件兼容、硬件兼容、系統兼容等。其中軟件兼容是指同一個軟件可以不加修改地運行于體系結構相同的各檔機器,結果一樣但運行時間可能不同。軟件兼容可從機器性能和推出時間分成向上(向下)和向前(向后)兼容。例如32位PC機就陸續增加了對浮點處理指令、多媒體指令等的支持。在保證向后兼容的前提下,不斷改進其組成和實現,延續計算機結構的生命,才使得PC機具有如此強大的生命力。〔習題1.13〕

英特爾公司最新Intel 80x86處理器是什么?請通過查閱相關資料(如英特爾公司網站),說明其主要特點和采用的新技術。〔解答〕

酷睿2多核處理器。〔習題1.14〕

說明高級語言、匯編語言、機器語言三者的區別,談談你對匯編語言的認識。〔解答〕

高級語言與具體的計算機硬件無關,其表達方式接近于所描述的問題,易為人們接受和掌握,用高級語言編寫程序要比低級語言容易得多,并大大簡化了程序的編制和調試,使編程效率得到大幅度的提高。而匯編語言是為了便于理解與記憶,將機器指令用助記符代替而形成的一種語言。匯編語言的語句通常與機器指令對應,因此,匯編語言與具體的計算機有關,屬于低級語言。它比機器語言直觀,容易理解和記憶,用匯編語言編寫的程序也比機器語言易閱讀、易排錯。機器語言的每一條機器指令都是二進制形式的指令代碼,計算機硬件可以直接識別。高級語言程序通常也需要翻譯成匯編語言程序,再進一步翻譯成機器語言代碼。〔習題1.15〕

為了更好地進行編程實踐,請進入Windows操作系統下的控制臺環境(或MS-DOS模擬環境),練習常用命令。第2章 處理器結構 〔習題2.1〕簡答題 〔解答〕

① ALU是算術邏輯運算單元,負責處理器所能進行的各種運算,主要是算術運算和邏輯運算。② 取指是指從主存取出指令代碼通過總線傳輸到處理器內部指令寄存器的過程。8086分成總線接口單元和指令執行單元,可以獨立操作。在執行單元執行一條指令的同時,總線接口單元可以讀取下一條指令,等到執行時不需要進行取指了,所以稱為預取。

③ Pentium采用分離的Cache結構,一個用做指令Cache,一個用做數據Cache。④ 堆棧的存取原則是先進后出(也稱為后進先出)操作方式存取數據。

⑤ 標志寄存器主要保存反映指令執行結果和控制指令執行形式的有關狀態。⑥ 執行了一條加法指令后,發現ZF=1,表明運算結果為0。⑦ 沒有。

⑧ 匯編語言的標識符大小寫不敏感,即表示字母大小寫不同、但表示同一個符號。⑨ 不會。

⑩ 指令的操作數需要通過存儲器地址或I/O地址,才能查找到數據本身,故稱數據尋址方式。〔習題2.2〕判斷題

〔解答〕

① 錯 ② 對 ③ 對 ④ 對 ⑤ 錯 ⑥ 對 ⑦ 對 ⑧ 錯 ⑨ 對 ⑩ 對 〔習題2.3〕填空題

〔解答〕

① 32,DX,DH ② 16 ③ 段地址,偏移地址,EIP,IP ④ 00100110,0 ⑤ 73C00H,73800H ⑥ EBX,ECX,ESI,EDI,EBP,ESP ⑦ 實地址,64KB ⑧ ASM,目標模塊,FLAT ⑨ 立即數尋址、寄存器尋址和存儲器尋址 ⑩ DS,SS 〔習題2.4〕

處理器內部具有哪3個基本部分?8086分為哪兩大功能部件?其各自的主要功能是什么? 〔解答〕

處理器內部有ALU、寄存器和指令處理三個基本單元。8086有兩大功能部件:總線接口單元和執行單元。

總線接口單元:管理著8086與系統總線的接口,負責處理器對存儲器和外設進行訪問。8086所有對外操作必須通過BIU和這些總線進行。

執行單元EU:負責指令譯碼、數據運算和指令執行。〔習題2.5〕

8086怎樣實現了最簡單的指令流水線? 〔解答〕

8086中,指令的讀取是在BIU單元,而指令的執行是在EU單元。因為BIU和EU兩個單元相互獨立、分別完成各自操作,所以可以并行操作。也就是說,在EU單元對一個指令進行譯碼執行時,BIU單元可以同時對后續指令進行讀取;這就是最簡單的指令流水線技術。〔習題2.6〕

什么是標志?什么是IA-32處理器的狀態標志、控制標志和系統標志?說明狀態標志在標志寄存器EFLAGS的位置和含義。〔解答〕

標志:用于反映指令執行結果或控制指令執行形式的一個或多個二進制數位。例如,有些指令執行后會影響有關標志位;有些指令的執行要利用相關標志。狀態標志:用來記錄程序運行結果的狀態信息。控制標志:DF標志,控制字符串操作的地址方向。系統標志:用于控制處理器執行指令的方式。

狀態標志在標志寄存器EFLAGS中的位置和含義如下:

11 10 9 8 7 6 5 4 3 2 1 0 ?? OF

SF ZF AF PF CF

〔習題2.7〕

舉例說明CF和OF標志的差異。〔解答〕

進位標志CF表示無符號數運算結果是否超出范圍,超出范圍后加上進位或借位,運算結果仍然正確;溢出標志OF表示有符號數運算結果是否超出范圍,如果超出范圍,運算結果已經不正確。例1:3AH + 7CH=B6H 無符號數運算:58+124=182,范圍內,無進位。有符號數運算:58+124=182,范圍外,有溢出。例2:AAH + 7CH=①26H 無符號數運算:170+124=294,范圍外,有進位。有符號數運算:-86+124=28,范圍內,無溢出。〔習題2.8〕

什么是8086中的邏輯地址和物理地址?邏輯地址如何轉換成物理地址?請將如下邏輯地址用物理地址表達(均為十六進制形式):

① FFFF∶0

② 40∶17

③ 2000∶4500

④ B821∶4567 〔解答〕

物理地址:在處理器地址總線上輸出的地址稱為物理地址。每個存儲單元有一個唯一的物理地址。邏輯地址:在處理器內部、程序員編程時采用邏輯地址,采用“段地址:偏移地址“形式。某個存儲單元可以有多個邏輯地址,即處于不同起點的邏輯段中,但其物理地址是唯一的。邏輯地址轉換成物理地址:邏輯地址由處理器在輸出之前轉換為物理地址。將邏輯地址中的段地址左移二進制4位(對應16進制是一位,即乘以16),加上偏移地址就得到20位物理地址。① FFFFH:0=FFFF0H ② 40H:17H=00417H ③ 2000H:4500H=24500H ④ B821H:4567H=BC777H 〔習題2.9〕

IA-32處理器有哪三類基本段,各是什么用途? 〔解答〕

IA-32處理器有代碼段、數據段、堆棧段三類基本段。

代碼段:存放程序的指令代碼。程序的指令代碼必須安排在代碼段,否則將無法正常執行。

數據段:存放當前運行程序所用的數據。程序中的數據默認是存放在數據段,也可以存放在其他邏輯段中。

堆棧段:主存中堆棧所在的區域。程序使用的堆棧一定在堆棧段。〔習題2.10〕

什么是平展存儲模型、段式存儲模型和實地址存儲模型? 〔解答〕

平展存儲模型下,對程序來說存儲器是一個連續的地址空間,稱為線性地址空間。程序需要的代碼、數據和堆棧都包含在這個地址空間中。

段式存儲模型下,對程序來說存儲器由一組獨立的地址空間組成,獨立的地址空間稱為段。通常,代碼、數據和堆棧位于分開的段中。

實地址存儲模型是8086處理器的存儲模型。它是段式存儲模型的特例,其線性地址空間最大為1MB容量,由最大為64KB的多個段組成。〔習題2.11〕

什么是實地址方式、保護方式和虛擬8086方式?它們分別使用什么存儲模型? 〔解答〕

實地址方式:與8086具有相同的基本結構,只能尋址1MB物理存儲器空間,邏輯段最大不超過64KB;但可以使用32位寄存器、32位操作數和32位尋址方式;相當于可以進行32位處理的快速8086。實地址工作方式只能支持實地址存儲模型。

保護方式:具有強大的段頁式存儲管理和特權與保護能力,使用全部32條地址總線,可尋址4GB物理存儲器。保護方式通過描述符實現分段存儲管理,每個邏輯段可達4GB。處理器工作在保護方式時,可以使用平展或段式存儲模型。

虛擬8086方式:在保護方式下運行的類似實方式的運行環境,只能在1MB存儲空間下使用“16位段”。處理器工作在虛擬8086方式時,只能使用實地址存儲模型。〔習題2.12〕

匯編語句有哪兩種,每個語句由哪4個部分組成? 〔解答〕

匯編語句有兩種:執行性語句(處理器指令)、說明性語句(偽指令)。每個語句有:標號、指令助記符、操作數或參數、注釋4個部分組成。〔習題2.13〕

匯編語言程序的開發有哪4個步驟,分別利用什么程序完成、產生什么輸出文件。〔解答〕

匯編語言程序的開發有4個步驟:

編輯:用文本編輯器形成一個以ASM為擴展名的源程序文件。匯編:用匯編程序將ASM文件轉換為OBJ模塊文件。

連接:用連接程序將一個或多個目標文件鏈接成一個EXE或COM可執行文件。調試:用調試程序排除錯誤,生成正確的可執行文件。〔習題2.14〕

MASM匯編語言中,下面哪些是程序員可以使用的正確的標識符。FFH,DS,0xvab,Again,next,@data,h_ascii,6364b,.exit,small 〔解答〕

FFH,Again,next,h_ascii 〔習題2.15〕

給出IA-32處理器的32位尋址方式和16位尋址方式的組成公式,并說明各部分作用。〔解答〕

① 32位存儲器尋址方式的組成公式

32位有效地址 = 基址寄存器+(變址寄存器×比例)+位移量 其中的4個組成部分是:

·基址寄存器任何8個32位通用寄存器之一;

·變址寄存器除ESP之外的任何32位通用寄存器之一;

·比例可以是1,2,4或8(因為操作數的長度可以是1,2,4或8字節); ·位移量可以是8或32位有符號值。② 16位存儲器尋址方式的組成公式

16位有效地址 = 基址寄存器+變址寄存器+位移量

其中基址寄存器只能是BX或BP,變址寄存器只能是SI或DI,位移量是8或16位有符號值。〔習題2.16〕

說明下列指令中源操作數的尋址方式?假設VARD是一個雙字變量。(1)mov edx,1234h(2)mov edx,vard(3)mov edx,ebx(4)mov edx,[ebx](5)mov edx,[ebx+1234h](6)mov edx,vard[ebx](7)mov edx,[ebx+edi](8)mov edx,[ebx+edi+1234h](9)mov edx,vard[esi+edi](10)mov edx,[ebp*4] 〔解答〕 ① 立即數 ② 直接 ③ 寄存器

④ 寄存器間接 ⑤ 寄存器相對 ⑥ 寄存器相對 ⑦ 基址變址

⑧ 相對基址變址 ⑨ 相對基址變址 ⑩ 帶比例尋址 〔習題2.17〕

使用本書配套的軟件包(或者按照本書說明)創建MASM開發環境,通過編輯例題2-1和例題2-2程序、匯編連接生成可執行程序和列表文件,掌握匯編語言的開發。第3章 數據處理 〔習題3.1〕簡答題 〔解答〕

① 沒有。使用二進制8位表達無符號整數,257沒有對應的編碼。② 字符“'F'”的ASCII碼就是數值46H,所以沒有區別。

③ 匯編程序在匯編過程中對數值表達式計算,得到一個確定的數值,故稱數值表達式為常量。

④ 不能。數值500大于一個字節所能表達的數據量,所以不能為字節變量賦值。⑤ 源、目標寄存器位數不同,不能用該指令進行數據交換。⑥ 前者在指令執行時獲得偏移地址,是正確的;但后者的OFFSET只能在匯編階段獲得偏移地址,但此時寄存器內容是不可知的,所以無法獲得偏移地址。

⑦ INC,DEC,NEG和NOT指令的操作數既是源操作數也是目的操作數。⑧ 大小寫字母轉換利用它們的ASCII碼相差20H。⑨ 加減法不區別無符號數和有符號數,但根據運算結果分別設置標志寄存器的CF和OF標志,可利用CF和OF進行區別。

⑩ 邏輯與運算規則類似二進制的乘法,所以稱其為邏輯乘。〔習題3.2〕判斷題

〔解答〕

① 對 ② 對 ③ 對 ④ 錯 ⑤ 錯

⑥ 對 ⑦ 錯 ⑧ 錯 ⑨ 對 ⑩ 對 〔習題3.3〕填空題 〔解答〕

① BYTE,OFFSET ② 97,61,小寫字母a ③ 0DH(13),0AH(10)④ 8843H ⑤ DWORD,4,WORD PTR XYZ ⑥ 3 ⑦ 78894111 ⑧ 0,0,0 ⑨ ***2H,83H ⑩ 4 〔習題3.4〕

下列十六進制數表示無符號整數,請轉換為十進制形式的真值: ① FFH

② 0H

③ 5EH

④ EFH 〔解答〕 ① 255 ② 0 ③ 94 ④ 239 〔習題3.5〕

將下列十進制數真值轉換為壓縮BCD碼: ① 12

② 24

③ 68

④ 99 〔解答〕 ① 12H ② 24H ③ 68H ④ 99H 〔習題3.6〕

將下列壓縮BCD碼轉換為十進制數:

① 10010001

② 10001001

③ 00110110

④ 10010000 〔解答〕 ① 91 ② 89 ③ 36 ④ 90 〔習題3.7〕

將下列十進制數用8位二進制補碼表示: ① 0

② 127

③-127

④ -57 〔解答〕 ① 00000000 ② 01111111 ③ 10000001 ④ 11000111 〔習題3.8〕

進行十六進制數據的加減運算,并說明是否有進位或借位: ① 1234H+7802H ② F034H+5AB0H ③ C051H-1234H ④ 9876H-ABCDH 〔解答〕

① 1234H+7802H=8A36H,無進位 ② F034H+5AB0H=4AF4H,有進位 ③ C051H-1234H=BE1DH,無借位 ④ 9876H-ABCDH=ECA9H,有借位 〔習題3.9〕

數碼0~

9、大寫字母A~Z、小寫字母a~z對應的ASCII碼分別是多少?ASCII碼0DH和0AH分別對應什么字符? 〔解答〕

數碼0~9對應的ASCII碼依次是30H~39H。

大寫字母A~Z對應的ASCII碼依次是:41H~5AH。小寫字母a~z對應的ASCII碼依次是:61~7AH。ASCII碼0DH和0AH分別對應的是回車和換行字符。〔習題3.10〕

設置一個數據段,按照如下要求定義變量或符號常量: ① my1b為字符串變量:Personal Computer ② my2b為用十進制數表示的字節變量:20 ③ my3b為用十六進制數表示的字節變量:20 ④ my4b為用二進制數表示的字節變量:20 ⑤ my5w為20個未賦值的字變量 ⑥ my6c為100的常量

⑦ my7c表示字符串:Personal Computer 〔解答〕

my1b byte 'Personal Computer' my2b byte 20 my3b byte 14h my4b byte 00010100b my5w word 20 dup(?)my6c = 100 my7c equ

〔習題3.11〕

定義常量NUM,其值為5;數據段中定義字數組變量DATALIST,它的頭5個字單元中依次存放-10,2,5和4,最后1個單元初值不定。〔解答〕 num equ 5 datalist byte-10,2,5,4,? 〔習題3.12〕

從低地址開始以字節為單位,用十六進制形式給出下列語句依次分配的數值:

byte 'ABC',10,10h,'EF',3 dup(-1,?,3 dup(4))word 10h,-5,3 dup(?)〔解答〕

0A 10 45 46 FF 00 04 04 04 FF 00 04 04 04 FF 00 04 04 04 10 00 FB FF 00 00 00 00 00 00 〔習題3.13〕

設在某個程序中有如下片段,請寫出每條傳送指令執行后寄存器EAX的內容:

;數據段

org 100h varw word 1234h,5678h varb byte 3,4 vard dword 12345678h buff byte 10 dup(?)mess byte 'hello';代碼段 mov eax,offset mess mov eax,type buff+type mess+type vard mov eax,sizeof varw+sizeof buff+sizeof mess mov eax,lengthof varw+lengthof vard 〔解答〕

EAX=0114H ②

EAX=0006H ③

EAX=0013H ④

EAX=0003H 〔習題3.14〕

按照如下輸出格式,在屏幕上顯示ASCII表:

| 0 1 2 3 4 5 6 7 8 9 A B C D E F---+-20 |

!“ #...30 | 0 1 2 3...40 | @ A B C...50 | P Q R S...60 | ‘ a b c...70 | p q r s...表格最上一行的數字是對應列ASCII代碼值的低4位(用十六進制形式),而表格左邊的數字對應行ASCII代碼值的高4位(用十六進制形式)。編程在數據段直接構造這樣的表格、填寫相應ASCII代碼值(不是字符本身),然后使用字符串顯示子程序DISPMSG實現顯示。〔解答〕

include io32.inc.data table byte '

|0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 byte '20 |',20h,20h,21h,20h,22h,20h,23h,20h,24h,20h,25h,20h,26h,20h,27h,20h,28h,20h,29h,20h byte 2ah,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,20h,39h,20h byte 3ah,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,20h,49h,20h byte 4ah,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,20h,59h,20h byte 5ah,20h,5bh,20h,5ch,20h,5dh,20h,5eh,20h,5fh,20h,13,10 byte '60 |',60h,20h,61h,20h,62h,20h,63h,20h,64h,20h,65h,20h,66h,20h,67h,20h,68h,20h,69h,20h byte 6ah,20h,6bh,20h,6ch,20h,6dh,20h,6eh,20h,6fh,20h,13,10 byte '70 |',70h,20h,71h,20h,72h,20h,73h,20h,74h,20h,75h,20h,76h,20h,77h,20h,78h,20h,79h,20h byte 7ah,20h,7bh,20h,7ch,20h,7dh,20h,7eh,20h,7fh,20h,13,10 byte 0.code start: mov eax,offset table call dispmsg exit 0 end start 〔習題3.15〕

數據段有如下定義,IA-32處理器將以小端方式保存在主存: var dword 12345678h 現以字節為單位按地址從低到高的順序,寫出這個變量內容。并說明如下指令的執行結果:

mov eax,var;EAX=__________ mov bx,var;BX=__________ mov cx,var+2;CX=__________ mov dl,var;DL=__________ mov dh,var+3;DH=__________ 可以編程使用十六進制字節顯示子程序DSIPHB順序顯示各個字節進行驗證,還可以使用十六進制雙字顯示子程序DSIPHD顯示該數據進行對比。〔解答〕

小端方式采用“低對低、高對高”,即低字節數據存放在低地址存儲單元、高字節數據存放在高地址存儲單元。以字節為單位按地址從低到高的順序,var變量的內容:78H、56H、34H、12H。

;EAX=12345678H;BX=5678H;CX=1234H;DL=78H;DH=12H 〔習題3.16〕

使用若干MOV指令實現交互指令“XCHG EBX,[EDI]”功能。〔解答〕

push eax;可以沒有

mov eax,ebx mov ebx,[edi] mov [edi],eax pop eax;可以沒有 〔習題3.17〕

假設當前ESP=0012FFB0H,說明下面每條指令后,ESP等于多少?

push eax push dx push dword ptr 0f79h pop eax pop word ptr [bx] pop ebx 〔解答〕

ESP=0012FFACH ESP=0012FFAAH ESP=0012FFA6H ESP=0012FFAAH ESP=0012FFACH ESP=0012FFB0H 〔習題3.18〕

已知數字0~9對應的格雷碼依次為:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H;請為如下程序的每條指令加上注釋,說明每條指令的功能和執行結果。

;數據段

table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;代碼段

mov ebx,offset table mov al,8 xlat 為了驗證你的判斷,不妨使用本書的I/O子程序庫提供的子程序DISPHB顯示換碼后AL的值。如果不使用XLAT指令,應如何修改? 〔解答〕

;數據段

table byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h;定義格雷碼表

;代碼段

mov ebx,offset table;EBX=格雷碼表首地址

mov al,8;AL=8 xlat;AL=12H(8的格雷碼)不使用XLAT指令:

mov ebx,offset table;EBX=格雷碼表首地址

mov eax,0 mov al,8;AL=8 mov al,[eax+ebx];AL=12H(8的格雷碼)〔習題3.19〕

請分別用一條匯編語言指令完成如下功能:

(1)把EBX寄存器和EDX寄存器的內容相加,結果存入EDX寄存器。

(2)用寄存器EBX和ESI的基址變址尋址方式把存儲器的一個字節與AL寄存器的內容相加,并把結果送到AL中。

(3)用EBX和位移量0B2H的寄存器相對尋址方式把存儲器中的一個雙字和ECX寄存器的內容相加,并把結果送回存儲器中。

(4)將32位變量VARD與數3412H相加,并把結果送回該存儲單元中。(5)把數0A0H與EAX寄存器的內容相加,并把結果送回EAX中。〔解答〕

① add edx,ebx ② add al,[ebx+esi] ③ add [bx+0b2h],cx ④ add varw,3412h ⑤ add eax,0a0h 〔習題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的進位含義:256+44=300)(4)

mov al,7fh;AL=7FH sub al,8;AL=77H,CF=0,SF=0 sub al,80h;AL=F7H,CF=1,OF=1 sbb al,3;AL=F3H,CF=0,ZF=0 〔習題3.21〕

給出下列各條指令執行后AL值,以及CF、ZF、SF、OF和PF的狀態:

mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al 〔解答〕

mov al,89h;AL=89H CF ZF SF OF PF add al,al;AL=12H 1 0 0 1 1 add al,9dh;AL=0AFH 0 0 1 0 1 cmp al,0bch;AL=0AFH 1 0 1 0 1 sub al,al;AL=00H 0 1 0 0 1 dec al;AL=0FFH 0 0 1 0 1 inc al;AL=00H 0 1 0 0 1 〔習題3.22〕

有兩個64位無符號整數存放在變量buffer1和buffer2中,定義數據、編寫代碼完成EDX.EAX←buffer1-buffer2功能。〔解答〕

;數據段

buffer1 qword 67883000h buffer2 qword 67762000h;代碼段

mov eax,dword ptr buffer1 mov edx,dword ptr buffer1+4 sub eax,dword ptr buffer2 sbb edx,dword ptr buffer2+4 〔習題3.23〕

分別執行如下程序片斷,說明每條指令的執行結果: 〔解答〕(1)

;ESI=9CH;ESI=80H;ESI=FFH;ESI=01H(2)

;EAX=1010B(可以有前導0,下同)

;EAX=0010B,CF=1;EAX=0100B,CF=0;EAX=0000B,CF=0(3)

;EAX=1011B(可以有前導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 〔習題3.24〕

3.24 給出下列各條指令執行后AX的結果,以及狀態標志CF、OF、SF、ZF、PF的狀態。

mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax test ax,0f0f0h 〔解答〕

mov ax,1470h;AX=1470H CF OF SF ZF PF and ax,ax;AX=1470H 0 0 0 0 0 or ax,ax;AX=1470H 0 0 0 0 0 xor ax,ax;AX=0000H 0 0 0 1 1 not ax;AX=FFFFH 0 0 0 1 1 test ax,0f0f0h;AX=0F0F0H 0 0 1 0 1 〔習題3.25〕

邏輯運算指令怎么實現復位、置位和求反功能? 〔解答〕

AND指令同“0”與實現復位,OR指令同“1”或實現置位,XOR同“1”異或實現求反。〔習題3.26〕

說明如下程序段的功能:

mov ecx,16 mov bx,ax next: shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx 〔解答〕

將AX的每一位依次重復一次,所得的32位結果保存于EAX中。〔習題3.27〕

編程將一個64位數據邏輯左移3位,假設這個數據已經保存在EDX.EAX寄存器對中。〔解答〕

;代碼段

mov ecx,3 again: shl eax,1 rcl edx,1 loop again 〔習題3.28〕

編程將一個壓縮BCD碼變量(例如92H)轉換為對應的ASCII碼,然后調用DISPC子程序(在輸入輸出子程序庫中)顯示。〔解答〕

;數據段 bcd byte 92h;代碼段

mov al,bcd shr al,4 add al,30h call dispc mov al,bcd and al,0fh add al,30h call dispc 〔習題3.29〕

以MOVS指令為例,說明串操作指令的尋址特點,并用MOV和ADD等指令實現MOVSD的功能(假設DF=0)。〔解答〕

MOVS指令的功能是:

ES:[EDI]←DS:[ESI];ESI←ESI±1/2/4,EDI←EDI±1/2/4 由此可看出串操作指令的尋址特點:

源操作數用寄存器ESI間接尋址,默認在DS指向的數據段,但可以改變;目的操作數用寄存器EDI間接尋址,只能在ES指向的附加數據段;每執行一次串操作,源指針ESI和目的指針EDI將自動修改:±1(字節),±2(字)或±4(雙字)。指針的增量和減量控制由DF標志確定,DF=0,進行增量;DF=1,進行減量。

push eax mov eax,[esi] mov es:[edi],eax add esi,4 add edi,4 〔習題3.30〕

說明如下程序執行后的顯示結果:

;數據段

msg byte 'WELLDONE',0;代碼段

mov ecx,(lengthof msg)-1 mov ebx,offset msg again: mov al,[ebx] add al,20h mov [ebx],al add ebx,1 loop again mov eax,offset msg call dispmsg 如果將其中語句“mov ebx,offset msg”改為“xor ebx,ebx”,則利用EBX間接尋址的兩個語句如何修改成EBX寄存器相對尋址,就可以實現同樣功能? 〔解答〕

顯示結果:welldone EBX寄存器相對尋址:

mov al,msg[ebx] mov msg[ebx],al 〔習題3.31〕 下面程序的功能是將數組ARRAY1的每個元素加固定值(8000H),將和保存在數組ARRAY2。在空白處填入適當的語句或語句的一部分。

;數據段

array1 dword 1,2,3,4,5,6,7,8,9,10 array2 dword 10 dup(?);代碼段

mov ecx,lengthof array1 mov ebx,0 again: mov eax,array1[ebx*4] add eax,8000h mov ______________ add ebx,__________ loop again 〔解答〕

mov array2[ebx*4],eax add ebx,1 〔習題3.32〕

上機實現本章的例題程序,編程實現本章的習題程序。第4章 匯編語言程序設計 〔習題4.1〕簡答題 〔解答〕

① 當同一個程序被操作系統安排到不同的存儲區域執行時,指令間的位移沒有改變,目標地址采用相對尋址可方便操作系統的靈活調度。

② 數據通信時,數據的某一位用做傳輸數據的奇偶校驗位,數據中包括校驗位在內的“1”的個數恒為奇數,就是奇校驗;恒為偶數,就是偶校驗。

③ 無符號數和有符號數的操作影響兩組不同的標志狀態位,故判斷兩個無符號數和有符號數的大小關系要利用不同的標志位組合,所以有對應的兩組指令。

④ 雙分支結構中兩個分支體之間的JMP指令,用于實現結束前一個分支回到共同的出口作用。⑤ 完整的子程序注釋可方便程序員調用該子程序,子程序注釋包括子程序名、子程序功能、入口參數和出口參數、調用注意事項和其他說明等。

⑥ 子程序保持堆棧平衡,才能保證執行RET指令時當前棧頂的內容是正確的返回地址。主程序也要保持堆棧平衡,這樣才能釋放傳遞參數占用的堆棧空間,否則多次調用該子程序可能就致使堆棧溢出。

⑦ “傳值”是傳遞參數的一個拷貝,被調用程序改變這個參數不影響調用程序;“傳址”時,被調用程序可能修改通過地址引用的變量內容。

⑧ INCLUDE語句包含的是文本文件、是源程序文件的一部分;INCLUDELIB語句包含的是子程序庫文件。⑨ 取長補短。

⑩ Windows程序在運行時需要加載其配套的動態鏈接庫DLL文件,當其沒有被搜索到時就會提示不存在。

〔習題4.2〕判斷題 〔解答〕

① 對 ② 錯 ③ 錯 ④ 錯 ⑤ 錯 ⑥ 對 ⑦ 對 ⑧ 錯 ⑨ 對 ⑩ 錯 〔習題4.3〕填空題 〔解答〕

① 相對尋址,間接尋址,直接尋址,間接尋址 ② 1256H,3280H ③ 3721H,1 ④ EAH ⑤ 循環初始,循環控制 ⑥ REPT1標號的地址 ⑦ TEST ENDP,ENDM ⑧ EBP ⑨ PUBLIC,EXTERN ⑩ 38H 0DH 0AH 〔習題4.4〕

為了驗證例題4-1程序的執行路徑,可以在每個標號前后增加顯示功能。例如使得程序運行后顯示數碼1234。〔解答〕

jmp labl1;相對尋址

nop mov eax,'?' call dispc labl1: mov eax,'1' call dispc jmp near ptr labl2;相對近轉移

nop mov eax,'?' call dispc labl2: mov eax,'2' call dispc mov eax,offset labl3

jmp eax;寄存器間接尋址

nop mov eax,'?' call dispc labl3: mov eax,'3' call dispc mov eax,offset labl4 mov nvar,eax jmp nvar;存儲器間接尋址

nop mov eax,'?' call dispc labl4: mov eax,'4' call dispc 〔習題4.5〕

使用“SHR EAX,2”將EAX中的D1位移入CF標志,然后用JC/JNC指令替代JZ/JNZ指令完成例題4-3的功能。〔解答〕

mov eax,56h;假設一個數據

shr eax,2;D1位移入CF標志

jnc nom;D1=0條件成立,轉移

...;余同原程序 〔習題4.6〕 執行如下程序片斷后,CMP指令分別使得5個狀態標志CF、ZF、SF、OF和PF為0還是為1?它會使得哪些條件轉移指令指令Jcc的條件成立、發生轉移?

mov eax,20h cmp eax,80h 〔解答〕

CF=1 ZF=0 SF=1 OF=0 PF=1 可以使得條件成立、發生轉移的指令有:JC JS JP JNZ JNO 〔習題4.7〕

將例題4-4程序修改為實現偶校驗。建議進一步增加顯示有關提示信息的功能,使得程序具有更加良好的交互性。〔解答〕

include io32.inc.data msg1 byte 'Please input a character: ',0 msg2 byte 'The ASCII code of the charater you entered is: ',0 msg3 byte 'The code with even parity is: ',0.code start: mov eax,offset msg1 call dispmsg call readc call dispcrlf mov ebx,eax mov eax,offset msg2 call dispmsg mov eax,ebx call dispbb call dispcrlf and al,7fh jp next or al,80h next: mov ebx,eax mov eax,offset msg3 call dispmsg mov eax,ebx call dispbb exit 0 end start 〔習題4.8〕

在采用奇偶校驗傳輸數據的接收端應該驗證數據傳輸的正確性。例如,如果采用偶校驗,那么在接收到的數據中,其包含“1”的個數應該為0或偶數個,否則說明出現傳輸錯誤。現在,在接收端編寫一個這樣的程序,如果偶校驗不正確顯示錯誤信息,傳輸正確則繼續。假設傳送字節數據、最高位作為校驗位,接收到的數據已經保存在Rdata變量中。〔解答〕

;數據段 Rdata byte 57h;保存接收的數據 error byte 'Error!',0;代碼段 mov al,Rdata and al,0ffh;標志PF反映“1”的個數

jp done;個數為偶數,正確繼續

mov eax,offset error;個數為奇數,顯示出錯

call dispmsg done:

〔習題4.9〕

指令CDQ將EAX符號擴展到EDX,即:EAX最高為0,則EDX=0;EAX最高為1,則EDX=FFFFFFFFH。請編程實現該指令功能。〔解答1〕

test eax,8000h;測試最高位

jz next1;最高位為0(ZF=1),轉移到標號NEXT1 mov edx,0ffffffffh;最高位為1,順序執行:設置EDX=FFFFFFFFH jmp done;無條件轉移,跳過另一個分支

next1: mov dx,0;最高位為0轉移到此執行:設置EDX=0 done: 〔解答2〕

使用移位指令更好。

rol eax,1 rcr edx,1 sar edx,31 ror eax,1 〔習題4.10〕

編程,首先測試雙字變量DVAR的最高位,如果為1,則顯示字母“L”;如果最高位不為1,則繼續測試最低位,如果最低位為1,則顯示字母“R”;如果最低位也不為1,則顯示字母“M”。〔解答〕

;數據段 dvar dword 57h;代碼段

mov eax,dvar test eax,80000000h jnz nextl test eax,1 jnz nextr mov al,'M' jmp done nextl: mov al,'L' jmp done nextr: mov al,'R' done: call dispc 〔習題4.11〕編寫一個程序,先提示輸入數字“Input Number:0~9”,然后在下一行顯示輸入的數字,結束;如果不是鍵入了0~9數字,就提示錯誤“Error!”,繼續等待輸入數字。〔解答〕

;數據段

inmsg byte 'Input number(0~9): ',0 ermsg byte 0dh,0ah,'Error!Input again: ',0;代碼段

mov eax,offset inmsg;提示輸入數字 call dispmsg again: call readc;等待按鍵

cmp al,'0';數字 < 0?

jb erdisp cmp al,'9';數字 > 9?

ja erdisp call dispcrlf call dispc jmp done erdisp: mov eax,offset ermsg call dispmsg jmp again done:

〔習題4.12〕

有一個首地址為ARRAY的20個雙字的數組,說明下列程序段的功能。

mov ecx,20 mov eax,0 mov esi,eax sumlp: add eax,array[esi] add esi,4 loop sumlp mov total,eax 〔解答〕

求這20個雙字的和,保存在TOTAL變量,不關進心進位和溢出。〔習題4.13〕

編程中經常要記錄某個字符出現的次數。現編程記錄某個字符串中空格出現的次數,結果保存在SPACE單元。〔解答〕

;數據段

string byte 'Do you have fun with Assembly ?',0;以0結尾的字符串 space dword ?;代碼段

mov esi,offset string xor ebx,ebx;EBX用于記錄空格數 again: mov al,[esi] cmp al,0 jz done cmp al,20h;空格的ASCII碼是20H jne next;不相等、不是空格,轉移

inc bx;相等、是空格,空格個數加1 next: inc esi jmp again;繼續循環

done: mov space,ebx;保存結果 〔習題4.14〕

編寫計算100個16位正整數之和的程序。如果和不超過16位字的范圍(65535),則保存其和到WORDSUM,如超過則顯示‘Overflow!’。〔解答〕

;數據段 array word 2005,2008,98 dup(1394);假設100個16位正整數 wordsum word ? error byte 'Overflow!',0;代碼段

and ebx,0 mov ecx,100 xor ax,ax again: add ax,array[ebx*2] jc over inc ebx loop again mov wordsum,ax over: mov eax,offset error call dispmsg 〔習題4.15〕

在一個已知長度的字符串中查找是否包含“BUG”子字符串。如果存在,顯示“Y”,否則顯示“N”。〔解答〕

;數據段

string byte 'If you find any error in the program, you can DEBUG it.' count = sizeof string bug byte 'BUG';代碼段

mov ecx,count mov edi,offset string L1: mov esi,offset bug push edi mov edx,sizeof bug LN: mov al,[esi] cmp [edi],al jne L2 inc esi inc edi dec edx jne LN pop edi mov al,'Y' jmp L3 L2: pop edi inc edi loop L1 mov al,'N' L3: call dispc 〔習題4.16〕

主存中有一個8位壓縮BCD碼數據,保存在一個雙字變量中。現在需要進行顯示,但要求不顯示前導0。由于位數較多,需要利用循環實現,但如何處理前導0和數據中間的0呢?不妨設置一個標記。編程實現。〔解答〕

;數據段 bcd dword 00371002h;代碼段

mov esi,bcd cmp esi,0 jnz goon mov al,'0' call dispc jmp done goon: mov ecx,8 xor ebx,ebx;EBX=0,表示可能是前導0 again: rol esi,4 mov eax,esi and eax,0fh;EAX低4位保存當前要顯示的BCD碼

cmp ebx,0;EBX≠0,說明不是前導0,要顯示

jnz disp;EBX=0,說明可能是前導0 cmp eax,0

jz next;EAX=0,說明是前導0,不顯示

mov ebx,1;EAX≠0,沒有前導0了,令EBX=1≠0 disp: add al,30h call dispc next: loop again done:

〔習題4.17〕

已知一個字符串的長度,剔除其中所有的空格字符。請從字符串最后一個字符開始逐個向前判斷、并進行處理。〔解答〕

;數據段

string byte 'Let us have a try!',0dh,0ah,0;代碼段

mov ecx,sizeof string cmp ecx,2 jb done lea eax,string;顯示處理前的字符串

call dispmsg mov esi,ecx dec esi outlp: cmp string[esi],' ';檢測是否是空格

jnz next;不是空格繼續循環

mov edi,esi;是空格,進入剔除空格分支

dec ecx inlp: inc edi mov al,string[edi];前移一個位置

mov string[edi-1],al cmp edi,ecx jb inlp next: dec esi;繼續進行

cmp esi,0 jnz outlp;為0結束 lea eax,string;顯示處理后的字符串

call dispmsg done:

〔習題4.18〕

第3章習題3.14在屏幕上顯示ASCII表,現僅在數據段設置表格緩沖區,編程將ASCII代碼值填入留出位置的表格,然后調用顯示功能實現(需要利用雙重循環)。〔解答〕

include io32.inc.data table byte '

|0 1 2 3 4 5 6 7 8 9 A B C D E F',13,10 byte '---+',13,10 tab1byte 6 dup(36 dup(?),13,10)

byte 0.code start: mov ebx,offset tab1 mov edx,'| 02' mov ax,2020h mov esi,6 again0: mov [ebx],edx add ebx,4 mov ecx,16 again1: mov word ptr [ebx],ax add ebx,2 inc al loop again1

add ebx,2 add edx,1 dec esi jnz again0

mov eax,offset table call dispmsg exit 0 end start 〔習題4.19〕

請按如下說明編寫子程序:

子程序功能:把用ASCII碼表示的兩位十進制數轉換為壓縮BCD碼 入口參數:DH=十位數的ASCII碼,DL=個位數的ASCII碼 出口參數:AL=對應BCD碼 〔解答〕 asctob proc shl dh,4 mov al,dh and dl,0fh or al,dl ret asctob endp 〔習題4.20〕

乘法的非壓縮BCD碼調整指令AAM執行的操作是:AH←AL÷10的商,AL←AL÷10的余數。利用AAM可以實現將AL中的100內數據轉換為ASCII碼,程序如下:

xor ah,ah aam add ax,3030h 利用這段程序,編寫一個顯示AL中數值(0~99)的子程序。〔解答〕 disp99 proc xor ah,ah aam add ax,3030h push ax mov al,ah call dispc pop ax call dispc ret disp99 endp 〔習題4.21〕

編寫一個源程序,在鍵盤上按一個鍵,將其返回的ASCII碼值顯示出來,如果按下ESC鍵(對應ASCII碼是1BH)則程序退出。請調用書中的HTOASC子程序。〔解答〕

;代碼段,主程序 again: call readc cmp al,1bh jz done mov bl,al mov al,':' call dispc mov al,bl rol al,4 call htoasc;調用子程序

call dispc;顯示一個字符

mov al,bl call htoasc;調用子程序

call dispc;顯示一個字符

call dispcrlf jmp again done:

〔習題4.22〕

編寫一個子程序,它以二進制形式顯示EAX中32位數據,并設計一個主程序驗證。〔解答〕

;代碼段,主程序

mov eax,8F98FF00H call dispbd;調用子程序;代碼段,子程序 dispbd proc;32位二進制數的輸出

push ecx push edx mov ecx,32;要輸出的字符個數 dbd: rol eax,1;AL循環左移一位

push eax and al,01h;取AL最低位

add al,30h;轉化成相應的ASCLL碼值

call dispc;以二進制的形式顯示

pop eax loop dbd pop edx pop ecx ret dispbd endp 〔習題4.23〕

將例題4-16的32位寄存器改用16位寄存器,僅實現輸出-215~+215-1之間的數據。〔解答〕

;數據段

array word 12345,-1234,32767,-32768,0,667 writebuf byte 6 dup(0);代碼段,主程序

mov ecx,lengthof array mov ebx,0 again:

mov ax,array[ebx*2]

call write

call dispcrlf

inc ebx

;此時ebx代表array中的第幾個數

dec ecx

;此時ecx代表循環的次數

jnz again;代碼段,子程序

write proc

;子程序開始

push ebx

push ecx

push edx

mov ebx,offset writebuf

;ebx指向顯示緩沖區

test ax,ax

jnz write1

mov byte ptr [ebx],30h

inc ebx

jmp write5 write1:

;若不為0則首先判斷是正是負

jns write2

;若為正則跳過下面兩步到write2

mov byte ptr [ebx],'-'

inc ebx

neg ax write2:

mov cx,10

push cx

;將cx=10壓入棧,作為退出標志

write3:

;write3是讓eax循環除以10并把余數的ASCII碼壓入棧

cmp ax,0

jz write4

xor dx,dx

div cx

add dx,30h

push dx

jmp write3 write4:

;余數的ASCII碼出棧,遇到10終止并轉到write5顯示結果

pop dx

cmp dx,cx

jz write5

mov byte ptr [ebx],dl

inc ebx

jmp write4 write5:

;顯示結果

mov byte ptr [ebx],0

mov eax,offset writebuf

call dispmsg

pop edx

pop ecx

pop ebx

ret write endp 〔習題4.24〕

參考例題4-17,編寫實現32位無符號整數輸入的子程序,并設計一個主程序驗證。〔解答〕

;數據段 count =10 array dword count dup(0)temp dword ? readbuf byte 30 dup(0)errmsg byte 'Input error,enter again!',13,10,0 msg1 byte 'Input ten unsigned numbers,each number ends with enter key:',13,10,0 msg2 byte 'Check the numbers your inputted:',13,10,0;代碼段,主程序

mov eax,offset msg1

call dispmsg

mov ecx,count

mov ebx,offset array again:

call read

mov eax,temp

mov [ebx],eax

add ebx,4

dec ecx

jnz again

mov eax,offset msg2

call dispmsg

mov edx,offset array

mov ecx,count next:

mov eax,[edx]

call dispuid

call dispcrlf

add edx,4

dec ecx

jnz next;代碼段,子程序 read

proc

push eax

push ecx

push ebx

push edx read0:

mov eax,offset readbuf

call readmsg

test eax,eax

jz readerr

cmp eax,12

ja readerr

mov edx,offset readbuf

xor ebx,ebx

xor ecx,ecx

mov al,[edx]

cmp al,'+'

jz read1

cmp al,'-'

jnz read2

jmp readerr read1:

inc edx

mov al,[edx]

test al,al

jz read3

;如果為0,則說明該字符串已結束 read2:

cmp al,'0'

jb readerr

cmp al,'9'

ja readerr

sub al,30h

imul ebx,10

;ebx用來存儲處理過的數據

jc readerr

movzx eax,al

add ebx,eax

jnc read1 readerr:

mov eax,offset errmsg

call dispmsg

jmp read0 read3:

mov temp,ebx

pop edx

pop ebx

pop ecx

pop eax

ret read

endp 〔習題4.25〕

編寫一個計算字節校驗和的子程序。所謂“校驗和”是指不記進位的累加,常用于檢查信息的正確性。主程序提供入口參數,有數據個數和數據緩沖區的首地址。子程序回送求和結果這個出口參數。〔解答〕

;計算字節校驗和的通用過程

;入口參數:DS:EBX=數組的段地址:偏移地址,ECX=元素個數

;出口參數:AL=校驗和

;說明:除EAX/EBX/ECX外,不影響其他寄存器 checksum proc xor al,al;累加器清0 sum: add al,[ebx];求和

inc ebx;指向下一個字節

loop sum ret checksum endp 〔習題4.26〕

編制3個子程序把一個32位二進制數用8位十六進制形式在屏幕上顯示出來,分別運用如下3種參數傳遞方法,并配合3個主程序驗證它。(1)采用EAX寄存器傳遞這個32位二進制數(2)采用temp變量傳遞這個32位二進制數(3)采用堆棧方法傳遞這個32位二進制數 〔解答〕(1)

;數據段

wvar word 307281AFH;代碼段,主程序

mov eax,wvar call disp mov al,'H' call dispc;代碼段,子程序 disp proc push ebx push ecx mov ecx,8;8位 dhw1: rol eax,4 mov ebx,eax and al,0fh;轉換為ASCII碼

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp

(2)

;數據段

wvar word 307281AFH temp word ?;代碼段,主程序

mov eax,wvar mov temp,eax call disp mov al,'H' call dispc;代碼段,子程序 disp proc push ebx push ecx mov ecx,8;8位

mov eax,temp dhw1: rol eax,4 mov ebx,eax and al,0fh;轉換為ASCII碼

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc

;顯示一個字符

mov eax,ebx loop dhw1 pop ecx pop ebx ret disp endp(3)

;數據段

wvar word 307281AFH;代碼段,主程序

push wvar call disp add esp,4 mov al,'H' call dispc;代碼段,子程序 disp proc push ebp mov ebp,esp push ebx push ecx mov ecx,8;8位

mov eax,[ebp+8] dhw1: rol eax,4 mov ebx,eax and al,0fh;轉換為ASCII碼

add al,30h cmp al,'9' jbe dhw2 add al,7 dhw2: call dispc mov eax,ebx loop dhw1 pop ecx pop ebx pop ebp ret disp endp 〔習題4.27〕

配合例題4-11的簡單加密解密程序,設計一個輸入密碼的程序,將輸入的若干字符經過適當算法得到一個字節量密碼。〔解答〕;ex0427.asm include io32.inc.data key byte ? msg0 byte 'Enter your password:',0 passw byte 50 dup(0)errormsg byte 'Password error, input again!',13,10,0 bufnum = 255 buffer byte bufnum+1 dup(0);定義鍵盤輸入需要的緩沖區 msg1 byte 'Enter messge: ',0 msg2 byte 'Encrypted message: ',0 msg3 byte 'Original messge: ',0.code start: mov eax,offset msg0;提示輸入加密密碼

call dispmsg mov eax,offset passw;設置入口參數EAX call readmsg;調用輸入字符串子程序輸入密碼

mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again0: inc ebx xor al,passw[ebx];使用簡單的異或方法得到加密關鍵字

loop again0 mov key,al;保存加密關鍵字

mov eax,offset msg1;提示輸入字符串

call dispmsg mov eax,offset buffer;設置入口參數EAX call readmsg;調用輸入字符串子程序

push eax;字符個數保存進入堆棧

mov ecx,eax;ECX=實際輸入的字符個數,作為循環的次數

xor ebx,ebx;EBX指向輸入字符 encrypt: mov al,key;AL=加密關鍵字

xor buffer[ebx],al;異或加密

inc ebx dec ecx;等同于指令:loop encrypt jnz encrypt;處理下一個字符

mov eax,offset msg2 call dispmsg mov eax,offset buffer;顯示加密后的密文

call dispmsg call dispcrlf;again: mov eax,offset msg0;提示輸入解密密碼

call dispmsg mov eax,offset passw;設置入口參數EAX call readmsg;調用輸入字符串子程序輸入密碼

mov ecx,eax dec ecx xor ebx,ebx mov al,passw[ebx] again1: inc ebx xor al,passw[ebx];使用簡單的異或方法得到加密關鍵字

loop again1 cmp key,al;與原加密關鍵字比較

jz next;密碼相同,則進行解密

mov eax,offset errormsg;提示輸入解密密碼錯誤 call dispmsg jmp again

next: pop ecx;從堆棧彈出字符個數,作為循環的次數

xor ebx,ebx;EBX指向輸入字符 decrypt: mov al,key;AL=解密關鍵字

xor buffer[ebx],al;異或解密

inc ebx dec ecx jnz decrypt;處理下一個字符

mov eax,offset msg3 call dispmsg mov eax,offset buffer;顯示解密后的明文

call dispmsg 〔習題4.28〕

設計一個簡單的兩個整數的加法器程序。〔解答〕;ex0428.asm include io32.inc.data msg1 byte 'Enter the integers:',13,10,0 msg2 byte 13,10,'Enter space to continue!Enter any other key to exit!',13,10,0

.code start: mov eax,offset msg1 call dispmsg call readsid

mov ebx,eax mov al,'+' call dispc call dispcrlf

call readsid add ebx,eax mov al,'=' call dispc mov eax,ebx call dispsid call dispcrlf

mov eax,offset msg2 call dispmsg call readc cmp al,20h je start

exit 0 end start 〔習題4.29〕

利用十六進制字節顯示子程序DISPHB設計一個從低地址到高地址逐個字節顯示某個主存區域內容的子程序DISPMEM。其入口參數:EAX=主存偏移地址,ECX=字節個數(主存區域的長度)。同時編寫一個主程序進行驗證。〔解答〕

;ex0429.asm in Windows Console include io32.inc.data var byte 'This is a test!'.code start:;主程序

mov eax,offset var mov ecx,sizeof var call dispmem exit 0;子程序 dispmem proc push ebx mov ebx,eax dispm1: mov al,[ebx] call disphb mov al,' ' call dispc inc ebx loop dispm1 pop ebx ret dispmem endp end start 〔習題4.30〕

將例題4-19分別使用子程序模塊、子程序庫和子程序庫包含方法生成最終可執行文件。〔習題4.31〕

區別如下概念:宏定義、宏調用、宏指令、宏展開、宏匯編。〔解答〕

宏定義:就是對宏進行說明,由一對宏匯編偽指令MACRO和ENDM來完成。宏調用:宏定義之后的使用。在使用宏指令的位置寫下宏名,后跟實體參數。宏指令:使用宏時,其形式很像指令,所以稱為宏指令。

宏展開:在匯編時,匯編程序用對應的代碼序列替代宏指令。宏匯編:指使用宏的方法進行匯編語言程序設計。〔習題4.32〕

直接使用控制臺輸入和輸出函數實現例題4-21的功能(不使用READMSG和DISPMSG子程序)。〔解答〕

〔習題4.33〕

直接使用控制臺輸出函數實現某個主存區域內容的顯示(習題4.29的功能)。可以改進顯示形式,例如每行顯示16個字節(128位),每行開始先顯示首個主存單元的偏移地址,然后用冒號分隔主存內容。〔解答〕

〔習題4.34〕

如何進行很簡單的修改,使得例題4-22程序的消息窗有“OK”和“Cancel”兩個按鈕。〔解答〕

將MB_OK常量定義為1,即: MB_OK equ 1 〔習題4.35〕

上機實踐例題4-23和例題4-24,并在創建可執行文件的過程中生成匯編語言列表文件。〔習題4.36〕

Pentium處理器含有一個64位的時間標記計數器(Time-Stamp Counter)。該計數器每個時鐘周期遞增(加1);在上電和復位后,該計數器清0。指令“RDTSC”執行后將在EDX(高32位)和EAX(低32位)返回當前的64位時間標記計數器值。利用RDTSC指令在某個函數運行前獲得時間標記計數器值,然后運行該函數后,立即再次執行RDTSC指令,并將再次獲得的時間標記計數器值與之前的計數值相減,得到的差值就是運行該函數需要的時鐘周期數(乘以時鐘周期,等于運行時間)。請利用混合編程方法顯示某個函數的運行時鐘周期數。〔解答〕

第5章 微機總線 〔習題5.1〕簡答題 〔解答〕

① 數據總線承擔著處理器與存儲器、外設之間的數據交換,既可以輸入也可以輸出,故其是雙向的。

② 為減少引腳個數,8086采用了地址總線和數據總線分時復用。即數據總線在不同時刻還具有地址總線的功能。

③ 具有三態能力的引腳當輸出呈現高阻狀態時,相當于連接了一個阻抗很高的外部器件,信號無法正常輸出;即放棄對該引腳的控制,與其他部件斷開連接。

④ 處理器的運行速度遠遠快于存儲器和I/O端口。處理器檢測到存儲器或I/O端口不能按基本的總線周期進行數據交換時,插入一個等待狀態Tw。等待狀態實際上是一個保持總線信號狀態不變的時鐘周期。

⑤ 猝發傳送是處理器只提供首地址、但可以從后續連續的存儲單元中讀寫多個數據。

⑥ 總線上可能連接多個需要控制總線的主設備,需要確定當前需要控制總線的主設備,所以需要總線仲裁。

⑦ 異步時序是由總線握手(Handshake)聯絡(應答)信號控制,不是由總線時鐘控制。故總線時鐘信號可有可無。

⑧ 單總線結構限制了許多需要高速傳輸速度的部件。32位PC機采用多種總線并存的系統結構。各種專用局部總線源于處理器芯片總線,以接近處理器芯片引腳的速度傳輸數據,它為高速外設提供速度快、性能高的共用通道。⑨ 4個。

⑩ 即插即用技術是指32位PC機的主板、操作系統和總線設備配合,實現自動配置功能。〔習題5.2〕判斷題 〔解答〕

① 對 ② 對 ③ 錯 ④ 對 ⑤ 對 ⑥ 錯 ⑦ 對 ⑧ 對 ⑨ 對 ⑩ 錯 〔習題5.3〕填空題 〔解答〕 ① 0 ② 讀,寫 ③ 存儲器讀,存儲器讀,存儲器寫 ④ 4,2,10ns ⑤ 低有效,0010 ⑥ 尋址,數據傳送

⑦ 127,1.5Mb/s,12Mb/s ⑧ 地址,數據 ⑨,⑩,I/O CH RDY 〔習題5.4〕

處理器有哪4種最基本的總線操作(周期)? 〔解答〕

存儲器讀、存儲器寫,I/O讀、I/O寫。〔習題5.5〕

8086處理器的輸入控制信號有RESET,HOLD,NMI和INTR,其含義各是什么?當它們有效時,8086 CPU將出現何種反應? 〔解答〕

RESET:復位輸入信號,高電平有效。該引腳有效時,將迫使處理器回到其初始狀態;轉為無效時,CPU重新開始工作。

HOLD:總線請求,是一個高電平有效的輸入信號。該引腳有效時,表示其他總線主控設備向處理器申請使用原來由處理器控制的總線。

NMI:不可屏蔽中斷請求,是一個利用上升沿有效的輸入信號。該引腳信號有效時,表示外界向CPU申請不可屏蔽中斷。

INTR:可屏蔽中斷請求,是一個高電平有效的輸入信號。該引腳信號有效時,表示中斷請求設備向處理器申請可屏蔽中斷。〔習題5.6〕

區別概念:指令周期、總線周期(機器周期)、時鐘周期、T狀態。〔解答〕

指令周期:一條指令從取指、譯碼到最終執行完成的過程。總線周期(機器周期):有數據交換的總線操作。

時鐘周期:處理器的基本工作節拍,由時鐘信號產生,一個高電平和一個低電平為一個周期。T狀態:完成特定操作的一個時鐘周期。由于時間上一個T狀態等于一個時鐘周期,所以常常將兩者混為一談。〔習題5.7〕

總結8086各個T狀態的主要功能。〔解答〕

T1狀態:總線周期的第一個時鐘周期主要用于輸出存儲器地址或I/O地址; T2狀態:輸出讀/寫控制信號。

T3狀態:鎖存地址、處理器提供的控制信號和數據在總線上繼續維持有效,且T3時鐘的前沿(下降沿)對READY引腳進行檢測。READY信號有效,進入T4周期。

T4狀態:總線周期的最后一個時鐘周期,處理器和存儲器或I/O端口繼續進行數據傳送,直到完成,并為下一個總線周期做好準備。

Tw狀態:等待狀態。處理器在T3前沿發現READY信號無效后,插入Tw。Tw狀態的引腳信號延續T3時的狀態、維持不變。〔習題5.8〕

請解釋8086(最小組態)以下引腳信號的含義:CLK,A19/S6~A16/S3,AD15~AD0,ALE,和。默畫它們在具有一個等待狀態的存儲器讀總線周期中的波形示意。〔解答〕

CLK:時鐘輸入。時鐘信號是一個頻率穩定的數字信號,其頻率就是處理器的工作頻率,工作頻率的倒數就是時鐘周期的時間長度。

A19/S6~A16/S3:地址/狀態分時復用引腳,是一組4個具有三態能力的輸出信號。這些引腳在訪問存儲器的第一個時鐘周期輸出高4位地址A19~A16,在訪問外設的第一個時鐘周期輸出低電平無效;其他時間輸出狀態信號S6~S3。

AD15~AD0:地址/數據分時復用引腳,共16個引腳,用作地址總線時是單向輸出信號;用作數據總線時是雙向信號,具有三態輸出能力。

ALE:地址鎖存允許,是一個三態、輸出、高電平有效的信號。有效時,表示復用引腳(AD15~AD0和A19/S6~A16/S3)上正在傳送地址信號。

:訪問存儲器或者I/O,是一個三態輸出信號,該引腳高電平時,表示處理器將訪問存儲器,此時地址總線A19~A0提供20位的存儲器物理地址。該引腳低電平時,表示處理器將訪問I/O端口,此時地址總線A15~A0提供16位的I/O地址。

:讀控制,也是一個三態、輸出低電平有效信號。有效時,表示處理器正在從存儲單元或I/O端口讀取數據。

:寫控制,是一個三態、輸出低電平有效信號。有效時,表示處理器正將數據寫到存儲單元或I/O端口。

〔習題5.9〕

區別如下總線概念:芯片總線、局部總線、系統總線;并行總線、串行總線;地址總線、數據總線、控制總線;ISA總線、PCI總線。〔解答〕

芯片總線:是指大規模集成電路芯片內部,或系統中各種不同器件連接在一起的總線;用于芯片級互連。

局部總線:位于處理器附件的器件相互連接的總線,相對于芯片總線。系統總線:通常是指微機系統的主要總線。并行總線:采用并行傳輸方式的總線。

串行總線:將多位數據按二進制位的順序在數據線上逐位傳送的總線。地址總線:實現地址信息互連和交換的一組導線。數據總線:實現數據信息互連和交換的一組導線。

控制總線:控制協調處理器和內存、外設交互信息的一組導線。

ISA總線:即IBM PC/AT總線,以處理器80286引腳形成的總線,分成支持8位操作的前62信號和擴展16位操作的后36信號。

PCI總線:外設部件互連總線,不僅適用于IA-32處理器,也適用其它處理器,支持32位和64位操作,廣泛用于32位通用微型計算機中。〔習題5.10〕

什么是同步時序、半同步時序和異步時序? 〔解答〕

同步時序:總線操作的各個過程由共用的總線時鐘信號控制。半同步時序:總線操作仍由共用的總線時鐘信號控制,但慢速模塊可以通過等待信號讓快速模塊等待。

異步時序:總線操作需要握手(Handshake)聯絡(應答)信號控制,總線時鐘信號可有可無。〔習題5.11〕

EISA總線的時鐘頻率是8MHz,每2個時鐘可以傳送一個32位數據,計算其總線帶寬。〔解答〕

(32×8)÷(2×8)=16MBps 〔習題5.12〕

PCI總線有什么特點? 〔解答〕

PCI總線與處理器無關,具有32位和64位數據總線,有+5V和+3.3V兩種設計,采用集中式總線仲裁、支持多處理器系統,通過橋(Bridge)電路兼容ISA/EISA總線,具有即插即用的自動配置能力等一系列優勢。〔習題5.13〕

PCI總線操作如何插入等待狀態? 〔解答〕

主設備利用IRDY#信號無效、從設備利用TRDY#信號無效要求對方等待,即插入等待狀態。〔習題5.14〕

什么是USB總線支持的“熱插拔”,這個特性有什么意義? 〔解答〕

“熱插拔”是在PC機正常工作狀態進行插入或拔出。這個特性可以使用戶隨時連接USB設備。〔習題5.15〕

簡述USB總線的主要特征?

〔解答〕

使用方便、擴充能力強。

支持多種傳輸速度、適用面廣。

低功耗、低成本、占用系統資源少。〔習題5.16〕

USB總線的集線器有什么作用?主機上是否需要集線器? 〔解答〕

集線器是專門用于提供額外USB接入點的USB設備。主機需要集線器,被稱為根集線器。〔習題5.17〕

USB總線協議支持哪幾種數據傳輸方式?簡述之。〔解答〕

USB的數據傳輸有4種:

控制傳輸——在USB設備初次安裝時,USB系統軟件使用控制傳輸方式設置USB設備參數、發送控制指令、查詢狀態等。批量傳輸——對于打印機、掃描儀等設備需要傳輸大量數據,可以使用批量傳輸方式連續傳輸一批數據。

中斷傳輸——該方式傳輸的數據量很小,但需要及時處理,以保證實時性,主要用于鍵盤、鼠標等設備上。

同步傳輸——該方式以穩定的速率發送和接收信息,保證數據的連續和及時,用于數據傳輸正確性要求不高而對實時性要求高的外設,例如麥克風、喇叭、電話等。第6章 存儲系統 〔習題6.1〕簡答題 〔解答〕

① 因為各種存儲器件在容量、速度和價格方面存在矛盾。速度快,則單位價格高;容量大,單位價格低,但存取速度慢。故存儲系統不能采用一種存儲器件。

② Cache中復制著主存的部分內容。當處理器試圖讀取主存的某個字時,Cache控制器首先檢查Cache中是否已包含有這個字。若有,則處理器直接讀取Cache,這種情況稱為高速命中;若無,則稱為高速缺失。

③ 標簽存儲器保存著該數據所在主存的地址信息。④ 主存塊與Cache行之間的對應關系稱“地址映射”,Cache通過地址映射確定一個主存塊應放到哪個Cache行組中。

⑤ 寫入策略用于解決寫入Cache時引起主存和Cache內容不一致性的問題。

⑥ 存取時間是指從讀/寫命令發出,到數據傳輸操作完成所經歷的時間;存取周期表示兩次存儲器訪問所允許的最小時間間隔。存取周期大于等于存取時間。

⑦ 虛擬存儲器是由操作系統利用輔助存儲器、以磁盤文件形式建立的、在主存儲器與輔助存儲器之間的一個存儲器。⑧ DRAM芯片容量大、芯片小,高集成度,引腳數量少。故DRAM芯片將地址引腳分時復用,即用一組地址引腳傳送兩批地址。第一批地址稱行地址,第二批地址稱列地址。

⑨ 譯碼電路中只有部分地址線參與譯碼會造成地址重復,也就是一個存儲單元占有多個存儲器地址。

⑩頁表項的P位稱為存在位(Present),表示該頁面是否在物理存儲器中。〔習題6.2〕判斷題。

〔解答〕

① 錯 ② 對 ③ 對 ④ 對 ⑤ 對 ⑥ 錯 ⑦ 錯 ⑧ 對 ⑨ 錯 ⑩ 對 〔習題6.3〕填空題 〔解答〕

① 8,1024,1024,1024,1024,240 ② 8KB,4 ③ 隨機存取存儲器,丟失,只讀存儲器,讀取,不會丟失 ④ 8,13,8 ⑤ 2 ⑥(UV-)EPROM,Flash Memory ⑦ 58000H,5FFFFH,32KB ⑧ 32,4,64,8 ⑨ 直接映射,組合相關映射,全相關映射,2路組合相關映射 ⑩ 00820000H,02000H 〔習題6.4〕

舉例說明存儲訪問的局部性原理。〔解答〕

處理器訪問存儲器時,無論是讀取指令還是存取數據,所訪問的存儲單元在一段時間內都趨向于一個較小的連續區域中,這就是存儲訪問的局部性原理。例如,求平均值的函數。long mean(long d[], long num){

long i,temp=0;

for(i=0;i

temp=temp/num;

return(temp);} 函數中的變量temp體現了時間局部,因為每次循環都要使用它。順序訪問數組d[]的各個元素(相鄰存放在主存),體現了空間局部。循環體內的指令順序存放,依次讀取執行體現了空間局部;同時重復執行循環體,又體現了時間局部。〔習題6.5〕

簡述存儲系統的層次結構及各層存儲部件特點。〔解答〕

為解決容量、速度和價格的矛盾,存儲系統采用金字塔型層次結構,單位價格和速度自上而下逐層減少,容量自上而下逐層增加。

存儲系統的各層存儲部件自上而下依次是:CPU寄存器、高速緩存、主存存儲器(RAM/ROM),輔助存儲器如磁盤、光盤等。CPU寄存器、高速緩存器集成在CPU芯片上,對用戶來說,是透明的,它們用于暫存主存和處理器交互的數據,以減少頻繁讀取主存而影響處理器速度;主存儲器則可和處理器直接交換數據,而輔助存儲器必須經過主存存儲器,才可與處理器進行數據交換。〔習題6.6〕 在半導體存儲器件中,什么是SRAM、DRAM和NVRAM? 〔解答〕

SRAM是靜態讀寫存儲器芯片,它以觸發器為基本存儲單元,以其兩種穩定狀態表示邏輯0和邏輯1。

DRAM是動態讀寫存儲器芯片,它以單個MOS管為基本存儲單元,以極間電容充放電表示兩種邏輯狀態,需要不斷刷新保持信息正確。

NVRAM多指帶有后備電池的SRAM芯片,這種芯片采用CMOS制造工藝設計以減少用電。〔習題6.7〕

SRAM芯片的片選信號有什么用途?對應讀寫控制的信號是什么? 〔解答〕

片選信號:片選有效時,才可以對該芯片進行讀/寫操作;無效時,數據引腳呈現高阻狀態、與系統數據總線隔離,并可降低內部功耗。

讀控制信號:在芯片被選中的前提下,若有效,則芯片將允許地址信號選擇的存儲單元內的數據輸出到數據引腳上。

寫控制信號:在芯片被選中的前提下,若有效,則芯片將數據引腳上的數據寫入地址信號選擇的存儲單元內。〔習題6.8〕

DRAM為什么要刷新,存儲系統如何進行刷新? 〔解答〕

DRAM以單個MOS管為基本存儲單元,以極間電容充放電表示兩種邏輯狀態。由于極間電容的容量很小,充電電荷自然泄漏會很快導致信息丟失,所以要不斷對它進行刷新操作、即讀取原內容、放大再寫入。

存儲系統的刷新控制電路提供刷新行地址,將存儲DRAM芯片中的某一行選中刷新。實際上,刷新控制電路是將刷新行地址同時送達存儲系統中所有DRAM芯片,所有DRAM芯片都在同時進行一行的刷新操作。

刷新控制電路設置每次行地址增量,并在一定時間間隔內啟動一次刷新操作,就能夠保證所有DRAM芯片的所有存儲單元得到及時刷新。〔習題6.9〕

什么是掩摸ROM、OTP-ROM、EPROM、EEPROM和Flash ROM? 〔解答〕

掩膜ROM:通過掩膜工藝、將要保存的信息直接制作在芯片當中,以后再也不能更改。OTP-ROM:該類芯片出廠時存儲的信息為全“1”,允許用戶進行一次性編程,此后便不能更改。EPROM:一般指可用紫外光擦除、并可重復編程的ROM。

EEPROM:也常表達為E2PROM,其擦除和編程(即擦寫)通過加電的方法來進行,可實現“在線編程”和“在應用編程”

Flash ROM:是一種新型的電擦除可編程ROM芯片,能夠很快擦除整個芯片內容。〔習題6.10〕

請給出教材圖6-7中138譯碼器的所有譯碼輸出引腳對應的地址范圍。〔解答〕

~的地址范圍依次是: E0000H~E3FFFH,E4000H~E7FFFH,E8000H~EBFFFH,EC000H~EFFFFH,F0000H~F3FFFH,F4000H~F7FFFH,F8000H~FBFFFH,FC000H~FFFFFH。〔習題6.11〕

什么是存儲器芯片的全譯碼和部分譯碼?各有什么特點? 〔解答〕

全譯碼:使用全部系統地址總線進行譯碼。特點是地址唯一,一個存儲單元只對應一個存儲器地址(反之亦然),組成的存儲系統其地址空間連續。

部分譯碼:只使用部分系統地址總線進行譯碼。其特點:有一個沒有被使用的地址信號就有兩種編碼,這兩個編碼指向同一個存儲單元,出現地址重復。〔習題6.12〕

區別如下各個主存名稱的含義:常規主存,擴展主存,擴充主存;上位主存區UMA和上位主存塊UMB,高端主存區HMA,影子主存。〔解答〕

常規主存:8088和8086提供20個地址線A19~A0,尋址1MB的存貯空間,其中,最低640KB的系統RAM區被稱為常規主存或基本主存。

擴展主存:IA-32處理器在1MB之后的主存空間都作為RAM區域使用,被稱為擴展主存。擴充主存:處理器不可以直接訪問,利用“體交換技術”實現處理器訪問。

上位主存區UMA:在常規主存其后384KB(A0000H~FFFFFH)主存稱為上位主存區UMA。上位主存塊UMB:上位主存區UMA沒有被使用部分,被開辟為上位主存塊UMB。

高端主存區HMA:在實方式下,通過控制A20開放,程序可以訪問的1MB之后的64KB區域。影子主存:PC機啟動后可以將ROM-BIOS映射到RAM中,這部分用作ROM-BIOS、并被操作系統設置為只讀的RAM區域。〔習題6.13〕

開機后,微機系統常需要檢測主存儲器是否正常。例如,可以先向所有存儲單元寫入數據55H(或00H)、然后讀出看是否還是55H(或00H);接著再向所有存儲單元寫入數據AAH(或FFH)、然后讀出看是否還是AAH(或FFH)。利用兩個二進制各位互反的“花樣”數據的反復寫入、讀出和比較就能夠識別出有故障的存儲單元。利用獲得的有故障存儲單元所在的物理地址,如果能夠分析出該存儲單元所在的存儲器芯片,就可以實現芯片級的維修。試利用匯編語言編寫一個檢測常規主存最高64KB(邏輯地址從9000H∶0000H到9000H∶FFFFH)的程序,如果發現錯誤請顯示其邏輯地址。〔解答〕

;代碼段

mov ax,9000h mov ds,ax mov ah,55h;先用55H push ax again: mov bx,0 mov al,ah again1: mov [bx],al;寫入

dec bx jnz again1 again2: mov al,[bx];讀出

cmp al,ah;檢測

jz next2 dispcrlf push ax mov ax,ds call disphw;顯示段地址

mov al,':' call dispc mov ax,bx call disphw;顯示偏移地址

pop ax next2: dec bx jnz again2 pop ax cmp ah,0aah;后用0AAH jz done mov ah,0aah jmp again done: 〔習題6.14〕

什么是LRU替換算法?80486片內Cache中,如果3個替換算法位B2B1B0=010,則將替換哪個Cache行,并給出你的判斷過程。〔解答〕

LRU算法是近期最少使用、即選擇最長時間未被使用的數據塊進行替換的算法。

B0=0,說明最近訪問了L2/L3行,所以應該替換L0或L1行。B1=1,說明最近訪問了L0行,所以應該替換L1。因為LRU算法是選擇最長時間未被訪問的Cache行進行替換。〔習題6.15〕

高速緩沖存儲器Cache的寫入策略是解決什么問題的?有哪兩種寫入策略,各自的寫入策略是怎樣的?

〔解答〕

寫入策略用于在寫命中時Cache與主存內容保持一致。

直寫式寫入策略指處理器對Cache寫入的同時,將數據也寫入到主存,這樣來保證主存和Cache內容一致。它簡單可靠。

回寫Cache只有在行替換時才可能寫入主存,寫入主存的次數,會少于處理器實際執行的寫入操作數。回寫Cache的性能要高于直寫Cache,但實現結構略為復雜。〔習題6.16〕

80486片上8KB Cache的標簽存儲器為什么只需要21位? 〔解答〕

80486片上Cache共有8KB容量,采用4路組合地址映射方式。對于4GB容量的主存來說,以Cache路為單位,可以分成4GB÷2KB=232÷211=221個Cache路。這樣每個Cache行只要設計一個21位的標簽存儲器,記錄該Cache行映射到哪個主存的Cache路。再結合直接映射的組號就可以明確該Cache行對應哪個主存塊。〔習題6.17〕

高速緩存的寫入操作有幾個很近似的英文詞匯,它們分別表示什么含義?(1)Write Through(2)Write Back(3)Write Around(4)Fetch on Write 〔解答〕

(1)Write Through:寫命中時的直寫策略。(2)Write Back:寫命中時的回寫策略。

(3)Write Around:寫未命中時的不寫分配法,即繞寫法。(4)Fetch on Write:寫未命中時的寫分配法,即寫時取法。〔習題6.18〕

區別如下高速緩存中的概念:

(1)主存數據塊Block(2)高速緩存行Line(3)高速緩存組Set(4)高速緩存路Way 〔解答〕

(1)主存數據塊Block:高速緩存與主存間的數據傳送以數據塊(Block)為單位,例如B個字。主存數據塊Block是主存中連續的B個字數據。

(2)高速緩存行Line:指高速緩存中包含B個字的一個單元。

(3)高速緩存組Set:組合相關映射將多個Cache行作為一個組(Set)。

(4)高速緩存路Way:組合相關映射將所有組中同位置Cache行稱為一路(Way)。〔習題6.19〕 什么是段選擇器、描述符、描述符表和描述符表寄存器? 〔解答〕

段選擇器:保護方式下的16位段寄存器就是段選擇器。

描述符:是保護方式引入的數據結構,有8個字節64位,具有段基地址、訪問權限、段界限等字段。IA-32處理器利用它來實現存儲管理、特權與保護。描述符表:描述符表是存放描述符的一個特殊區域段。描述符表寄存器:指明描述符表所在主存地址的寄存器。〔習題6.20〕

IA-32處理器在保護方式下,段寄存器是什么內容?若DS=78H,說明在保護方式其具體的含義。〔解答〕

段寄存器是段選擇器,包含3個域,指向一個段描述符。

DS=78H,說明當前數據段描述符是全局描述符表中的第0FH個描述符。本次訪問數據的特權級別為0,最高。〔習題6.21〕

采用4KB分頁,說明IA-32處理器將線性地址轉換為物理地址的過程。〔解答〕

通過2級查表來實現線性地址轉換為位物理地址。

(1)在CR3中包含著當前任務的頁目錄的起始地址,將其加上線性地址最高10位A31~A22確定的頁目錄項的偏移量,便訪問到指定的頁目錄項。

(2)在此頁目錄項中包含著指向的頁表的起始地址,將其加上線性地址中間的10位A21~A12確定的頁表項的偏移量,便訪問到指定的頁表項。

(3)在此頁表項中包含著要訪問的頁面的起始地址,將其加上線性地址最低12位A11~A0的偏移量,就從這一頁中訪問到所尋址的物理單元。第7章 輸入輸出接口 〔習題7.1〕簡答題 〔解答〕

① 外部設備,在工作原理、驅動方式、信息格式、以及工作速度等方面彼此差別很大,與處理器的工作方式也大相徑庭。所以,外設不能像存儲器芯片那樣直接與處理器相連,必須經過一個中間電路。

② 數據緩沖用于匹配快速的處理器與相對慢速的外設或兩個功能部件速度不匹配的數據交換。③ 處理器向接口芯片相應端口寫入特定的數據,用于選擇I/O芯片的工作方式或控制外設工作,該數據稱命令字或控制字。

④ PC機中CMOS RAM不屬于主存空間,CMOS RAM有64個字節容量,以8位I/O接口形式與處理器連接,通過兩個I/O地址訪問。

⑤ 在輸入接口中,為避免多個設備同時向總線發送數據,需要安排一個三態緩沖器。只有當處理器選通時,才允許被選中設備將數據送到系統總線,此時其他輸入設備與數據總線隔離。

⑥ 透明鎖存器的控制端為有效電平時,輸出隨輸入變化,常稱為直通或透明。非透明鎖存器不論其控制端為低或為高電平,輸出狀態都不隨輸入變化。

⑦ 如發光二極管、按鍵和開關等簡單設備,它們的工作方式十分簡單;相對處理器而言,其狀態很少發生變化或變化很慢。這些設備與處理器交換數據時,可采用無條件傳送。⑧ 在查詢程序中,當查詢超過了規定的時間,設備仍未就緒時,就引發超時錯誤。

⑨ 遠調用CALL指令利用直接或間接尋址調用另一個代碼段的子程序;INT n指令利用中斷向量表(地址表)的方法調用另一個代碼段的中斷服務程序,還有保存標志寄存器的功能。

⑩ 外部中斷是由處理器外部提出中斷請求引起的程序中斷。相對于處理器來說,外部中斷是隨機產生的,所以是真正意義上的中斷。〔習題7.2〕判斷題 〔解答〕

① 對 ② 對 ③ 對 ④ 錯 ⑤ 錯 ⑥ 錯 ⑦ 對 ⑧ 錯 ⑨ 對 ⑩ 錯 〔習題7.3〕填空題 〔解答〕

① 數字量、開關量、脈沖量

② I/O獨立,輸入輸出(I/O)指令,直接尋址,DX寄存器間接尋址 ③ I/O端口(接口,外設),處理器(主機),I/O讀 ④ 寄存器,I/O地址的直接尋址 ⑤ I/O地址的間接尋址,寄存器

⑥ 直接存儲器存取,DMA請求,總線請求,總線響應,高阻,DMAC(DMA控制器)⑦ 除法錯,2 ⑧ 1,STI,CLI,0 ⑨ 1KB,20H,4,F010H∶2300H ⑩ IR3,IR3請求的 〔習題7.4〕

一般的I/O接口電路安排有哪三類寄存器?它們各自的作用是什么? 〔解答〕

① 數據寄存器

保存處理器與外設之間交換的數據。

② 狀態寄存器

保存外設當前的工作狀態信息。處理器通過該寄存器掌握外設狀態,進行數據交換。③ 控制寄存器

保存處理器控制接口電路和外設操作的有關信息。處理器向控制寄存器寫入控制信息,選擇接口電路的不同工作方式和與外設交換數據形式。〔習題7.5〕

什么是I/O獨立編址和統一編址,各有什么特點? 〔解答〕

獨立編址是將I/O端口單獨編排地址,獨立于存儲器地址。

統一編址是將I/O端口與存儲器地址統一編排,共享一個地址空間。

端口獨立編址方式,處理器除要具有存儲器訪問的指令和引腳外,還需要設計I/O訪問的I/O指令和I/O引腳,其優點是:不占用存儲器空間;I/O指令使程序中I/O操作一目了然;較小的I/O地址空間使地址譯碼簡單。但I/O指令功能簡單,尋址方式沒有存儲器指令豐富。

統一編址方式,處理器不再區分I/O口訪問和存儲器訪問。其優點是:處理器不用設計I/O指令和引腳,豐富的存儲器訪問方法同樣能夠運用于I/O訪問。缺點是:I/O端口會占用存儲器的部分地址空間,通過指令不易辨認I/O操作。〔習題7.6〕

簡述主機與外設進行數據交換的幾種常用方式。〔解答〕

主機與外設進行數據交換的幾種常用方式:

① 無條件傳送方式,常用于簡單設備,處理器認為它們總是處于就緒狀態,隨時進行數據傳送。② 程序查詢方式:處理器首先查詢外設工作狀態,在外設就緒時進行數據傳送。

③ 中斷方式:外設在準備就緒的條件下通過請求引腳信號,主動向處理器提出交換數據的請求。處理器無其他更緊迫任務,則執行中斷服務程序完成一次數據傳送。

④ DMA傳送: DMA控制器可接管總線,作為總線的主控設備,通過系統總線來控制存儲器和外設直接進行數據交換。此種方式適用于需要大量數據高速傳送的場合。〔習題7.7〕

參看圖7-5,編程實現以下功能:當K0鍵單獨按下時,發光二極管L0~L7將依次點亮(L0,L1,L2,??L7),每個維持200ms;當K1鍵單獨按下時,發光二極管L0~L7將反向依次點亮(L7,L6,L5,??L0),每個也維持200ms;在其他情況下各發光二極管均不點亮。假定有延時200ms的子程序DELAY可直接調用。〔解答〕

again: mov dx,8000h in al,dx cmp al,0feh;D7~D0=11111110B ?

jz next1;單獨按下K0,轉移到next1 cmp al,0fdh;D7~D0=11111101B ?

jz next2;單獨按下K1,轉移到next2 jmp again;其它情況不點亮 next1: mov cx,8 mov al,1;從K0開始

next11: out dx,al;某個LED電亮

call delay;延時200ms shl al,1;rol al,1 loop next11 jmp again next2: mov cx,8 mov al,80h;從K7開始 next21: out dx,al;某個LED電亮

call delay;延時200ms shr al,1;ror al,1 loop next21 jmp again 〔習題7.8〕

現有一個輸入設備,其數據端口地址為FFE0H,狀態端口地址為FFE2H。當狀態標志D0=1時,表明一個字節的輸入數據就緒。請編寫利用查詢方式進行數據傳送的程序段,要求從該設備讀取100個字節保存到BUFFER緩沖區。〔解答〕

mov bx, offset buffer mov cx,100 again: mov dx,0ffe2h status: in al,dx;查詢一次

test al,01h jz status mov dx,0ffe0h in al,dx;輸入一個字節

mov [bx],al inc bx loop again;循環,輸入100個字節 〔習題7.9〕

某個字符輸出設備,其數據端口和狀態端口的地址均為80H。在讀取狀態時,當標志位D7=0時,表明該設備閑,可以接收一個字符。請編寫利用查詢方式進行數據傳送的程序段,要求將存放于緩沖區ADDR處的一串字符(以0為結束標志)輸出給該設備。〔解答〕

mov bx,offset addr again: cmp byte ptr [bx],0 jz done status: in al,80h;查詢 test al,80h jnz status mov al,[bx] out 80h,al;輸出一個字節

inc bx jmp again;循環 done: 〔習題7.10〕

以可屏蔽中斷為例,說明一次完整的中斷過程主要包括哪些環節? 〔解答〕

中斷請求:外設通過硬件信號的形式、向處理器引腳發送有效請求信號。中斷響應:在滿足一定條件時,處理器進入中斷響應總線周期。關中斷:處理器在響應中斷后會自動關閉中斷。

斷點保護:處理器在響應中斷后將自動保護斷點地址。中斷源識別:處理器識別出當前究竟是哪個中斷源提出了請求,并明確與之相應的中斷服務程序所在主存位置。

現場保護:對處理器執行程序有影響的工作環境(主要是寄存器)進行保護。中斷服務:處理器執行相應的中斷服務程序,進行數據傳送等處理工作。恢復現場:完成中斷服務后,恢復處理器原來的工作環境。開中斷:處理器允許新的可屏蔽中斷。

中斷返回:處理器執行中斷返回指令,程序返回斷點繼續執行原來的程序。〔習題7.11〕

什么是中斷源?為什么要安排中斷優先級?什么是中斷嵌套?什么情況下程序會發生中斷嵌套? 〔解答〕

計算機系統中,凡是能引起中斷的事件或原因,被稱為中斷源。

處理器隨時可能會收到多個中斷源提出的中斷請求,因此,為每個中斷源分配一級中斷優先權,根據它們的高低順序決定響應的先后。

一個中斷處理過程中又有一個中斷請求、并被響應處理,被稱為中斷嵌套。必須在中斷服務程序中打開中斷,程序才會發生中斷嵌套。〔習題7.12〕

明確如下中斷有關的概念:中斷源、中斷請求、中斷響應、關中斷、開中斷、中斷返回、中斷識別、中斷優先權、中斷嵌套、中斷處理、中斷服務。〔解答〕

中斷源:能引起中斷的事件或原因。

中斷請求:是外設通過硬件信號的形式、向處理器引腳發送有效請求信號。中斷響應:中斷響應是在滿足一定條件時,處理器進入中斷響應總線周期。關中斷:禁止處理器響應可屏蔽中斷。開中斷:允許處理器響應可屏蔽中斷。

中斷返回:處理器執行中斷返回指令,將斷點地址從堆棧中彈出,程序返回斷點繼續執行原來的程序。

中斷識別:處理器識別出當前究竟是哪個中斷源提出了請求,并明確與之相應的中斷服務程序所在主存位置。中斷優先權:為每個中斷源分配一級中斷優先權,即系統設計者事先為每個中斷源確定處理器響應他們的先后順序。

中斷嵌套:在一個中斷處理過程中又有一個中斷請求被響應處理,稱為中斷嵌套。中斷處理:接到中斷請求信號后,隨之產生的整個工作過程,稱中斷處理。中斷服務:指處理器執行相應的中斷服務程序,進行數據傳送等處理工作。〔習題7.13〕 按照圖7-10所示的中斷查詢接口與相應的流程圖,編寫用于中斷服務的程序段。具體要求是,當程序查到中斷設備0有中斷請求(對應數據線D0),它將調用名為PROC0的子程序;如此,依次去查中斷設備1~中斷設備3,并分別調用名為PROC1~PROC3的子程序。〔解答〕

sti push ax push dx ?

mov dx,4000h status: in al,dx test al,01h jnz service0 test al,02h jnz service1 test al,04h jnz service2 test al,08h jnz service3 ?

service0: call proc0 jmp done service1: call proc1 jmp done service2: call proc2 jmp done service3: call proc3 jmp done ??

done: pop dx pop ax iret 〔習題7.14〕

什么是DMA讀和DMA寫?什么是DMA控制器8237A的單字節傳送、數據塊傳送和請求傳送? 〔解答〕

DMA讀:存儲器的數據在DMA控制器控制下被讀出傳送給外設。DMA寫:外設的數據在DMA控制器控制下被寫入存儲器。

單字節傳送方式:每次DMA傳送時僅傳送一個字節。傳送一個字節之后,DMA控制器釋放系統總線,將控制權還給處理器。

數據塊傳送: DMA傳送啟動后就連續地傳送數據,直到規定的字節數傳送完。

請求傳送:DMA傳送由請求信號控制。如果請求信號一直有效,就連續傳送數據;但當請求信號無效時,DMA傳送被暫時中止。〔習題7.15〕

IA-32處理器何時處于開中斷狀態、何時處于關中斷狀態? 〔解答〕

在IA-32處理器中,若IF=1,則處理器處于開中斷狀態。

若IF=0,則處理器處于關中斷狀態。IF=0關中斷的情況有:系統復位后,任何一個中斷(包括外部中斷和內部中斷)被響應后,執行關中斷指令CLI后。〔習題7.16〕 簡述IA-32處理器的中斷工作過程。〔解答〕

IA-32處理器獲得向量號識別出中斷源后,中斷或異常接著的工作過程如下:

(1)將標志寄存器EFLAGS壓入堆棧,保護各個標志位;將被中斷指令的邏輯地址(代碼段寄存器和指令指針寄存器內容)壓入堆棧,保護斷點。

(2)如果有錯誤代碼,將其壓入堆棧(有些異常產生錯誤代碼,更具體地表明產生異常的原因)。實地址方式的異常不返回錯誤代碼。

(3)根據向量號獲得中斷服務程序(中斷或異常的處理程序)的段選擇器和指令指針,分別傳送給代碼段寄存器CS和指令指針寄存器EIP。

(4)對于中斷,要設置中斷允許標志IF為0,即禁止進一步的可屏蔽中斷。(5)控制轉移至中斷服務程序入口地址(首地址),開始執行中斷或異常處理程序。

中斷服務程序最后是中斷返回指令IRET。中斷返回指令IRET將斷點地址和標志寄存器出棧恢復,如果壓入了錯誤代碼還需要相應增量堆棧指針,于是控制又返回到斷點指令繼續執行。〔習題7.17〕

IA-32處理器的中斷向量表和中斷描述符表的作用是什么? 〔解答〕

IA-32處理器的中斷向量表和中斷描述符表的作用都是獲取中斷服務程序的入口地址(稱為中斷向量),進而控制轉移到中斷服務程序中。〔習題7.18〕

說明如下程序段的功能:

cli mov ax,0 mov es,ax mov di,80h*4 mov ax,offset intproc;intproc是一個過程名

cld mov es:[di],ax mov ax,seg intproc mov es:[di+2],ax sti 〔解答〕

設置80H號中斷向量。〔習題7.19〕

中斷控制器8259A中IRR,IMR和ISR三個寄存器的作用是什么? 〔解答〕

中斷請求寄存器IRR:保存8條外界中斷請求信號IR0~IR7的請求狀態。Di位為1表示IRi引腳有中斷請求;為0表示該引腳無請求。中斷屏蔽寄存器IMR:保存對中斷請求信號IR的屏蔽狀態。Di位為1表示IRi中斷被屏蔽(禁止);為0表示允許該中斷。

中斷服務寄存器ISR:保存正在被8259A服務著的中斷狀態。Di位為1表示IRi中斷正在服務中;為0表示沒有被服務。〔習題7.20〕

下面是IBM PC/XT機ROM-BIOS中的08號中斷服務程序,請說明各個指令的作用。int08h proc sti push ds push ax push dx ??;日時鐘計時

??;控制軟驅馬達

int 1ch mov al,20h out 20h,al pop ax pop dx pop ds iret int08h endp 〔解答〕

int08h proc far;遠過程

sti;開中斷

push ds;保護現場

push ax push dx ??;日時鐘計時

??;控制軟驅馬達

int 1ch;調用1CH號中斷

mov al,20h;發送EOI中斷結束命令

out 20h,al pop ax;恢復現場

pop dx pop ds iret;中斷返回 int08h endp 〔習題7.21〕

編寫一個程序,將例題7-5的INT 80H內部中斷服務程序駐留內存。然后在調試程序中或其他程序中執行INT 80H,看能否實現其顯示功能。〔解答〕

;代碼段

jmp start;80H內部中斷服務程序:顯示字符串(以0結尾);DS∶DX=緩沖區首地址 new80h proc;過程定義

sti;開中斷

push ax;保護寄存器

push bx push si mov si,offset intmsg new1: mov al,cs:[si];獲取欲顯示字符

cmp al,0;為“0”結束

jz new2 mov bx,0;采用ROM-BIOS調用顯示一個字符

mov ah,0eh int 10h inc si;顯示下一個字符

jmp new1 new2: pop si;恢復寄存器 pop bx pop ax iret;中斷返回

intmsg db 'A Instruction Interrupt!',0dh,0ah,0;字符串(以0結尾)new80h endp;中斷服務程序結束

;主程序

start: mov ax,cs mov ds,ax;設置04H中斷向量

mov dx,offset new80h cli mov ax,2580h int 21h sti mov eax,offset tsrmsg;顯示安裝信息

call dispmsg mov dx,offset start;計算駐留內存程序的長度

add dx,15 shr dx,4;調整為以“節”(16個字節)為單位

mov ax,3100h;程序駐留,返回DOS

int 21h tsrmsg db 'INT 80H Program Installed!',0dh,0ah,0 〔習題7.22〕

完成例題7-2顯示當前日期同樣的功能,請獲得日期數據后轉換成ASCII碼,保存在緩沖區、利用DISPMSG子程序顯示。〔解答〕

;ex0722.asm in DOS include io16.inc.data date byte 'Today is 20xx-yy-zz',0.code start: mov ebx,11 mov al,9;AL=9(準備從9號單元獲取年代數據)

out 70h,al;從70H的I/O地址輸出,選擇CMOS RAM的9號單元

in al,71h;從71H的I/O地址輸入,獲取9號單元的內容,保存在AL mov dl,al

shr al,4;轉換高位BCD碼為ASCII碼

add al,30h mov date[ebx],al;保存到緩沖區

add ebx,1 and dl,0fh;轉換低位BCD碼為ASCII碼

add dl,30h mov date[ebx],dl;保存到緩沖

add ebx,2

mov al,8;AL=8(從8號單元獲取月份數據)

out 70h,al in al,71h mov dl,al

shr al,4;轉換高位BCD碼為ASCII碼

add al,30h mov date[ebx],al;保存到緩沖區

add ebx,1 and dl,0fh;轉換低位BCD碼為ASCII碼

add dl,30h mov date[ebx],dl;保存到緩沖

add ebx,2

mov al,7;AL=7(從7號單元獲取日期數據)

out 70h,al in al,71h mov dl,al

shr al,4;轉換高位BCD碼為ASCII碼

add al,30h mov date[ebx],al;保存到緩沖區

add ebx,1 and dl,0fh;轉換低位BCD碼為ASCII碼

add dl,30h mov date[ebx],dl;保存到緩沖

mov eax,offset date;顯示

call dispmsg exit 0 end start 第8章 常用接口技術 〔習題8.1〕簡答題 〔解答〕

① 方式1可以通過編程產生一個確定寬度的單穩脈沖,故稱工作方式1為可編程單穩脈沖工作方式。

② 因為計數器是先減1,再判斷是否為0,所以寫入0實際代表最大計數值。

③ 通過控制字的D7位來區別:D7=1,該控制字為方式控制字;否則為位控制字。

④ 8255的三種工作方式均可實現輸出數據鎖存,即數據輸出后被保存在8255內部,可以讀取出來,只有當8255再輸出新一組數據時才改變。

⑤ Modem,稱為調制解調器,將數字信號轉換為適合在電話線路上傳送的模擬信號(調制)以及將電話線路的模擬信號轉換為數字信號(解調)。

⑥ 因絕大多數設備只使用RS-232C標準的其中9個信號,所以PC機上就配置9針連接器。⑦ 兩臺微機進行短距離通信,可以不使用調制解調器,直接利用232C接口連接,被稱為零調制解調器(Null Modem)連接。

⑧ UART表示通用異步接收發送器,主要功能是將并行數據轉換為串行數據發送,以及實現串行數據轉換為并行傳送給處理器。

⑨ 采用多路開關,通過微型機控制,把多個現場信號分時地接通到A/D轉換器上轉換,達到共用A/D轉換器以節省硬件的目的。

⑩ 處理器輸出數據都只在輸出指令OUT執行的極短時間內出現在數據總線上,慢速的外設不能及時獲取,所以主機與DAC之間必須連接數據鎖存器。〔習題8.2〕判斷題 〔解答〕

第三篇:微機原理與接口技術習題答案10章

第10章 定時/計數器8253應用設計

1.試分析 8255A方式0、方式1和方式2的主要區別,并分別說明它們適合于什么應用場合。

答:方式0是基本的輸入/輸出,端口A、B、C都可以作為輸入輸出端口。適用于CPU與非智能I/O設備的數據傳輸;

方式1是有聯絡信號的輸入/輸出,端口A、B都可以設定成該方式,此時三個端口的信號線分成了A、B兩組,PC7~PC4用作A組的聯絡信號,PC3~PC0用作B組的聯絡信號。適用于高速CPU與低速I/O設備的數據傳輸;

方式2是雙向傳輸,只有A組端口可以設定成該方式,PC6~PC7用作輸出的聯絡信號,PC4~PC5用作輸入的聯絡信號,PC3用作中斷請求信號。適用于雙機之間數據的并行傳送。

2.8255A的A組設置成方式1輸入,與CPU之間采用中斷方式聯絡,則產生中斷請求信號INTRA的條件是 STBA=

,IBFA=

,INTEA=。

3.如果8255A的端口地址為300H~303H,A組和B組均為方式0,端口A為輸出,端口B為輸入,PC3~PC0為輸入,PC7~PC4為輸出,寫出8255A的初始化程序段;編程實現將從端口C低4位讀入的值從高4位送出。解: MOV DX,303H

MOV AL,10000011B OUT DX,AL MOV DX,302H IN AL,DX MOV CL,4 SHL AL,CL OUT DX,AL 4.在實際應用中經常需要檢測設備的狀態,并進行指示。在8086最小方式系統下,有一片8255A,其分配的端口地址為8F00H~8F07H中的奇地址,外部設備產生的狀態有16個(K15~K0),要求采用4個發光二極管來指示開關量中“1”的個數。(1)畫出8255A - 0 - 的連接圖;(2)編寫程序段實現連續檢測并顯示。解:(1)

8086D8~D158255D0~D7RDRDWRA2A1M/IOBHEA15A11A10A9A8A0A14A13A12A7A6A5A4A3PA0PA1......WRA1PA716位開關量(K15~K0)A0PB0PB1PB7......VCCCSPC3PC2PC1PC0

(2)MOV DX,8F07H

MOV AL,10010010B;端口A、B方式0輸入,端口C方式0輸出 OUT DX,AL NEXT:

L2:

MOV DX,8F03H;從端口B讀取高8位開關量 IN AL,DX XCHG AL,AH MOV DX,8F01H;從端口A讀取低8位開關量 IN AL,DX MOV BX,AX XOR AL,AL MOV CX,16 CLC SHL BX,1

- 1 -

L1:

JNC L1 INC AL LOOP L2 MOV DX,8F05H;從端口C送出 OUT DX,AL JMP NEXT;進行下一次檢測

5.利用IBM PC系統機的總線槽,開發由一片8255A構成的子系統,8255A端口地址為260H~263H,編程實現產生如圖10.20所示的8個信號(各個信號的節拍不必嚴格相等)。

Y0Y1Y7?

圖10.20 要求產生的信號波形

解:8355A與IBM PC機總線的連接框圖如下:

可將8255A的端口A作為要產生的信號的輸出端口,設定為方式0輸出,端口B和端口C不做使用,均設定為方式0輸出。程序段如下:

MOV

DX,263H

;設定8255A的工作方式

- 2 -

MOV

AL,10000000B

OUT

DX,AL

MOV

DX,260H

;產生指定信號

XOR

AL,AL

OUT

DX,AL REP:

MOV

AL,80H

MOV

CX,7 REP1:

OUT

DX,AL

SAR

AL,1

LOOP REP1

MOV

CX,8 REP2:

SHL

AL,1

OUT

DX,AL

LOOP REP2

JMP

REP

6.在實際應用中,經常會遇到要求輸入多個數據量,這時需要用到多路開關,如圖10.21表示八選一的邏輯框圖及其真值表。現有8組16位開關量數據(無符號數),要求通過一片8255A(端口地址為260H~263H)分時輸入到CPU(8088最小方式系統)中,并找出它們中的最大值,并通過4個發光二極管指示其序號(燈亮表示“1”)。畫出8255A的連接圖,并編程實現。

解:由于開關量是16為數據,故可以將8255A的PA端與PB端設定為方式0,分別讀取開關量的低八位和高八位,以PC低三位端口的控制八選一電路的輸出依次從X0到X7,- 3 -

八選一x0x1x2x3x4x5x6x7ys0s1s2s2s1s00 0 00 0 10 1 00 1 11 0 01 0 11 1 01 1 1yx0x1x2x3x4x5x6x7圖10.21 八選一邏輯電路使用PC端口的高八位輸出最大開關量的序號(該序號為1~8),控制發光二極管的亮滅以碼指示序號。連接圖如下:

程序段如下:

MOV DX,263H

MOV AL,10011010B;設定工作方式,PA,PB均工作于方式0,PA、PB為輸入,PC為輸出

OUT

DX,AL

MOV

CX,8

XOR

BX,BX

MOV

SI,0

;SI表示輸入開關量的序號 ST1:

MOV

DX,262H

OUT

DX,SI

MOV

DX,260H

;將開關量數據的低八位寫入AL

IN

AL,DX

MOV

DX,261H

;將開關量數據的高八位寫入AH

IN

AH,DX

- 4 -

CMP

BX,AX

JA

NEXT

MOV

BX,AX

;將當前最大值保存在BX中

INC

SI

PUSH

SI

;將當前最大值的序號壓棧 NEXT:

INC

SI

LOOP

ST1

POP

SI

XOR

AX,AX

MOV

AX,SI

MOV

CL,4

ROL

AL,CL

MOV

DX,262H

OUT

DX,AL

;最大值的序號出棧

;將最大值的序號(4位)移至AL的高四位 的高四位輸出最大值序號 - 5 -

;PC

第四篇:微機原理與接口技術習題答案2

第2章 8086 CPU結構與功能

1.微處理器內部結構由哪幾部分組成?闡述各部分的主要功能。解:微處理器內部結構由四部分組成:

(1)算術邏輯運算單元ALU:完成所有的運算操作;

(2)工作寄存器:暫存尋址信息和計算過程中的中間結果;

(3)控制器:完成指令的讀入、寄存和譯碼,并產生控制信號序列使ALU完成指定操作;

(4)I/O控制邏輯:處理I/O操作。

2.微處理器級總線有哪幾類?各類總線有什么作用? 解:微處理器級總線有三類:

(1)數據總線:傳送信息;

(2)地址總線:傳送地址碼;

(3)控制總線 傳送控制信號。

3.為什么地址總線是單向的,而數據總線是雙向的?

解:地址碼只能由CPU生成。而數據需要在CPU和存儲器之間傳輸。4.8086/8088微處理器內部有哪些寄存器?其主要作用是什么?

解:8086CPU內部有14個16位寄存器,其中8個通用寄存器(4數據寄存器AX、BX、CX、DX,4地址指針/變址寄存器SI、DI、SP、BP),4個段寄存器(CS、DS、ES、SS),2個控制寄存器(指令指針IP,微處理器狀態字PSW)。

應該注意的是:可以在指令中用作為地址指針的寄存器有:SI、DI、BP和BX;在微處理器狀態字PSW中,一共設定了9個標志位,其中6個標志位用于反映ALU前一次操作的結果狀態(CF,PF,AF,ZF,SF,OF),另3個標志位用于控制CPU操作(DF,IF,TF)。

5.如果某微處理器有20條地址總線和16條數據總線:

(1)假定存儲器地址空間與I/O地址空間是分開的,則存儲器地址空間有多大?

(2)數據總線上傳送的有符號整數的范圍有多大? 解:(1)存儲器地址空間為:220?1MB

1(2)有符號數范圍為: ?2~2?1,即 -32768~32767 6.將十六進制數62A0H與下列各數相加,求出其結果及標志位CF、AF、SF、ZF、OF

15和PF的值:

(1)

1234H;(2)

4321H;(3)

CFA0H;(4)

9D60H 解:(1)

74D4H

CF=0 AF=0 SF=0 ZF=0 OF=0 PF=1

(2)

A5C1H CF=0 AF=0 SF=1 ZF=0 OF=1 PF=0

(3)

3240H

CF=1 AF=0 SF=0 ZF=0 OF=0 PF=0

(4)

0000H

CF=1 AF=0 SF=0 ZF=1 OF=0 PF=1 7.從下列各數中減去4AE0H,求出其結果及標志位CF、AF、SF、ZF、OF和PF的值:

(1)1234H;(2)5D90H;(3)9090H;(4)EA04H 解:(1)

C754H

CF=1 AF=0 SF=1 ZF=0 OF=0 PF=0(2)

12B0H

CF=0 AF=0 SF=0 ZF=0 OF=0 PF=0(3)

45B0H

CF=0 AF=0 SF=0 ZF=0 OF=1 PF=0

(4)

9F24H

CF=0 AF=0 SF=1 ZF=0 OF=0 PF=1 9.寫出下列存儲器地址的段地址、偏移地址和物理地址:(1)2134:10A0;(2)1FA0:0A1F;(3)267A:B876 解:物理地址=段地址*10H+偏移地址

(1)段地址:2134H,偏移地址:10A0H,物理地址:223E0H(2)段地址:1FA0H,偏移地址:0A1FH,物理地址:2041FH(3)段地址:267AH,偏移地址:B876H,物理地址:32016H 10.給定一個數據的有效地址為2359H,并且(DS)=490BH,求該數據的物理地址。解:物理地址=段地址*10H+偏移地址

物理地址=490BH +2359H = 4B409H 11.如果在一個程序段開始執行之前,(CS)=0A7F0H,(IP)=2B40H,求該程序段的第一個字的物理地址。

解:物理地址=段地址*10H+偏移地址

物理地址=CS*10H+IP = AAA40H 12.IBM PC有哪些寄存器可用來指示存儲器的地址? 解:變址寄存器SI,DI,堆棧指針SP,BP,另外還有BX。

第五篇:微機原理與接口技術習題答案4

第4章 匯編語言程序設計

1.已知在BUF的起始處保存有N個字符的ASCII碼,編寫匯編語言程序實現,將這組字符串傳送到緩沖區BUFR中,并且使字符串的順序與原來的順序相反。解:BUF

BUFR

MOV CX, N LEA SI, BUF LEA DI, BUFR ADD DI,CX DEC DI L1: MOV AL,[SI] MOV [DI],AL INC SI DEC DI LOOP L1

2.利用移位、傳送和相加指令實現AX的內容擴大10倍。

解:將擴大后的結果放在DX:AX中,注意到10×AX=8×AX+2×AX。XOR SHL RCL DX,DX AX, 1 DX, 1 DB “BONJOUR_BELLE” DB 100 DUP(?)MOV BX,AX MOV SHL RCL SHL RCL CX,DX AX, 1 DX, 1 AX, 1 DX, 1 ADD ADC AX, BX DX, CX 3.在緩沖區VAR中連續存放著3個16位的無符號數,編寫程序實現將其按遞增關系排列;如果VAR中保存的為有符號數,則再編寫程序實現將其按遞減關系排列。解:VAR DW 1236,-432,3900 XOR SI,SI MOV AX,VAR[SI] CMP AX, VAR[SI+2] JAE L1 XCHG AX, VAR[SI+2] L1:

CMP AX, VAR[SI+4] JAE L2 XCHG AX, VAR[SI+4] L2: MOV VAR[SI], AX MOV AX,VAR[SI+2] CMP AX, VAR[SI+4] JAE L3 XCHG AX, VAR[SI+4] L3:

MOV VAR[SI+2], AX 4.編寫程序段實現將AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,則得到的(DX)=10110110 10011001B。解:利用移位指令完成。

L1: SHR AL,1 RCR DX,1 XOR DX,DX MOV CX,8

SHR BL,1 RCR DX,1 LOOP L1 5.在變量VAR1和VAR2中分別保存有兩個字節型的正整數,編寫完整的匯編語言程序實現:

(1)當兩數中有一個奇數時,將奇數存入VAR1,偶數存入VAR2;

(2)當兩數均為奇數時,兩個變量的內容不變;(3)當兩數均為偶數時,兩數縮小一倍后存入原處。

解:當VAR1為奇數時,不論VAR2的奇偶性,這兩個單元的內容均不變;只有當VAR1為偶數時,如果VAR2為奇數,則VAR1與VAR2內容交換;如果VAR2為偶數,則兩數縮小一倍后存入原處。DATA SEGMENT

VAR1

DB 28

VAR2 DB 36 DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS,AX MOV ES, AX MOV AL,VAR1 MOV BL,VAR2 TEST AL,1 JZ EVEN1 JMP OVER

EVEN1:

TEST BL,1

JZ

EVEN2

MOV VAR1,BL MOV JMP VAR2,AL OVER EVEN2:

SHR MOV SHR MOV AL,1 VAR1,AL BL,1 VAR2,BL

OVER:

MOV AH,4CH MOV AL,0 INT ENDS END START 21H CODE

6.已知在字變量VAR1、VAR2和VAR3中保存有3個相同的代碼,但有一個錯碼,編寫程序段找出這個錯碼,并將它送到AX,其地址送SI;如果3個代碼都相同,則在AX中置-1標志。解:在數據段中定義:

VAR1 DW 5A34H VAR2 DW 5A35H VAR3 DW 3A34H

在代碼段中編寫程序段:

MOV AX,-1 MOV BX,VAR1 CMP BX,VAR2 JZ

L2 CMP BX,VAR3 JZ

L1 MOV AX,BX LEA SI,VAR1 JMP OVER L1: MOV AX,VAR2 LEA SI,VAR2 JMP OVER L2: CMP BX,VAR3 JZ

OVER MOV AX,VAR3 LEA SI,VAR3 OVER: 7.分析下列程序段的功能:

MOV CL,04 SHL DX,CL MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL 解:程序段完成DX:AX組成的32位無符號數左移4位,低位補零(也即除以16)。8.下列程序段執行后,求BX寄存器的內容:

MOV CL,3 MOV BX,0B7H ROL BX,1 ROR BX,CL 解:實際上完成BX內容循環右移2位,因此,BX寄存器的內容為C02DH。9.下列程序段執行后,求BX寄存器的內容:

MOV CL,5 MOV BX,7D5CH SHR BX,CL 解:完成BX內容邏輯右移5位,因此,BX寄存器的內容為03EAH。10.將BUFFERS中N個字按相反順序傳遞到BUFFERT中。解:

LEA SI,BUFFERS LEA DI,BUFFERT MOV CX,N ADD DI,N ADD DI,N SUB DI,2 L1: MOV AX,[SI] MOV [DI],AX ADD SI,2 SUB DI,2 LOOP L1 11.數組ARRAY中存放有一組字型數據,前兩個字節存放數據長度(5的倍數)。為給這個數組中的數據進行加密保護,每5個數據取出一個數據進行加密處理:奇數位進行取反,偶數位不變,例如對數據0110 1100 1011 0001B加密后變成1100 0110 0001 1011B,編寫加密程序encrpytion 和解密程序 unencrpytion。

解:約定從第一個數據開始,每5個數據為一組,每組中的第一個數據采取加密/解密處理。由于加密算法采用的是取反操作,解密算法也采用取反操作,因此解密和解密算法是同一個程序。

ENCRPYTION PROC NEAR LEA SI,ARRAY

XOR DX,DX

MOV AX,[SI]

MOV BX,5

DIV BX

MOV CX, AX

ADD SI, 2 L1:

MOV AX, [SI]

XOR AX,0AAAAH

MOV [SI], AX

ADD SI,10

LOOP L1

RET ENCRPYTION ENDP

13.設BUF中存放有N個無符號數(或有符號數),編程實現求它們的最小值(存入AX)和最大值(存入DX)。

解:BUF存放有N個無符號數的程序如下: MOV CX,N-1 LEA SI,BUF MOV AX,[SI] MOV DX,AX ADD SI,2 L1: CMP AX,[SI] JBE NOCHG1 XCHG AX,[SI] NOCHG1: CMP DX,[SI] JAE NOCHG2 XCHG DX,[SI] NOCHG2: ADD SI,2 LOOP L1 如果BUF中存放的是有符號數,則只需要將程序中的兩行內容修改:

JBE NOCHG1 JAE NOCHG2

改成:JLE NOCHG1 改成:JGE NOCHG2

14.設BUFFER中存放有N個無符號(第1個字節存放緩沖區的長度),編程實現將其中的0元素抹去,并更新其長度。

解:設BUFFER中存放的是字節型數據。采用雙指針方法:SI為讀指針,DI為寫指針,從低地址開始,內存中讀出一個字節,如果不為0,則寫入內存;如果為0,則不進行寫操作。

LEA SI, BUFFER XOR CX,CX MOV CL, [SI] INC SI MOV DI, SI XOR BH,BH XOR AL,AL L1: CMP [SI],AL JZ L2 MOV BL,[SI] MOV [DI],BL INC DI INC BH L2: INC SI LOOP L1 MOV BUFFER,BH 16.編寫一個子程序實現統計AL中1的個數,然后檢測出字節型緩沖區BUF中0和1個數相等的元素個數。

解:統計AL中1的個數,只需將AL右移,移出的一位內容進行累加,子程序為: COUNTBYTE PROC NEAR

PUSH AX

PUSH CX

MOV CX,8

XOR BL,BL COU1:

SHR AL,1

ADC BL,0

LOOP COU1

POP CX

POP AX

RET COUNTBYTE ENDP 在此基礎上,可以檢測出字節型緩沖區BUF中0和1個數相等的元素個數,即一個字節中有4個1。設BUF中有N個字節型數據,結果保持在BH中。

MOV CX,N LEA SI, BUF XOR BH,BH L1: MOV AL,[SI] CALL COUNTBYTE CMP BL,4 JNZ L2 INC BH L2: INC SI LOOP L1

19.在緩沖區BUFFER中,第1個字節存放數組的長度(<256),從第2個字節開始存放字符的ASCII碼,編寫子程序完成在最高位給字符加上偶校驗。解:STACK SEGMENT STACK 'STACK'

DW 100H DUP(?)

TOP LABEL BYTE STACK ENDS

DATA SEGMENT BUFFER DB 3

DB 'ABC'

DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START:

MOV AX,STACK

MOV SS,AX

LEA SP,TOP

MOV AX,DATA

MOV DS,AX

MOV ES,AX

LEA DI,BUFFER

XOR CX,CX

MOV CL,[DI]

INC DI

CALL SETEVEN

MOV AH,4CH

MOV AL,0

INT 21H SETEVEN

PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DI SETEVEN1:

MOV AL,[DI]

CALL COUNTBYTE

;加偶校驗子程序

;返回DOS;首字節為字符串長度;字符串

AND BL,01H

JZ SETEVEN2

OR AL,80H

MOV [DI],AL SETEVEN2:

INC DI

LOOP SETEVEN1

POP DI

POP CX

POP BX

POP AX

RET SETEVEN

ENDP COUNTBYTE PROC NEAR

PUSH AX

PUSH CX

MOV CX,8

XOR BL,BL COU1:

SHR AL,1

ADC BL,0

LOOP COU1

POP CX

POP AX

RET COUNTBYTE ENDP CODE ENDS

END START 20.編寫程序完成求多位數(N個字)的絕對值。21.已知斐波那契數列的定義為:F1數列前n項的子程序。

?1,F2?1,Fi?Fi?1?Fi?2(i?3),編寫求該解:設獎斐波那契數列存放在字變量RESULT中。在數據段中定義

RESULT DW 100H DUP(?)

在代碼段中編寫子程序 FIBONACCI PROC NEAR

XOR DI,DI

MOV RESULT[DI],1

;前兩個數為1

MOV RESULT[DI+2],1

ADD DI,4

MOV CX,N L1:

MOV AX, RESULT[DI-4]

ADD AX, RESULT[DI-2]

MOV RESULT[DI],AX

ADD DI,2

LOOP L1

RET FIBONACCI ENDP

22.編寫程序實現循環顯示10條信息,保存每條信息的變量分別為INFOM1~INFORM10。解:在數據段中定義變量:

TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5

DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10 在代碼段中編寫程序段:

MOV XOR MOV MOV CX,10 SI,SI DX,TABLE[SI] AH,9 L1:

INT ADD CALL LOOP 21H SI,2 WAIT L1 這里,WAIT為延時子程序,用于在顯示信息之間的停頓。

23.編寫程序實現將包含20個數據的數組ARRAY分成兩個數組:正數數組ARRAYP和負數數組ARRAYN,并分別將這兩個數組中數據的個數顯示出來。

解:先編寫一個子程序DISPALD,完成以3位十進制數形式顯示出AL的內容。

DISPALD PROC NEAR PUSH AX PUSH CX PUSH DX XOR AH,AH MOV CL,100 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 INT 21H POP AX MOV AL,AH XOR AH,AH MOV CL,10 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 INT 21H POP AX MOV DL,30H ADD DL,AH MOV AH,2 INT 21H POP DX POP CX POP AX RET DISPALD ENDP

在此基礎上,根據題目要求,需要用到3個指針:SI指向源數組ARRAY,DI指向正數數組ARRAYP,BX指向負數數組ARRAYN。

MOV XOR LEA LEA LEA MOV AND JS MOV INC INC JMP MOV INC INC INC CX,20 DX,DX SI,ARRAY DI,ARRAYP BX,ARRAYN AL,[SI] AL,AL L2 [DI],AL DI DL L3 [BX],AL BX DH SI L1:

L2:

L3:

LOOP MOV CALL MOV CALL L1 AL,DL DISPALD AL,DH DISPALD 24.編寫程序實現求緩沖區BUFFER的100個字中的最小偶數(存入AX)。解:設BUFFER中存放的是有符號數。

L1:

L2: MOV CX,100 LEA SI,BUFFER MOV AX, 7FFFH AND WORD PTR [SI],1 JNZ L2 CMP [SI],AX JGE L2 MOV AX,[SI] ADD SI,2 LOOP L1

225.編寫程序實現求級數1解:BL用于存放項數。

?22???n2??的前n項和剛大于2000的項數n。

STACK SEGMENT STACK 'STACK'

DW 100H DUP(?)TOP LABEL WORD STACK ENDS DATA SEGMENT

DB 100H DUP(?)DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START:

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV AX,STACK

MOV SS,AX

LEA SP,TOP

MOV BL,1

MOV CX,0 COUNT:

MOV AL, BL

MUL BL

ADD CX,AX

CMP CX,2000

JA EXIT

INC BL

JMP COUNT EXIT:

26.定義一條宏指令,實現將指定數據段的段地址傳送到段寄存器ES或DS的功能。解:

27.定義一條宏指令,實現從鍵盤中輸入一個字符串(利用INT 21H的09號功能)。28.定義一條宏指令,實現在屏幕上輸出回車、換行。29.利用其它指令完成與下列指令一樣的功能:

(1)REP MOVSB;

(3)REP STOSB;

解:設DF=0(1)

L1: MOV AL,[SI]

MOV ES:[DI],AL INC INC SI DI

(2)REP LODSB;(4)REP SCASB。

LOOP L1(2)

L1: MOV AL,[SI] INC SI LOOP L1(3)

L1: MOV ES:[DI],AL

INC DI LOOP L1(4)

L1: MOV AL,[SI]

CMP AL,ES:[DI] INC INC SI DI LOOP L1 30.設在數據段中定義了:

STR1 DB ‘ASSEMBLE LANGUAGE’ STR2 DB 20 DUP(?)利用字符串指令編寫程序段實現:

(1)從左到右將STR1中的字符串傳送到STR2;(2)從右到左將STR1中的字符串傳送到STR2;(3)將STR1中的第6個和第7個字節裝入DX;

(4)掃描STR1字符串中有無空格,如有則將第一個空格符的地址傳送到SI。解: STR1中有17個字符(含一個空格),設DS和ES均指向STR1和STR2所在的段。(1)

CLD MOV LEA LEA REP MOV LEA LEA CX,17 SI,STR1 DI,STR2 MOVSB CX,17 SI,STR1 DI,STR2(2)

ADD DEC MOV MOV DEC INC LOOP LEA MOV MOV LEA MOV CMP JZ INC LOOP SI,CX SI AL,[SI] [DI],AL SI DI L1 SI,STR1 DX,[SI+6] CX,17 SI,STR1 AL,20H [SI], AL L2 SI L1 L1:

(3)

(4)

L1:

L2:

31.設在數據段中定義了:

STRING DB ‘Today is Sunday & July 16, 2000’

編寫程序實現將STRING中的’&’用’/’代替。解:STRING中保存了30個字符。

MOV LEA MOV CMP JNZ MOV INC LOOP CX,30 SI,STRING AL,’&’ [SI],AL L2 BYTE PTR [SI],’/’ SI L1 L1:

L2:

32.分析下列程序段完成的功能:

MOV CX,100 LEA SI,FIRST LEA DI,SECOND REP MOVSB 解:將緩沖區FIRST中100個字節傳送到SECOND中。33.分析下列程序段:

LEA DI,STRING MOV CX,200 CLD MOV AL,20H REPZ SCASB JNZ FOUND JMP NOT_FOUND 問:轉移到FOUND的條件。

解:在緩沖區STRING中搜索非空格字符,如果有非空格則轉到FOUND,如果200個單元中都是空格,則轉到NOT_FOUND。

34.設在數據段的變量OLDS和NEWS中保存有5個字節的字符串,如果OLDS字符串不同于NEWS字符串,則執行NEW_LESS,否則順序執行程序。解:設DS和ES均指向字符串OLDS和NEWS所在的段。CLD MOV

35.編程實現將STRING字符串中的小寫字母變換成大寫字母。解:設STRING中的字符個數為N。

LEA LEA REPZ JNZ CX,5 SI,OLDS DI,NEWS CMPSB NEW_LESS

MOV LEA MOV AND INC CX,N SI,STRING AL,5FH [SI],AL SI L1:

LOOP L1 36.設在數據段中定義了:

STUDENT_NAME DB 30 DUP(?)STUDENT_ADDR DB 9 DUP(?)STUDENT_PRINT DB 50 DUP(?)編寫程序實現:

用空格符清除緩沖區STUDENT_PRINT; 在STUDENT_ADDR中查找第一個’_’字符; 在STUDENT_ADDR中查找最后一個’_’字符;

如果STUDENT_NAME中全為空格符,則STUDENT_PRINT全存入’*’;

將STUDENT_NAME傳送到STUDENT_PRINT的前30個字節中,將STUDENT_ADDR傳送到STUDENT_PRINT的后9個字節中。

37.(上機題)編寫程序實現,將緩沖區BUFFER中的100個字按遞增排序,并按下列格式順序顯示:

數據1 <原序號> 數據2 <原序號> ??

38.(上機題)按同余法產生一組隨機數N(1

Total <總人數> A:

<人數1> B:

<人數2> C:

<人數3> D:

<人數4> E:

<人數5> F:

<人數6>

39.(上機題)編寫程序實現下列5項功能,通過從鍵盤輸入1~5進行菜單式選擇:

(1)按數字鍵“1”,完成將字符串中的小寫字母變換成大寫字母。用戶輸入由英文大小寫字母或數字0~9組成的字符串(以回車結束),變換后按下列格式在屏幕上顯示:

<原字符串>例如:abcdgyt0092 <新字符串>

ABCDGYT0092 按任一鍵重做;按Esc鍵返回主菜單。

(2)按數字鍵“2”,完成在字符串中找最大值。用戶輸入由英文大小寫字母或數字

0~9組成的字符串(以回車結束),找出最大值后按下列格式在屏幕上顯示:

<原字符串>

The maximum is <最大值>.

按任一鍵重做;按Esc鍵返回主菜單。

(3)按數字鍵“3”,完成輸入數據組的排序。用戶輸入一組十進制數值(小于255),然后變換成十六進制數,并按遞增方式進行排序,按下列格式在屏幕上顯示:

<原數值串>

<新數值串> 按任一鍵重做;按Esc鍵返回主菜單。

(4)按數字鍵“4”,完成時間的顯示。首先提示用戶對時,即改變系統的定時器

HH:MM:SS(以冒號間隔,回車結束),然后在屏幕的右上角實時顯示出時

間:HH:MM:SS。

按任一鍵重新對時;按Esc鍵返回主菜單。

(5)按數字鍵“5”,結束程序的運行,返回操作系統。解:

※主程序的編程思路: 此程序共5個功能,可采用跳轉表法來實現多路分支結構程序設計。現將這5個程序段,各程序段的首地址分別標號為G1,G2,G3,G4,G5。將5個程序段的入口地址做成表TABLE放入數據段,程序根據給定的參數計算出欲轉入的程序段的首地址在TABLE中的位置后,取出該地址,跳轉至該程序段。

首先,通過調用子程序MENU,設置顯示器,并輸出提示文檔。接著,讀取‘1’-‘5’之間的ASCII表示數。然后,通過跳轉表TABLE實現由輸入參數轉入相應的程序段。由于表中按“字”存放數據,則每個數據的位移量是:0、2、4、6、8。對于輸入參數N,計算位移量的公式是N=(N-1)*2。

當輸入‘1’時,跳轉到標號G1。調用子程序CHGLTR,完成將輸入字符串中的小寫字母變換成大寫字母。用戶按鍵,若為ESC,則轉到主程序段首調用MENU,否則,轉到標號G1;

當輸入‘2’時,跳轉到標號G2。調用子程序MAXLTR,完成在輸入字符串中找最大值。用戶按鍵,若為ESC,則轉到主程序段首調用MENU,否則,轉到標號G2;

當輸入‘3’時,跳轉到標號G3。調用子程序SORTNUM,完成輸入數據組的排序。用戶按鍵,若為ESC,則轉到主程序段首調用MENU,否則,轉到標號G3。

當輸入‘4’時,跳轉到標號G4。調用子程序TIMCHK,完成時間的顯示。用戶按鍵,若為ESC,則轉到主程序段首調用MENU,否則,轉到標號G4。

當輸入‘5’時,跳轉到標號G5。結束程序的運行,返回操作系統。其流程框圖見圖3-1。

下載微機原理與接口技術習題解答(錢曉婕)word格式文檔
下載微機原理與接口技術習題解答(錢曉婕).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    微機原理與接口技術試題答案

    微機原理與接口技術試題答案 一、填空題(20*1) 1、微機系統由(硬件系統)和(軟件系統)兩部分組成。 2、8086有( 20 )位地址線,存儲器容量為( 1M)B。 3、8086CPU 內部組成結構從功能上講,......

    微機原理與接口技術小結范文大全

    微機原理與接口技術基礎 1.為什么在流水CPU中,將一條指令從取指到執行結束的任務分割為一系列子任務,并使各子任務在流水線的各個過程段并發地執行,從而使流水CPU具有更強大的......

    微機原理與接口技術(第二版)習題答案

    第1章1.1 微處理器、微型計算機和微型計算機系統三者之間有什么不同? 解: 把CPU(運算器和控制器)用大規模集成電路技術做在一個芯片上,即為微處理器。微處理器加上一定數......

    微機原理與接口技術 顧暉習題參考答案

    微機原理與接口技術 答案 目錄 第1章習題答案 ...................................................................................... 2 第2章習題答案 .................

    微機原理與接口技術試題及答案

    一、 填空題(每空 1 分,共 15 分) 得分 評閱人 1.RESET信號到來后8088/86的CS和IP 分別為 _FFFF_H 和_0000_H。 2. 在特殊全嵌套方式下,8259可響應 同級或高級 中斷請求。 3......

    微機原理與接口技術 實驗報告一

    評閱微機原理與接口技術實驗報告一姓名匡越學號1715211016時間地點實驗題目一、實驗目的1.熟悉Keil軟件使用2.熟悉MCS-51指令3.學習簡單程序的調試方法二、實驗說明通過實驗......

    微機原理與接口技術實驗總結

    微機原理與接口技術實驗總結 11107108徐寒黎 一、 實驗內容以及設計思路 1、①試編寫一程序,比較兩個字符串STRING1、 STRING2 所含字符是否相同,若相同輸出“MATCH”,若不......

    微機原理與接口技術及其課程設計心得體會

    微機原理與接口技術及其課程設計心得體會 本學期的微機原理和接口技術及其課程設計都已經結束。在這個過程中,我們有所付出,也有所回報,讓我感受頗多。 對于《微機原理與接口技......

主站蜘蛛池模板: 久久大香香蕉国产拍国| 国产成本人片无码免费| 天天做天天爱天天综合网2021| 国产成人精品免费视频大全| 久久久久久欧美精品se一二三四| 无码人妻精品一区二区三区99不卡| 女人被黑人狂躁c到高潮小说| 久久精品国产自清天天线| 国産精品久久久久久久| 久久久久久国产精品美女| 亚洲中文有码字幕日本第一页| 四虎www永久在线精品| 欧美日韩视频在线第一区| 狠狠躁天天躁中文字幕| 国产午夜福利片1000无码| 人妻免费久久久久久久了| 亚洲日韩欧美在线成人| 无码人妻精品一区二区三| 日韩av一国产av一中文字慕| 无码中文国产不卡视频| 成人无码视频在线观看大全| 少妇被粗大的猛烈进出| 久久久午夜成人噜噜噜| 人妻无码一区二区不卡无码av| 久久综合网欧美色妞网| 国产av成人精品播放| 全黄h全肉边做边吃奶视频| 亚洲综合天堂婷婷五月| 日韩中文无码有码免费视频| 人妻无码αv中文字幕久久琪琪布| 草草浮力地址线路①屁屁影院| 男受被做哭激烈娇喘gv视频| av大片在线无码免费| 护士奶头又大又软又好摸| 精品伊人久久久大香线蕉下载| 青青草无码免费一二三区| 精品成人一区二区三区四区| 亚洲乱码精品久久久久..| www插插插无码免费视频网站| 丰满爆乳无码一区二区三区| 久久精品国产99国产精品澳门|