微機原理與接口技術(shù)+第四版+錢曉捷主編+課后習題答案_第1頁
微機原理與接口技術(shù)+第四版+錢曉捷主編+課后習題答案_第2頁
微機原理與接口技術(shù)+第四版+錢曉捷主編+課后習題答案_第3頁
微機原理與接口技術(shù)+第四版+錢曉捷主編+課后習題答案_第4頁
微機原理與接口技術(shù)+第四版+錢曉捷主編+課后習題答案_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第1章微型計算機系統(tǒng)

〔習題1.1)簡答題

①處理器每個單位時間可以處理的二進制數(shù)據(jù)位數(shù)稱計算

機字長。

②總線信號分成三組,分別是數(shù)據(jù)總線、地址總線和控

制總線。

③PC機主存采用DRAM組成。

④高速緩沖存儲器Cache是處理器與主存之間速度很快

但容量較小的存儲器。

⑤ROM-BIOS是“基本輸入輸出系統(tǒng)”,操作系統(tǒng)通過

對BIOS的調(diào)用驅(qū)動各硬件設備,用戶也可以在應用程序中

調(diào)用BIOS中的許多功能。

⑥中斷是CPU正常執(zhí)行程序的流程被某種原因打斷、并

暫時停止,轉(zhuǎn)向執(zhí)行事先安排好的一段處理程序,待該處理

程序結(jié)束后仍返回被中斷的指令繼續(xù)執(zhí)行的過程。

⑦主板芯片組是主板的核心部件,它提供主板上的關(guān)鍵

邏輯電路。

⑧MASM是微軟開發(fā)的宏匯編程序。

⑨指令的處理過程。處理器的“取指一譯碼一執(zhí)行周期”

是指處理器從主存儲器讀取指令(簡稱取指),翻譯指令代

碼的功能(簡稱譯碼),然后執(zhí)行指令所規(guī)定的操作(簡稱

執(zhí)行)的過程。

⑩機器語言層,即指令集結(jié)構(gòu)。

(學生很多認為是:匯編語言層。前4章主要涉及匯編語

言,但本書還有很多處理器原理等內(nèi)容)

〔習題1.4)

CPU:CPU也稱處理器,是微機的核心。它采用大規(guī)模

集成電路芯片,芯片內(nèi)集成了控制器、運算器和若干高速存

儲單元(即寄存器)。處理器及其支持電路構(gòu)成了微機系統(tǒng)

的控制中心,對系統(tǒng)的各個部件進行統(tǒng)一的協(xié)調(diào)和控制。

存儲器:存儲器是存放程序和數(shù)據(jù)的部件。

外部設備:外部設備是指可與微機進行交互的輸入

(Input)設備和輸出(Output)設備,也稱I/O設備。I/O設

備通過I/O接口與主機連接。

總線:互連各個部件的共用通道,主要含數(shù)據(jù)總線、地址

總線和控制總線信號。

〔習題1.5)

通用微處理器:適合較廣的應用領(lǐng)域的微處理器,例如裝

在PC機、筆記本電腦、工作站、服務器上的微處理器。

單片機:是指通常用于控制領(lǐng)域的微處理器芯片,其內(nèi)部

除CPU外還集成了計算機的其他一些主要部件,只需配上

少量的外部電路和設備,就可以構(gòu)成具體的應用系統(tǒng)。

DSP芯片:稱數(shù)字信號處理器,也是一種微控制器,其

更適合處理高速的數(shù)字信號,內(nèi)部集成有高速乘法器,能夠

進行快速乘法和加法運算。

嵌入式系統(tǒng):利用微控制器、數(shù)字信號處理器或通用微處

理器,結(jié)合具體應用構(gòu)成的控制系統(tǒng)。

(習題1.6)

8086奠定了基本的16位指令集,80286提供了保護方式

的各種指令,80386將指令集全面提升為32位,80486融入

了浮點數(shù)據(jù)處理指令,奔騰系列陸續(xù)增加了多媒體指令

MMX、SSE、SSE2和SSE3,最新的奔騰4處理器還支持

64位指令集。

(習題1.7)

助記符:人們采用便于記憶、并能描述指令功能的符號來

表示機器指令操作碼,該符號稱為指令助記符。

匯編語言:用助記符表示的指令以及使用它們編寫程序的

規(guī)則就形成匯編語言。

匯編語言程序:用匯編語言書寫的程序就是匯編語言程

序,或稱匯編語言源程序。

匯編程序:匯編語言源程序要翻譯成機器語言程序才可以

由處理器執(zhí)行。這個翻譯的過程稱為“匯編”,完成匯編工

作的程序就是匯編程序(Assembler)o

(習題1.8)

路徑:操作系統(tǒng)以目錄形式管理磁盤上的文件,文件所在

的分區(qū)和目錄就是該文件的路徑。

絕對路徑:從根目錄到文件所在目錄的完整路徑稱為“絕

對路徑”。是保證文件唯一性的標示方法。

相對路徑:從系統(tǒng)當前目錄到文件所在目錄的路徑稱為相

對路徑。

當前目錄:用戶當前所在的目錄就是當前目錄。

指明的路徑不正確,或者執(zhí)行了另外一個同名的文件。

〔習題1.9)

每18個月,集成電路的性能將提高一倍,而其價格將降

低一半。(1965年,Intel公司的創(chuàng)始人之一摩爾預言:集成

電路上的晶體管密度每年將翻倍?,F(xiàn)在這個預言通常表達

為:每隔18個月硅片密度(晶體管容量)將翻倍;也常被

表達為:每18個月,集成電路的性能將提高一倍,而其價

格將降低一半。)

不能。由于電子器件的物理極限在悄然逼近,摩爾定律不

會永遠持續(xù)。

(習題1.10)

采用二進制形式表示數(shù)據(jù)和指令。指令由操作碼和地址碼

組成。

將程序和數(shù)據(jù)存放在存儲器中,計算機在工作時從存儲器

取出指令加以執(zhí)行,自動完成計算任務。這就是“存儲程序”

和“程序控制”(簡稱存儲程序控制)的概念。

指令的執(zhí)行是順序的,即一般按照指令在存儲器中存放的

順序執(zhí)行,程序分支由轉(zhuǎn)移指令實現(xiàn)。

計算機由存儲器、運算器、控制器、輸入設備和輸出設備

五大基本部件組成,并規(guī)定了5部分的基本功能。

【習題1.11)

最上層是用戶層。

第5層是高級語言層。

第4層是匯編語言層。

第3層是操作系統(tǒng)層。

第2層是機器語言層。

第1層是控制層。

第0層是數(shù)字電路層。

普通計算機用戶和軟件人員對計算機系統(tǒng)的認識并不一

樣。普通計算機用戶看到的計算機,也就是我們最熟悉的計

算機,屬于用戶層,而軟件人員看到的屬于高級語言層或是

匯編語言層。

(習題1.12)

系列機是指在一個廠家生產(chǎn)的具有相同計算機結(jié)構(gòu),但具

有不同組成和實現(xiàn)的一系列(Family)不同檔次、不同型號

的機器。

兼容機是指不同廠家生產(chǎn)的具有相同計算機結(jié)構(gòu)(不同的

組成和實現(xiàn))的計算機。

兼容是一個廣泛的概念,包括軟件兼容、硬件兼容、系統(tǒng)

兼容等。其中軟件兼容是指同一個軟件可以不加修改地運行

于體系結(jié)構(gòu)相同的各檔機器,結(jié)果一樣但運行時間可能不

同。軟件兼容可從機器性能和推出時間分成向上(向下)和

向前(向后)兼容。例如32位PC機就陸續(xù)增加了對浮點處

理指令、多媒體指令等的支持。在保證向后兼容的前提下,

不斷改進其組成和實現(xiàn),延續(xù)計算機結(jié)構(gòu)的生命,才使得PC

機具有如此強大的生命力。

〔習題1.13)

酷睿2多核處理器。

(習題1.14)

高級語言與具體的計算機硬件無關(guān),其表達方式接近于所

描述的問題,易為人們接受和掌握,用高級語言編寫程序要

比低級語言容易得多,并大大簡化了程序的編制和調(diào)試,使

編程效率得到大幅度的提高。而匯編語言是為了便于理解與

記憶,將機器指令用助記符代替而形成的一種語言。匯編語

言的語句通常與機器指令對應,因此,匯編語言與具體的計

算機有關(guān),屬于低級語言。它比機器語言直觀,容易理解和

記憶,用匯編語言編寫的程序也比機器語言易閱讀、易排錯。

機器語言的每一條機器指令都是二進制形式的指令代碼,計

算機硬件可以直接識別。高級語言程序通常也需要翻譯成匯

編語言程序,再進一步翻譯成機器語言代碼。

〔習題1.15)

為了更好地進行編程實踐,請進入Windows操作系統(tǒng)下

的控制臺環(huán)境(或MS-DOS模擬環(huán)境),練習常用命令。

第2章處理器結(jié)構(gòu)〔解答)

①ALU是算術(shù)邏輯運算單元,負責處理器所能進行的各

種運算,主要是算術(shù)運算和邏輯運算。

②取指是指從主存取出指令代碼通過總線傳輸?shù)教幚砥?/p>

內(nèi)部指令寄存器的過程。8086分成總線接口單元和指令執(zhí)行

單元,可以獨立操作。在執(zhí)行單元執(zhí)行一條指令的同時,總

線接口單元可以讀取下一條指令,等到執(zhí)行時不需要進行取

指了,所以稱呼取。

③Pentium采用分離的Cache結(jié)構(gòu),一個用做指令Cache,

一個用做數(shù)據(jù)Cacheo

④堆棧的存取原則是先進后出(也稱為后進先出)操作

方式存取數(shù)據(jù)。

⑤標志寄存器主要保存反映指令執(zhí)行結(jié)果和控制指令執(zhí)

行形式的有關(guān)狀態(tài)。

⑥執(zhí)行了一條加法指令后,發(fā)現(xiàn)ZF=1,表明運算結(jié)果

為0o

⑦沒有。

⑧匯編語言的標識符大小寫不敏感,即表示字母大小寫

不同、但表示同一個符號。

⑨不會。

⑩指令的操作數(shù)需要通過存儲器地址或I/O地址,才能

查找到數(shù)據(jù)本身,故稱數(shù)據(jù)尋址方式。

〔習題2.4)

處理器內(nèi)部有ALU、寄存器和指令處理三個基本單元。

8086有兩大功能部件:總線接口單元和執(zhí)行單元。

總線接口單元:管理著8086與系統(tǒng)總線的接口,負責處

理器對存儲器和外設進行訪問。8086所有對外操作必須通過

BIU和這些總線進行。

執(zhí)行單元EU:負責指令譯碼、數(shù)據(jù)運算和指令執(zhí)行。

(習題2.5)

8086中,指令的讀取是在BIU單元,而指令的執(zhí)行是在

EU單元。因為BIU和EU兩個單元相互獨立、分別完成各

自操作,所以可以并行操作。也就是說,在EU單元對一個

指令進行譯碼執(zhí)行時,BIU單元可以同時對后續(xù)指令進行讀

?。贿@就是最簡單的指令流水線技術(shù)。

(習題2.6)

標志:用于反映指令執(zhí)行結(jié)果或控制指令執(zhí)行形式的一個

或多個二進制數(shù)位。例如,有些指令執(zhí)行后會影響有關(guān)標志

位;有些指令的執(zhí)行要利用相關(guān)標志。

狀態(tài)標志:用來記錄程序運行結(jié)果的狀態(tài)信息。

控制標志:DF標志,控制字符串操作的地址方向。

系統(tǒng)標志:用于控制處理器執(zhí)行指令的方式。

狀態(tài)標志在標志寄存器EFLAGS中的位置和含義如下:

31119876543210

10

???0SZAPC

FFFFFF

[習題2.7)

進位標志CF表示無符號數(shù)運算結(jié)果是否超出范圍,超出

范圍后加上進位或借位,運算結(jié)果仍然正確;溢出標志OF

表示有符號數(shù)運算結(jié)果是否超出范圍,如果超出范圍,運算

結(jié)果已經(jīng)不正確。

例1:3AH+7CH=B6H

無符號數(shù)運算:58+124=182,范圍內(nèi),無進位。

有符號數(shù)運算:58+124=182,范圍外,有溢出。

例2:AAH+7CH=@26H

無符號數(shù)運算:170+124=294,范圍外,有進位。

有符號數(shù)運算:—86+124=28,范圍內(nèi),無溢出。

(習題2.8)

物理地址:在處理器地址總線上輸出的地址稱為物理地

址。每個存儲單元有一個唯一的物理地址。

邏輯地址:在處理器內(nèi)部、程序員編程時采用邏輯地址,

采用“段地址:偏移地址”形式。某個存儲單元可以有多個

邏輯地址,即處于不同起點的邏輯段中,但其物理地址是唯

一的。

邏輯地址轉(zhuǎn)換成物理地址:邏輯地址由處理器在輸出之前

轉(zhuǎn)換為物理地址。將邏輯地址中的段地址左移二進制4位(對

應16進制是一位,即乘以16),加上偏移地址就得到20

位物理地址。

①FFFFH:0=FFFF0H

②40H:17H=00417H

③2000H:4500H=24500H

④B821H:4567H=BC777H

(習題2.9)

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

代碼段:存放程序的指令代碼。程序的指令代碼必須安排

在代碼段,否則將無法正常執(zhí)行。

數(shù)據(jù)段:存放當前運行程序所用的數(shù)據(jù)。程序中的數(shù)據(jù)默

認是存放在數(shù)據(jù)段,也可以存放在其他邏輯段中。

堆棧段:主存中堆棧所在的區(qū)域。程序使用的堆棧一定在

堆棧段。

(習題2.10)

平展存儲模型下,對程序來說存儲器是一個連續(xù)的地址空

間,稱為線性地址空間。程序需要的代碼、數(shù)據(jù)和堆棧都包

含在這個地址空間中。

段式存儲模型下,對程序來說存儲器由一組獨立的地址空

間組成,獨立的地址空間稱為段。通常,代碼、數(shù)據(jù)和堆棧

位于分開的段中。

實地址存儲模型是8086處理器的存儲模型。它是段式存

儲模型的特例,其線性地址空間最大為1MB容量,由最大

為64KB的多個段組成。

〔習題2.11)

實地址方式:與8086具有相同的基本結(jié)構(gòu),只能尋址1MB

物理存儲器空間,邏輯段最大不超過64KB;但可以使用32

位寄存器、32位操作數(shù)和32位尋址方式;相當于可以進行

32位處理的快速8086o實地址工作方式只能支持實地址存

儲模型。

保護方式:具有強大的段頁式存儲管理和特權(quán)與保護能

力,使用全部32條地址總線,可尋址4GB物理存儲器。保

護方式通過描述符實現(xiàn)分段存儲管理,每個邏輯段可達

4GBo處理器工作在保護方式時一,可以使用平展或段式存儲

模型。

虛擬8086方式:在保護方式下運行的類似實方式的運行

環(huán)境,只能在1MB存儲空間下使用“16位段”。處理器工

作在虛擬8086方式時,只能使用實地址存儲模型。

〔習題2.12)

匯編語句有兩種:執(zhí)行性語句(處理器指令)、說明性語

句(偽指令)。

每個語句有:標號、指令助記符、操作數(shù)或參數(shù)、注釋4

個部分組成。

〔習題2.13)

匯編語言程序的開發(fā)有4個步驟:

編輯:用文本編輯器形成一個以ASM為擴展名的源程序

文件。

匯編:用匯編程序?qū)SM文件轉(zhuǎn)換為OBJ模塊文件。

連接:用連接程序?qū)⒁粋€或多個目標文件鏈接成一個

EXE或COM可執(zhí)行文件。

調(diào)試:用調(diào)試程序排除錯誤,生成正確的可執(zhí)行文件。

〔習題2.14)

FFH,Again,next,h_ascii

〔習題2.15)

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

32位有效地址=基址寄存器+(變址寄存器*比例)

十位移量

其中的4個組成部分是:

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

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

?比例——可以是1,2,4或8(因為操作數(shù)的長度可以

是1,2,4或8字節(jié));

,位移量—可以是8或32位有符號值。

②16位存儲器尋址方式的組成公式

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

其中基址寄存器只能是BX或BP,變址寄存器只能是SI

或DL位移量是8或16位有符號值。

(習題2.16)

①立即數(shù)

②直接

③寄存器

④寄存器間接

⑤寄存器相對

⑥寄存器相對

⑦基址變址

⑧相對基址變址

⑨相對基址變址

⑩帶比例尋址

(習題2.17)

使用本書配套的軟件包(或者按照本書說明)創(chuàng)建MASM

開發(fā)環(huán)境,通過編輯例題2-1和例題2-2程序、匯編連接生

成可執(zhí)行程序和列表文件,掌握匯編語言的開發(fā)。

第3章數(shù)據(jù)處理

〔習題3.1)簡答題

①沒有。使用二進制8位表達無符號整數(shù),257沒有對

應的編碼。

②字符“F”的ASCII碼就是數(shù)值46H,所以沒有區(qū)別。

③匯編程序在匯編過程中對數(shù)值表達式計算,得到一個

確定的數(shù)值,故稱數(shù)值表達式為常量。

④不能。數(shù)值500大于一個字節(jié)所能表達的數(shù)據(jù)量,所

以不能為字節(jié)變量賦值。

⑤源、目標寄存器位數(shù)不同,不能用該指令進行數(shù)據(jù)交

換。

⑥前者在指令執(zhí)行時獲得偏移地址,是正確的;但后者

的OFFSET只能在匯編階段獲得偏移地址,但此時寄存器內(nèi)

容是不可知的,所以無法獲得偏移地址。

⑦INC,DEC,NEG和NOT指令的操作數(shù)既是源操作

數(shù)也是目的操作數(shù)。

⑧大小寫字母轉(zhuǎn)換利用它們的ASCII碼相差20Ho

⑨加減法不區(qū)別無符號數(shù)和有符號數(shù),但根據(jù)運算結(jié)果

分別設置標志寄存器的CF和OF標志,可利用CF和OF進

行區(qū)別。

⑩邏輯與運算規(guī)則類似二進制的乘法,所以稱其為邏輯

乘。

①255

②0

③94

239

①12H

②24H

③68H

99H

①91

A

②8

③3

9

(習題3.7)

②00000000

③01111111

④10000001

11000111

〔習題3.8)

①1234H+7802H=8A36H,無進位

②F034H+5AB0H=4AF4H,有進位

③CO51H-1234H=BE1DH,無借位

④9876H-ABCDH=ECA9H,有借位

〔習題3.9)

數(shù)碼0?9對應的ASCII碼依次是30H?39H。

大寫字母A?Z對應的ASCII碼依次是:41H?5AH。

小寫字母a?z對應的ASCII碼依次是:61?7AH。

ASCII碼0DH和0AH分別對應的是回車和換行字符。

〔習題3.10)

mylbbyte'PersonalComputer5

my2bbyte20

my3bbyte14h

my4bbyte00010100b

my5wword20dup(?)

my6c=100

my7cequ<PersonalComputer>

〔習題3.11)

numequ5

datalistbyteTO,2,5,4,?

(習題3.12)

4142430A104546FF00040404FF00040404FF00

040404

1000FBFF000000000000

(習題3.13)

②EAX=0114H

③EAX=0006H

④EAX=0013H

EAX=0003H

〔習題3.14)

includeio32.inc

.data

tablebyte'|0123456789ABCDEF,,13,10

byte

'——+----------------------------------5,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

byte0

.code

start:

moveax,offsettable

calldispmsg

exit0

endstart

(習題3.15)

小端方式采用“低對低、高對高”,即低字節(jié)數(shù)據(jù)存放在

低地址存儲單元、高字節(jié)數(shù)據(jù)存放在高地址存儲單元。以字

節(jié)為單位按地址從低到高的順序,var變量的內(nèi)容:78H、56H、

34H、12Ho

;EAX=12345678H

;BX=5678H

;CX=1234H

;DL=78H

;DH=12H

〔習題3.16)

pusheax;可以沒有

moveax,ebx

movebx,[edi]

mov[edi],eax

popeax;可以沒有

(習題3.17)

ESP=0012FFACH

ESP=0012FFAAH

ESP=0012FFA6H

ESP=0012FFAAH

ESP=0012FFACH

ESP=0012FFB0H

〔習題3.18)

;數(shù)據(jù)段

tablebyte18h,34h,05h,06h,09h,Oah,Och,llh,12h,14h

定義格雷碼表

;代碼段

movebx,offsettable;£8乂=格雷碼表首地址

moval,8;AL=8

xlat;AL=12H(8的格雷碼)

不使用XLAT指令:

movebx,offsettable;£8乂=格雷碼表首地址

moveax,0

moval,8;AL=8

moval,[eax+ebx];AL=12H(8的格雷碼)

(習題3.19)

①addedx,ebx

③addal,[ebx+esi]

④add[bx+0b2h],ex

⑤addvarw,3412h

addeax,OaOh

(習題3.20)

(1)

;EAX=80H

;EAX=83H,CF=O,SF=O

;EAX=103H,CF=O,0F=0

;EAX=106H,CF=O,ZF=O

(2)

;EAX=100

;EAX=300,CF=O

(3)

;EAX-100

;EAX=44,CF=1(包含256的進位含義:256+44

=300)

(4)

moval,7fh;AL=7FH

subal,8;AL=77H,CF=O,SF=O

subal,80h;AL=F7H,CF=1,OF=1

sbbal,3;AL=F3H,CF=O,ZF=O

(習題3.21)

moval,89h;AL=89HCFZFSFOFPF

addal,al;AL=12H10011

addal,9dh;AL=OAFH00101

empal,ObchAL=OAFH10101

subal,al;AL=OOH01001

decal;AL=OFFH00101

incal;AL=00H01001

(習題3.22)

;數(shù)據(jù)段

bufferlqword67883000h

buffer2qword67762000h

;代碼段

moveax,dwordptrbufferl

movedx,dwordptrbufferl+4

subeax,dwordptrbuffer2

sbbedx,dwordptrbuffer2+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-OOOOB,CF=O

(3)

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

;EAX=101100B,CF=0

;EAX=10110B,CF=O

;EAX=10111B,CF=O

(4)

;EAX=O,CF=O,0F=0

;ZF=1,SF=O,PF=1

〔習題3.24)

movax,1470h;AX=1470HCFOFSFZF

PF

andax,ax;AX/p>

orax,ax;AX=1470H00000

xorax,ax;AX=OOOOH00011

notax;AX=FFFFH00011

testax,OfOfOh;AX=OFOFOHO0101

(習題3.25)

AND指令同“0”與實現(xiàn)復位,OR指令同"1”或?qū)崿F(xiàn)

置位,XOR同“1”異或?qū)崿F(xiàn)求反。

(習題336)

;代碼段

movecx,3

again:shleax,1

rcledx,1

loopagain

(習題338)

;數(shù)據(jù)段

bedbyte92h

;代碼段

moval,bed

shral,4

addal,30h

calldispe

moval,bed

andal,Ofh

addal,30h

calldispc

(習題329)

MOVS指令的功能是:

ES:[EDI]<-DS:[ESI];ESI*-ESI±1/2/4,EDI-EDI±1/2/4

由此可看出串操作指令的尋址特點:

源操作數(shù)用寄存器ESI間接尋址,默認在DS指向的數(shù)據(jù)

段,但可以改變;目的操作數(shù)用寄存器EDI間接尋址,只能

在ES指向的附加數(shù)據(jù)段;每執(zhí)行一次串操作,源指針ESI

和目的指針EDI將自動修改:±1(字節(jié)),±2(字)或土

4(雙字)。指針的增量和減量控制由DF標志確定,DF=0,

進行增量;DF=1,進行減量。

pusheax

moveax,[esi]

moves:[edi],eax

addesi,4

addedi,4

(習題3.30)

顯示結(jié)果:welldone

EBX寄存器相對尋址:

moval,msg[ebx]

movmsg[ebx],al

(習題3.31)

movarray2[ebx*4],eax

addebx,

〔習題3.32)

上機實現(xiàn)本章的例題程序,編程實現(xiàn)本章的習題程序。

第4章匯編語言程序設計

①當同一個程序被操作系統(tǒng)安排到不同的存儲區(qū)域執(zhí)行

時,指令間的位移沒有改變,目標地址采用相對尋址可方便

操作系統(tǒng)的靈活調(diào)度。

②數(shù)據(jù)通信時,數(shù)據(jù)的某一位用做傳輸數(shù)據(jù)的奇偶校驗

位,數(shù)據(jù)中包括校驗位在內(nèi)的“1”的個數(shù)恒為奇數(shù),就是

奇校驗;恒為偶數(shù),就是偶校驗。

③無符號數(shù)和有符號數(shù)的操作影響兩組不同的標志狀態(tài)

位,故判斷兩個無符號數(shù)和有符號數(shù)的大小關(guān)系要利用不同

的標志位組合,所以有對應的兩組指令。

④雙分支結(jié)構(gòu)中兩個分支體之間的JMP指令,用于實現(xiàn)

結(jié)束前一個分支回到共同的出口作用。

⑤完整的子程序注釋可方便程序員調(diào)用該子程序,子程

序注釋包括子程序名、子程序功能、入口參數(shù)和出口參數(shù)、

調(diào)用注意事項和其他說明等。

⑥子程序保持堆棧平衡,才能保證執(zhí)行RET指令時當前

棧頂?shù)膬?nèi)容是正確的返回地址。主程序也要保持堆棧平衡,

這樣才能釋放傳遞參數(shù)占用的堆棧空間,否則多次調(diào)用該子

程序可能就致使堆棧溢出。

⑦“傳值”是傳遞參數(shù)的一個拷貝,被調(diào)用程序改變這

個參數(shù)不影響調(diào)用程序;“傳址”時,被調(diào)用程序可能修改

通過地址引用的變量內(nèi)容。

⑧INCLUDE語句包含的是文本文件、是源程序文件的

一部分;INCLUDELIB語句包含的是子程序庫文件。

⑨取長補短。

⑩Windows程序在運行時需要加載其配套的動態(tài)鏈接庫

DLL文件,當其沒有被搜索到時就會提示不存在。

〔習題4.4)

jmplabll;相對尋址

nop

moveax,'?'

calldispc

labll:moveax,’1'

calldispc

jmpnearptrlabl2;相對近轉(zhuǎn)移

nop

moveax,'?'

calldispc

labl2:moveax,’2,

calldispc

moveax,offsetlabl3

jmpeax;寄存器間接尋址

nop

moveax,'?’

calldispc

labl3:moveax,’3'

calldispc

moveax,offsetlabl4

movnvar,eax

jmpnvar;存儲器間接尋址

nop

moveax,'?’

calldispc

labl4:moveax,’4'

calldispc

〔習題4.5)

moveax,56h;假設一個數(shù)據(jù)

shreax,2;DI位移入CF標志

jncnom;Dl=0條件成立,轉(zhuǎn)移

;余同原程序

(習題46)

CF=1ZF=0SF=1OF=0PF=1

可以使得條件成立、發(fā)生轉(zhuǎn)移的指令有:JCJSJP

JNZJNO

〔習題4.7)

includeio32.inc

.data

msglbyte5Pleaseinputacharacter:',0

msg2byte'TheASCIIcodeofthecharateryouentered

is:',0

msg3byte'Thecodewithevenparityis:',0

.code

start:

moveax,offsetmsgl

calldispmsg

callreadc

calldispcrlf

movebx,eax

moveax,offsetmsg2

calldispmsg

moveax,ebx

calldispbb

calldispcrlf

andal,7fh

jpnext

oral,80h

next:movebx,eax

moveax,offsetmsg3

calldispmsg

moveax,ebx

calldispbb

exit0

endstart

(習題4.8)

;數(shù)據(jù)段

Rdatabyte57h;保存接收的數(shù)據(jù)

errorbyte'Error!',0

;代碼段

moval,Rdata

andal,Offh;標志PF反映“1”的個數(shù)

jpdone;個數(shù)為偶數(shù),正確繼續(xù)

moveax,offseterror;個數(shù)為奇數(shù),顯示出錯

calldispmsg

done:

(習題4.9)

testeax,8000h;測試最高位

jznextl;最高位為0(ZF=1),轉(zhuǎn)移到標

號NEXT1

movedx,Offffffffh;最高位為1,順序執(zhí)行:設置

EDX=FFFFFFFFH

jmpdone;無條件轉(zhuǎn)移,跳過另一個分支

nextl:movdx,0;最高位為0轉(zhuǎn)移到此

執(zhí)行:設置EDX=O

done:

[解答2)

使用移位指令更好。

roleax,1

rcredx,1

saredx,31

roreax,1

〔習題4.10)

;數(shù)據(jù)段

dvardword57h

;代碼段

moveax,dvar

testeax,80000000h

jnznextl

testeax,1

jnznextr

moval,'M'

jmpdone

nextl:moval,'L,

jmpdone

nextr:moval,'R'

done:calldispc

〔習題4.11)

;數(shù)據(jù)段

inmsgbyte?Inputnumber(0^9):',0

ermsgbyteOdh,Oah,5Error!Inputagain:',0

;代碼段

moveax,offsetinmsg;提示輸入數(shù)字

calldispmsg

again:callreadc;等待按鍵

cmpal,,0,;數(shù)字<0?

jberdisp

cmpal,'9';數(shù)字>9?

jaerdisp

calldispcrlf

calldispc

jmpdone

erdisp:moveax,offsetermsg

calldispmsg

jmpagain

done:

〔習題4.12)

求這20個雙字的和,保存在TOTAL變量,不關(guān)進心進

位和溢出。

〔習題4.13)

;數(shù)據(jù)段

stringbyte'Doyouhavefunwith

Assembly?',0;以0結(jié)尾的字符串

spacedword?

;代碼段

movesi,offsetstring

xorebx,ebx;EBX用于記錄空格數(shù)

again:moval,[esi]

cmpal,0

jzdone

cmpal,20h;空格的ASCH碼是20H

jnenext;不相等、不是空格,轉(zhuǎn)移

incbx;相等、是空格,空格個數(shù)加1

next:incesi

jmpagain;繼續(xù)循環(huán)

done:movspace,ebx;保存結(jié)果

〔習題4.14)

;數(shù)據(jù)段

arrayword2005,2008,98dup(1394);假設100個16位

正整數(shù)

wordsumword?

errorbyte5Overflow!,,0

;代碼段

andebx,0

movecx,100

xorax,ax

again:addax,array[ebx*2]

jcover

incebx

loopagain

movwordsum,ax

over:moveax,offseterror

calldispmsg

(習題4.15)

;數(shù)據(jù)段

stringbyte'Ifyoufindanyerrorinthe

program,youcanDEBUGit.’

count=sizeofstring

bugbyte'BUG,

;代碼段

movecx,count

movedi,offsetstring

LI:movesi,offsetbug

pushedi

movedx,sizeofbug

LN:moval,[esi]

cmp[edi],al

jneL2

incesi

incedi

decedx

jneLN

popedi

moval,'Y'

jmpL3

L2:popedi

incedi

loopLI

moval,'N'

L3:calldispc

〔習題4.16)

;數(shù)據(jù)段

beddword00371002h

;代碼段

movesi,bed

cmpesi,0

jnzgoon

moval,'O'

calldispc

jmpdone

goon:movecx,8

xorebx,ebx;EBX=O,表示可能是前導0

again:rolesi,4

moveax,esi

andeax,Ofh;EAX低4位保存當前要顯示的BCD

cmpebx,0;EBXWO,說明不是前導0,要顯示

jnzdisp;EBX=O,說明可能是前導0

cmpeax,0

jznext;EAX=O,說明是前導0,不顯示

movebx,1;EAXWO,沒有前導。了,令EBX=1WO

disp:addal,30h

calldispc

next:loopagain

done:

〔習題4.17)

;數(shù)據(jù)段

stringbyte'Letushavea

try!',Odh,Oah,0

;代碼段

movecx,sizeofstring

cmpecx,2

jbdone

leaeax,string;顯示處理前的字符串

calldispmsg

movesi,ecx

decesi

outIp:cmpstring[esi],?;檢測是

否是空格

jnznext;不是空格繼續(xù)循環(huán)

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

dececx

inlp:incedi

moval,string[edi];前移一^個位置

movstring[edi-l],al

cmpedi,ecx

jbinlp

next:decesi繼續(xù)進行

cmpesi,0

jnzoutlp為0結(jié)束

leaeax,string顯示處理后的字符串

calldispmsg

done:

〔習題4.18)

includeio32.inc

.data

tablebyte:0123456789ABCDEFJ,13,10

byte

'——+-------------------------------------',13,10

tabibyte6dup(36dup(?),13,10)

byte0

.code

start:

movebx,offsettabi

movedx,'|02'

movax,2020h

movesi,6

againO:mov[ebx],edx

addebx,4

movecx,16

againl:movwordptr[ebx],ax

addebx,2

incal

loopagainl

addebx,2

addedx,1

decesi

jnzagainO

moveax,offsettable

calldispmsg

exit0

endstart

〔習題4.19)

asctobproc

shldh,4

moval,dh

anddl,Ofh

oral,dl

ret

asctobendp

〔習題4.20)

disp99proc

xorah,ah

aam

addax,3030h

pushax

moval,ah

calldispc

popax

calldispc

ret

disp99endp

(習題441)

;代碼段,主程序

again:callreadc

cmpal,Ibh

jzdone

movbl,al

moval,':'

calldispc

moval,bl

rolal,4

callhtoasc;調(diào)用子程序

calldispc;顯示一個字符

moval,bl

callhtoasc;調(diào)用子程序

calldispc;顯示一個字符

calldispcrlf

jmpagain

done:

(習題4.22)

;代碼段,主程序

moveax,8F98FF00H

calldispbd;調(diào)用子程序

;代碼段,子程序

dispbdproc;32位二進制數(shù)的輸出

pushecx

pushedx

movecx,32;要輸出的字符個數(shù)

dbd:roleax,1;AL循環(huán)左移一位

pusheax

andal,Olh;取AL最低位

addal,30h;轉(zhuǎn)化成相應的ASCLL碼值

calldispc;以二進制的形式顯示

popeax

loopdbd

popedx

popecx

ret

dispbdendp

〔習題4.23)

;數(shù)據(jù)段

arrayword12345,-1234,32767,-32768,0,667

writebufbyte6dup(0)

;代碼段,主程序

movecx,lengthofarray

movebx,0

again:

movax,array[ebx*2]

callwrite

calldispcrlf

incebx;此時ebx代表array中的

第幾個數(shù)

dececx;此時ecx代表循環(huán)的次數(shù)

jnzagain

;代碼段,子程序

writeproc;子程序開始

pushebx

pushecx

pushedx

movebx,offsetwritebuf;ebx指向顯示緩沖區(qū)

testax,ax

jnzwritel

movbyteptr[ebx],30h

incebx

jmpwrite5

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

是負

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

write2

movbyteptr[ebx],',

incebx

negax

write2:

movex,10

pushex;將。*二10壓入棧,作為退

出標志

write3:;write3是讓eax循環(huán)除

以10并把余數(shù)的ASCII碼壓入棧

empax,0

jzwrite4

xordx,dx

divex

adddx,30h

pushdx

jmpwrite3

write4:;余數(shù)的ASCH碼出棧,遇

到10終止并轉(zhuǎn)到write5顯示結(jié)果

popdx

empdx,ex

jzwrite5

movbyteptr[ebx],dl

incebx

jmpwrite4

write5:;顯示結(jié)果

movbyteptr[ebx],0

moveax,offsetwritebuf

calldispmsg

popedx

popecx

popebx

ret

writeendp

〔習題4.24)

;數(shù)據(jù)段

count=10

arraydwordcountdup(0)

tempdword?

readbufbyte30dup(0)

errmsgbyte'Inputerror,enter

again!’,13,10,0

msglbyte'Inputtenunsignednumbers,eachnumberends

withenterkey:',13,10,0

msg2byte'Checkthenumbersyourinputted:5,13,10,0

;代碼段,主程序

moveax,offsetmsgl

calldispmsg

movecx,count

movebx,offsetarray

again:

callread

moveax,temp

mov[ebx],eax

addebx,4

dececx

jnzagain

moveax,offsetmsg2

calldispmsg

movedx,offsetarray

movecx,count

next:

moveax,[edx]

cal1dispuid

calldispcrlf

addedx,4

dececx

jnznext

代碼段,子程序

readproc

pusheax

pushecx

pushebx

pushedx

readO:

moveax,offsetreadbuf

callreadmsg

testeax,eax

jzreaderr

cmpeax,12

jareaderr

movedx,offsetreadbuf

xorebx,ebx

xorecx,ecx

moval,[edx]

cmpal,,+,

jzreadl

cmpa],,,

jnzread2

jmpreaderr

readl:

incedx

moval,[edx]

testal,al

jzread3;如果為0,則說明該字符串已

結(jié)束

read2:

cmpal,,O'

jbreaderr

cmpal,’9'

jareaderr

subal,30h

imulebx,10;ebx用來存儲處理過的數(shù)據(jù)

jcreaderr

movzxeax,al

addebx,eax

jncreadl

readerr:

moveax,offseterrmsg

calldispmsg

jmpreadO

read3:

movtemp,ebx

popedx

popebx

popecx

popeax

ret

readendp

〔習題4.25)

;計算字節(jié)校驗和的通用過程

;入口參數(shù):DS:EBX=數(shù)組的段地址:偏移地址,ECX=

元素個數(shù)

;出口參數(shù):AL=校驗和

;說明:除EAX/EBX/ECX外,不影響其他寄存器

checksumproc

xoral,al;累加器清0

sum:addal,[ebx];求和

incebx;指向下一個字節(jié)

loopsum

ret

checksumendp

〔習題4.26)

(1)

;數(shù)據(jù)段

wvarword307281AFH

;代碼段,主程序

moveax,wvar

calldisp

moval,'H'

calldispc

;代碼段,子程序

dispproc

pushebx

pushecx

movecx,8;8位

dhwl:roleax,4

movebx,eax

andal,0fh;轉(zhuǎn)換為ASCH碼

addal,30h

cmpal,’9'

jbedhw2

addal,7

dhw2:calldispc

moveax,ebx

loopdhwl

popecx

popebx

ret

dispendp

(2)

;數(shù)據(jù)段

wvarword307281AFH

tempword?

;代碼段,主程序

moveax,wvar

movtemp,eax

calldisp

moval,'H'

calldispc

;代碼段,子程序

dispproc

pushebx

pushecx

movecx,8;8位

moveax,temp

dhwl:roleax,4

movebx,eax

andal,0fh;轉(zhuǎn)換為ASCII碼

addal,30h

cmpal,’9'

jbedhw2

addal,7

dhw2:calldispc;顯示一個字符

moveax,ebx

loopdhwl

popecx

popebx

ret

dispendp

(3)

;數(shù)據(jù)段

wvarword307281AFH

;代碼段,主程序

pushwvar

calldisp

addesp,4

moval,'H'

calldispc

;代碼段,子程序

dispproc

pushebp

movebp,esp

pushebx

pushecx

movecx,8;8位

moveax,[ebp+8]

dhwl:roleax,4

moveb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論