匯編語言程序設(shè)計(第四版)第1-4章【課后答案】_第1頁
匯編語言程序設(shè)計(第四版)第1-4章【課后答案】_第2頁
匯編語言程序設(shè)計(第四版)第1-4章【課后答案】_第3頁
匯編語言程序設(shè)計(第四版)第1-4章【課后答案】_第4頁
匯編語言程序設(shè)計(第四版)第1-4章【課后答案】_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計第四版

【課后習題答案】

第1章匯編語言根底知識

〔習題1.1〕簡述計算機系統(tǒng)的硬件組成及各局部作用。

〔解答〕

CPU:包括運算器、控制器和存放器組。運算器執(zhí)行所有的算術(shù)和邏輯運算;控制器

負責把指指令逐條從存儲器中取出,經(jīng)譯碼分析后向機器發(fā)出各種控制命令,并正確完成

程序所要求的功能;存放器組為處理單元提供所需要的數(shù)據(jù)。

存儲器:是計算機的記憶部件,它用來存放程序以及程序中所涉及的數(shù)據(jù)。

外部設(shè)備:實現(xiàn)人機交換和機間的通信。

〔習題1.2)明確以下概念或符號:主存和輔存,RAM和ROM,存儲器地址和I/O

端口,KB、MB、GB和TB.

〔解答〕

主存又稱內(nèi)存是主存儲器的簡稱,主存儲器存放當前正在執(zhí)行的程序和使用的數(shù)據(jù),

CPU可以直接存取,它由半導體存儲器芯片構(gòu)成其本錢高、容量小、但速度快。輔存是輔

助存儲器的簡稱,輔存可用來長期保存大量程序和數(shù)據(jù),CPU需要通過I/O接口訪問,它

由磁盤或光盤構(gòu)成,其本錢低、容量大,但速度慢。

RAM是隨機存取存儲器的英語簡寫,由于CPU可以從RAM讀信息,也可以向RAM

寫入信息,所以RAM也被稱為讀寫存儲器,RAM型半導體存儲器可以按地址隨機讀寫,

但這類存儲器在斷電后不能保存信息;而ROM中的信息只能被讀出,不能被修改,ROM

型半導體通常只能被讀出,但這類存儲器斷電后能保存信息。

存儲器由大量存儲單元組成。為了區(qū)別每個單元,我們將它們編號,于是,每個存儲

單元就有了一個存儲地址,I/O接口是由一組存放器組成,為了區(qū)別它們,各個存放器進

行了編號,形成I/O地址,通常稱做I/O端口。

KB是千字節(jié)、MB是兆字節(jié)、GB是吉字節(jié)和TB是太字節(jié),它們都是表示存儲器存儲

單元的單位。

〔習題1.3〕什么是匯編語言源程序、匯編程序、目標程序?

用匯編語言書寫的程序就稱為匯編語言源程序;完成匯編工作的程序就是匯編程序;

由匯編程序編譯通過的程序就是目標程序。

〔習題1.4)匯編語言與高級語言相比有什么優(yōu)缺點?

〔解答〕

匯編語言與高級語言相比的優(yōu)點:由于匯編語言本質(zhì)就是機器語言,它可以直接地、

有效地控制計算機硬件,因而容易產(chǎn)生運行速度快,指令序列短小的高效目標程序,可以

直接控制計算機硬件部件,可以編寫在〃時間"和〃空間”兩方面最有效的程序。

匯編語言與高級語言相二匕的缺點:由于與處理器密切相關(guān)導致通用性差、可移植性差,

匯編語言功能有限,又涉及存放器、主存單元等硬件細節(jié),編寫匯編語言比擬繁瑣,調(diào)試

起來也比擬困難,編譯程序產(chǎn)生的目標程序往往比擬龐大、程序難以優(yōu)化,運行速度慢。

〔習題1.5〕將以下十六進制數(shù)轉(zhuǎn)換為二進制和十進制表示

⑴FFH⑵0H⑶5EH(4)EFH

⑸2EH(6)10H(7)1FH[8]ABH

(1)FFH11111111B

255D

⑵0H0B0D

⑶5EH1011110B94D

[4JEFH11101111B

239D

(5J2EH1O111OB46D

[6)1OH10000B

16D

[7)1FH11111B

31D

[8)ABH10101011B

171D

〔習題1.6)將以下十進制數(shù)轉(zhuǎn)換為BCD碼表示

[1]12(2)24(3)68⑷

127

⑸128(6)255[7]1234(8)

2458

〔解答〕

⑴1200010010

[2]2400100100

⑶6801101000

(4)127000100100111

(5)128000100101000

(6)255001001010101

〔習題1.7)將以下BCD碼轉(zhuǎn)換為十進制數(shù)

(1)10010001(2)10001001⑶00110110〔4〕10010000

[5]00001000[6]10010111[7]10000001[8]00000010

〔解答〕

(1)91

⑵89

⑶36

⑷90

⑸08

(6)97

⑺81

⑻02

〔習題1.8〕將以下十進制數(shù)分別用8位二進制數(shù)的原碼、反碼和補碼表示

⑴0〔2〕-127(3)127⑷

-57

(5)126〔6〕-126〔7〕-128〔8〕

68

〔解答〕

[1]0+0000000000000000000000000

-0100000001111111100000000

(2)-127111111111000000010000001

(3)127011111110111111101111111

(4)-57101011111101000011010001

〔5〕126011111100111111001111110

〔6〕-126111111101000000110000010

[7]-12810000000

〔8〕68010001000100010001000100

〔習題1.9)完成以下二進制數(shù)的運算

[1]1011+1001(2)1011-1001(3)1011x1001⑷10111000^1001

(5)1011A1001(6)1011vlOOl(7)-1011〔8〕1011?1001

〔解答〕

(1)1011+1001=10100

(2)1011-1001=0010

⑶1011x1001=1100011

⑷10111000^1001=10100,余數(shù)1000

(5)1011A1001=1001

(6)1011V1001=1011

(7)-1011=0100

⑻1011?1001=0010(?代表異或)

〔習題1.10〕數(shù)碼0~9、大寫字母A~Z、小寫字母a~z對應的ASCII碼分別是多

少?ASCH碼為Odh、Oah對應的是什么字符?

〔解答〕

數(shù)碼0~9:30H-39H

大寫字母A~Z:41H-5AH

小寫字母a~z:61H-7AH

ASCII碼為Odh、Oah分別對應回車和換行控制字符。

〔習題L1D計算機中有一個"01100001"編碼,如果把它認為是無符號數(shù),它是

十進制什么數(shù)?如果認為它是BCD碼,那么表示什么數(shù)?又如果它是某個ASCII碼,那么

代表哪個字符?

〔解答〕

十進制無符號數(shù):01100001B=61H=97

BCD59:61

ASCII碼:a

〔習題1.12]簡述Intel80x86系列微處理器在指令集方面的開展。

〔解答〕

1978年Intel,正式推出了16位8086CPU,1979年Intel推出了準16位微處理器

8088,隨后,Intel推出了80186/80188,80186/80188指令系統(tǒng)比8086指令系統(tǒng)新增

了假設(shè)干條實用的指令,涉及堆棧操作、移位指令、過程指令和邊界檢測及乘法指令,1982

年Intel推出80286CPU,80286指令系統(tǒng)包括全部80186指令及新增的保護指令15

條,其中有些保護方式在實方式下也可以使用,1985年,Intel80x86推出微處理器地進

入第三代80386CPU,80386指令系統(tǒng)在兼容原來16位指令系統(tǒng)的根底上,全面升級

為32位,還新增了有關(guān)位操作、條件設(shè)置指令以及控制、調(diào)試和測試存放器的傳送指令等,

1989年zIntel推出了80486CPU,80486將浮點處理單元FPU集成進來,還采用了精簡

指令集計算機技術(shù)RISC和指令流水線方式,還新增了用于多處理器和內(nèi)部Cache操作的

6條指令,1993年Intel制成了俗稱586的微處理器,取名Pentium.Pentium仍為32

位結(jié)構(gòu),地址總線為32位,對常用的簡單指令用硬件實現(xiàn),重新設(shè)計指令的微代碼等,

Pentium新增了一條8字節(jié)比擬交換指令和一條處理器識別指令以及4條系統(tǒng)專用指令,

1996年推出了MMXPentium,新增了57條多媒休指令,1995年Intel推出PentiumPro

新增了3條指令,1999年推出了Pentiums新增了70條SSE指令,2000年推出的

Pentium4新增了76條SSE2指令

〔習題1.13]什么是DOS和ROM-BIOS?

〔解答〕

DOS是DisketteOperatingsystem的縮寫,意思是磁盤操作系統(tǒng)QOS主要是面向

磁盤的系統(tǒng)軟件,說得簡單些,就是人與機器的一座橋梁,是罩在機器硬件外面的一層"外

殼〃,是1981~1995年的個人電腦上使用的一種主要的操作系統(tǒng)。BIOS[BasicInput/

OutputSystem]即根本輸入輸出系統(tǒng),通常是固化在只讀存儲器〔ROM〕中,所以又稱

為ROM-BIOS。它直接對計算機系統(tǒng)中的輸入、輸出設(shè)備進行設(shè)備級、硬件級的控制,

是連接軟件程序和硬件設(shè)備之間的樞紐。ROM-BIOS是計算機系統(tǒng)中用來提供最低級、

最直接的硬件控制的程序。

〔習題1.14〕簡述PC機最低1MB主存空間的使用情況。

〔解答〕

[1]根本RAM區(qū)(00000H—9FFFFH)該區(qū)共640KB,由DOS進行管理。在這個區(qū)

域中操作系統(tǒng)要占用掉一局部彳氐地址空間,其它那么向用戶程序開放。

⑵保存區(qū)RAM[A0000H-BFFFFFH]該區(qū)為系統(tǒng)安排的"顯示緩沖存儲區(qū)”,共

126KB,是顯卡上的芯片提供支持,用于存放屏幕顯示信息。但這局部地址空間實際上并

沒有全部使用。

⑶擴展區(qū)ROM(C0000H-DFFFFH)該區(qū)128KB,由接口卡上的芯片提供支持,

用于為系統(tǒng)不直接支持的外設(shè)安排設(shè)備驅(qū)動程序。用戶固化的程序就可[安排在這一段,系

統(tǒng)的會對它進行確認和連接。

⑷系統(tǒng)區(qū)ROM(EOOOOH-FFFFFH)該區(qū)共128KB,由系統(tǒng)占用,它主要提供

ROM-BIOS程序,根本輸入輸出程序BIOS,是操作系統(tǒng)的重要組成局部,主要用來驅(qū)動

輸入輸出設(shè)備,也負責系統(tǒng)的上電檢測,磁盤引導等初始化操作,在ROM-BIOS中還有

CMOS微機設(shè)置程序以及使用的字符圖符信息等內(nèi)容。

〔習題1.15〕羅列8086CPU的8個8位和16位通用存放器,并說明各自的作用。

〔解答〕

〔1〕數(shù)據(jù)存放器:AX稱為累加器,使用頻度最高,用于算術(shù)、邏輯運算以及與外設(shè)

傳送信息等;BX稱為基址存放器,常用做存放存儲器地址;CX稱為計數(shù)器,作為循環(huán)和

串操作等指令中的隱含計數(shù)器;DX稱為數(shù)據(jù)存放器,常用來存放雙字長數(shù)據(jù)的高16位,

或存放外設(shè)端口地址。

[2[指針及變址存放器包括SLDLBRSP,四個存放器,常用于存儲器尋址時提供地址。

SI是源變址存放器,DI是目的變址存放器,一般與DS聯(lián)用確定數(shù)據(jù)段和附加段中某一存

儲單元地址,在串指令中,SI與DS聯(lián)甩DI和ES聯(lián)用,分別尋址數(shù)據(jù)段和附加段;同

時,在串指令中,SI和DI還都具有自動增量或減量的功能。SR為堆棧指針存放器,指示

棧頂?shù)钠频刂?;BP為基地址指針存放器,表示堆棧三殳中的基地址。SP與BP存放器均

可與SS段存放器聯(lián)合使用以確定堆棧段中的存儲單元地址。

〔習題1.16]什么是標志,它有什么用途?狀態(tài)標志和控制標志有什么區(qū)別?畫出標

志存放器FLAGS,說明各個標志的位置和含義。

〔解答〕

標志用于反映指令執(zhí)行結(jié)果或控制指令執(zhí)行形式。它是匯編語言程序設(shè)計中必須特別

注意的一個方面,狀態(tài)用來記錄運行的結(jié)果的狀態(tài)信息,許多指令的執(zhí)行都將相應地設(shè)置

它,控制標志位可由程序根據(jù)需要用指令設(shè)置,用來控制處理器執(zhí)行指令的方式。

CF是進位標志;ZF是零標志;SF是符號標志;PF奇偶標志;OF溢出標志;AF輔

助進位標志;DF方向標志;IF中斷允許標志;TF陷阱標志。

〔習題1.17〕舉例說明CF和OF標志的差異。

〔解答〕

溢出標志OF和進位標志CF是兩個意義不同的標志。

進位標志表示無符號數(shù)運算結(jié)果是否超出范圍,運算結(jié)果仍然正確;溢出標志表示有

符號數(shù)運算結(jié)果是否超出范圍,運算結(jié)果已經(jīng)不正確。

例1:3AH+7CH=B6H

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

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

例2:AAH+7CH=(1)26H

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

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

〔習題1.18〕字和雙字在存儲器中如何存放,什么是“小端方式"?對字和雙字存儲

單元,什么是它們的對齊地址?為什么要對齊地址?

〔解答〕

字或雙字在存儲器中占相鄰的2個或4個存儲單元;存放時,低字節(jié)存入低地址,高

字節(jié)存入高地址;字或雙字單元的地址用它的低地址來表示。80x86處理器采用的這種〃低

對低,高對高"的存儲形式,被稱為〃小端方式";將字單元安排在偶地址,雙字節(jié)單元安

排在模4地址,被稱為〃地址對齊方式"因為對于不對齊地址的數(shù)據(jù),處理器訪問時,需

要額外的訪問時間,所以通常應該將數(shù)據(jù)的地址對齊,以取得較高的存取速度。

〔習題1.19〕什么是8086中的邏輯地址和物理地址?邏輯地址如何轉(zhuǎn)換成物理地

址?請將如下邏輯地址用物理地址表達:

(1)FFFFh:0[2]40h:17h(3)2000h:4500h(4)B821h:4567h

〔解答〕

在8086處理器中,對應每個物理存儲單元都有一個唯一的20位編號,就是物理地址,

從00000H~FFFFFH。

在8086內(nèi)部和用戶編程時,采用的段基地址:段內(nèi)偏移地址形式稱為邏輯地址。

將邏輯地址中的段地址左移二進制4位〔對應16進制是一位,即乘以16),加上偏移

地址就得到20位物理地址

如下邏輯地址用物理地址表達:

(1)FFFFh:0=FFFF0H

⑵40h:17h=00417H

〔3〕2000h:4500h=24500H

〔4〕B821h:4567h=BC777H〔不要算錯)

〔習題1.20]8086有哪4種邏輯段,各種邏輯段分別是什么用途?

〔解答〕

代碼段〔CodeSegment〕用來存放程序的指令序列。處理器利用CS:IP取得下一條

要執(zhí)行的指令。

堆棧段(StackSegment]確定堆棧所在的主存區(qū)域。處理器利用SS:SP操作堆棧

中的數(shù)據(jù)。

數(shù)據(jù)段〔DataSegment)存放當前運行程序所用的數(shù)據(jù)。處理器利用DS:EA存取

數(shù)據(jù)段中的數(shù)據(jù)。

附加段[ExtraSegment〕是附加的數(shù)據(jù)段,也用于數(shù)據(jù)的保存。處理器利用ES:EA

存取數(shù)據(jù)段中的數(shù)據(jù)

〔習題1.21〕數(shù)據(jù)的默認段是哪個,是否允許其他段存放數(shù)據(jù)?如果允許,如何實現(xiàn),

有什么要求?

〔解答〕

數(shù)據(jù)的默認段是安排在數(shù)據(jù)段,也經(jīng)常安排在附加段,尤其是串操作的目的區(qū)必須是

附加段,允許其它段存放數(shù)據(jù),數(shù)據(jù)的存放比擬靈活的,實際上可以存放在任何一種邏輯

段中,這時,只要明確指明是哪個邏輯段就可以了。

〔習題1.22]什么是操作碼、操作數(shù)和尋址方式?有哪三種給出操作數(shù)的方法?

〔解答〕

操作碼說明計算機要執(zhí)行哪種操作,它是指令中不可缺少的組成局部,操作數(shù)是指令

執(zhí)行的參與者,也是各種操作的對象,我們把尋找數(shù)的方式叫做操作數(shù)的尋址方式。給出

操作數(shù)的三種方法是直接給出,間接給出,隱藏操作數(shù)方式給出。

〔習題1.23〕什么是有效地址EA?8086的操作數(shù)如果在主存中,有哪些尋址方式可

以存取它?

〔解答〕

DS存放數(shù)據(jù)段的段地址,存儲器中操作數(shù)的偏移地址那么由各種主存方式得到,稱之

為有效地址EA。8086的操作數(shù)如果在主存中,可以存取它的尋址方式有直接尋址方式、

存放器間接尋址方式、存放器相對尋址方式、基址變址尋址方式、相對基址變址尋址方式。

〔習題1.24)說明以下指令中源操作數(shù)的尋址方式?如果BX=2000H,DI=40H,

給出DX的值或有效地址EA的值。

[1)movdx,[1234h]

(2)movdx,1234h

⑶movdx,bx

〔4〕movdx,[bx]

〔5〕movdx,[bx+1234h]

〔6〕movdx,[bx+di]

〔7〕movdx,[bx+di+1234h]

〔解答〕

⑴直接尋址,EA=1234H

〔2〕立即數(shù)尋址,DX=1234H

〔3〕存放器尋址,DX=2000H

[4]間接尋址,EA=2000H

⑸相對尋址,EA=3234H

〔6〕基址變址尋址,EA=2040H

〔7〕相對基址變址尋址,EA=3274H

第2章8086的指令系統(tǒng)

〔習題〕,存儲單元

2.1DS=2000HxBX=0100H.SI=0002H[20100H]~[20103H]

依次存放12345678H,[21200H]~[21203H]依次存放2A4CB765H,說明以下每條

指令執(zhí)行完后AX存放器的內(nèi)容。

(1)movax,1200h

⑵movax,bx

〔3〕movax,[1200h]

[4)movax,[bx]

〔5〕movax,[bx+1100h]

〔6〕movax,[bx+si]

[7]movax,[bx][si+1100h]

〔解答〕

⑴AX=1200H

(2)AX=0100H

⑶AX=4c2AH;偏移典二bx二OlOOh

[4]AX=3412H;偏移地址=bx=0100h

[5]AX=4C2AH;偏移地址=bx+1100h=1200h

〔6〕AX=7856H;偏移地址=bx+si=0100h+0002h=0102h

[7]AX=65B7H;^±te±lt=bx+si+1100h=0100h+0002h+1100h=1202h

〔習題2.2〕指出以下指令的錯誤

〔1〕movcx,dl

[2]movip,ax

〔3〕moves,1234h

⑷moves,ds

⑸moval,300

〔6〕mov[sp],ax

[7]movax,bx+di

〔8〕mov20h,ah

〔解答〕

〔1〕兩操作數(shù)類型不匹配

〔2〕IP指令指針禁止用戶訪問

〔3〕立即數(shù)不允許傳給段存放器

〔4〕段存放器之間不允許傳送

〔5〕兩操作數(shù)類型不匹配

[6〕目的操作數(shù)應為[SI]

〔7〕源操作數(shù)應為[BX+DI]

[8[立即數(shù)不能作目的操作數(shù)

〔習題2.3]數(shù)字0~9對應的格雷碼依次為:18H、34H、05H、06H、09H、OAH、

OCH、11H.12H、14H,它存在于以table為首地址〔設(shè)為200H〕的連續(xù)區(qū)域中。請為

如下程序段的每條指令加上注釋,說明每條指令的功能和執(zhí)行結(jié)果。

leabx,table

moval,8

xlat

〔解答〕

leabx,table;獲取table的首地址,BX=200H

moval,8;傳送欲轉(zhuǎn)換的數(shù)字,AL=8

xlat;轉(zhuǎn)換為格雷碼,AL=12HP35

〔習題2.4〕什么是堆棧,它的工作原那么是什么,它的根本操作有哪兩個,對應哪兩

種指令?

〔解答〕

堆棧是一種按〃先進后出"原那么存取數(shù)據(jù)的存儲區(qū)域,位于堆棧段中,使用SS段存

放器記錄其段地址;它的工作原那么是先進后出;堆棧的兩種根本操作是壓棧和出棧,對

應的指令是PUSH和POP。

〔習題2.5〕SS=2200H、SP=OOBOH,畫圖說明執(zhí)行下面指令序列時,堆棧區(qū)和

SP的內(nèi)容如何變化?

movax,8057h

pushax

movax,0f79h

pushax

popbx

pop[bx]

〔解答〕

movax,8057h

pushax

movax,0f79h

pushax

popbx;bx=0f79h

pop[bx];DS:[0f79h]=8057h

〔習題2.6〕給出以下各條指令執(zhí)行后AL值,以及CF、ZF、SF、OF和PF的狀態(tài):

moval,89h

addal,al

addal,9dh

cmpal,Obch

subal,al

decal

incal

〔解答〕

moval,89h;AL=89hCFZFSFOFPF

addal,al;AL=12h10011

;10001001

+10001001

100010010

addal,9dh;AL=Oafh00101

;00010010

+10011101

10101111

cmpal,0bch;AL=Oafh10101

;10101111

-10111100

*01000011

subal,al;AL=00h01001

decal;AL=Offh00101

;00000000

-00000001

*11111111

incal;AL=00h01001

;11111111

+00000001

*11111111

〔習題2.7〕設(shè)X、Y、Z均為雙字數(shù)據(jù),分別存放在地址為X、X+2;Y、Y+2;Z、Z+2

的存儲單元中,它們的運算結(jié)果存入W單元。閱讀如下程序段,給出運算公式。

movax,X

movdx,X+2

addax,Y

adcdxfY+2

addax,24

adcdx,0

subax,Z

sbbdx,Z+2

movW,ax

movW+2,dx

〔解答〕

W=X+Y+24-Z

〔習題2.8〕請分別用一條匯編語言指令完成如下功能:

〔1〕把BX存放器和DX存放器的內(nèi)容相加,結(jié)果存入DX存放器。

〔2〕用存放器BX和SI的基址變址尋址方式把存諸器的一個字節(jié)與AL存放器的內(nèi)容

相加,并把結(jié)果送到AL中。

〔3[用BX和位移量OB2H的存放器相對尋址方式把存儲器中的一個字和CX存放器

的內(nèi)容相加,并把結(jié)果送回存儲器中。

〔4〕用位移量為0520H的直接尋址方式把存儲器中的一個字與數(shù)3412H相加,并

把結(jié)果送回該存儲單元中。

〔5〕把數(shù)0A0H與AL存放器的內(nèi)容相加,并把結(jié)果送回AL中。

〔解答〕

(1)ADDDX,BX

⑵ADDALJBX+SI]

〔3〕ADD[BX+0B2H],CX

⑷ADDWORDPTR[0520H],3412H

[5]ADDAL,OAOH

〔習題2.9〕設(shè)X、Y、Z、V均為16位帶符號數(shù),分別裝在X、Y、Z、V存儲單元中,

閱讀如下程序段,得出它的運算公式,并說明運算結(jié)果存于何處。

movax,X;ax=X

imulY;DX.AX=X*Y

movex,ax;cx=X*Y的低16位

moxbx,dx;bx=X*Y的高16位

movax,Z;ax=Z

cwd

addex,ax;cx=Z的低16位+X*Y的低16位

adcbx,dx;bx=Z的高16位+X*Y的高16位+低位進位

subex,540;cx=Z的低16位+X*Y的低16位-540

sbbbx,O;bx=Z的高16位+X*Y的高16位+低位進位-低位借位

movax,V;ax=V

cwd

subax,cx;ax=V的低16位-〔Z的低16位+X*Y的低16位-540〕

sbbdx,bx;dx=V的高16位-〔Z的高16位+X*Y的高16位+低位進位■低位借位〕

?低位借位

idivX;/X

〔解答J

[V-(X*Y+Z-540)]/X

AX存商,DX存余數(shù)

〔習題2.10〕指出以下指令的錯誤:

[1]xchg[si],30h

〔2〕popcs

⑶sub[si],[di]

〔4〕pushah

⑸adcax,ds

〔6〕add[si],80h

[7]inal,3fch

〔8〕outdx,ah

〔解答〕

〔1〕xchg的操作數(shù)不能是立即數(shù)

〔2〕不應對CS直接賦值

〔3〕兩個操作數(shù)不能都是存儲單元

〔4〕堆棧的操作數(shù)不能是字節(jié)量

[5)adc的操作數(shù)不能是段存放器

〔6〕沒有確定是字節(jié)還是字操作

[7]in不支持超過FFH的直接尋址

〔8〕out只能以AL/AX為源操作數(shù)

〔習題2.11〕給出以下各條指令執(zhí)行后的結(jié)果,以及狀態(tài)標志CF、OF、SF、ZF、PF

的狀態(tài)。

movax,1470h

andax,ax

orax,ax

xorax,ax

notax

testax,OfOfOh

〔解答〕

movax,1470h;AX=1470HCFZFSFOFPF

andax,ax;AX=1470H00000

;0001010001110000

oraxzax;AX=1470H00000

xorax,ax;AX=0000H01001

notax;AX=FFFFH01001

testax,OfOfOh;AX=FFFFH00101

注意:MOV和NOT指令不影響標志位;其他邏輯指令使CF二OF=0,根據(jù)結(jié)果影

響其他標志位。

〔習題2.12〕假設(shè)例題2.34的程序段中,AX=08H,BX=10H,請說明每條指令

執(zhí)行后的結(jié)果和各個標志位的狀態(tài)。

〔解答〕

指令;執(zhí)行結(jié)果CFOFSFZFPF

movsi,ax;SI=AX=0008H--------

shlsi,l;SI=2*AX=O01OHOOOO0

addsi,ax;SI=3*AX=0018H00001

movdx,bx;DX=BX=0010H00001

movcl,03h;CL=03H00001

shldx,cl;DX=8*BX=0080HOu000

subdx,bx;DX=7*BX=0070H00000

adddx,si;DX=7*BX+3*AX=0088H00001

注意:邏輯左移N次相當于無符號整數(shù)乘以2的N次方,邏輯右移N次相當于無符

號整數(shù)除以2的N次方。移位指令根據(jù)移位的數(shù)據(jù)設(shè)置CF,根據(jù)移位后的結(jié)果影響SF,

ZF,PF。在進行一位移位時,根據(jù)最高符號位是否改變設(shè)置OF,如改變那么OF=1。另

外,程序注釋用"u"表示標志無定義〔不確定〕,"/表示無影響。

〔習題2.13〕編寫程序段完成如下要求:

〔1〕用位操作指令實現(xiàn)AL〔無符號數(shù)〕乘以10

〔2〕用邏輯運算指令實現(xiàn)數(shù)字0~9的ASCII碼與非壓縮BCD碼的互相轉(zhuǎn)換

〔3〕把DX.AX中的雙字右移4位

〔解答〕

〔1〕;不考慮進位

movbl,al

movcl,3

shlal,cl;*8

addal,bl;shlblzl

addal,bl

;考慮進位

xorahzah

movbx,ax

movcl,3

shlax,cl

addax,bx;shlbx,l

addax,bx

〔2〕數(shù)字0?9的ASCII碼是:30h~39h

mF壓縮BCD石馬的0~9是:OOh~09h

方法一:

andal,Ofh;實現(xiàn)ASCII到非壓縮BCD碼的轉(zhuǎn)換

oral,30h;實現(xiàn)非壓縮BCD碼到ASCII的轉(zhuǎn)換

方法二:

xoral,30h;求反D5D4位,其他不變

;即高4位為3,那么變?yōu)?;高4位為0,那么變?yōu)?

(3)movcl,4

again:shrdx,l;實現(xiàn)邏輯右移

;采用nsardx,l〃,那么實現(xiàn)算術(shù)右移

rcraxzl

deccl

jnzagain

〔習題2.14]AL=F7H〔表示有符號數(shù)-9],分別編寫用SAR和IDIV指令實現(xiàn)的除

以2的程序段,并說明各自執(zhí)行后,所得的商是什么?

〔解答〕

⑴用sar編寫

moval,0f7h;-9送AL11111001

saral,l;結(jié)果:AL=11111100B=0FBH即-5

⑵用idiv編寫

moval,0f7h;-9送al

cbw;字節(jié)符號擴展位字

movbl,2;注意除數(shù)不可為立即數(shù)

idivbl;結(jié)果:商為al=fch(-4)

;余數(shù):ah=ffh(-1)

結(jié)論:符號數(shù)的除法用idiv準確。

〔習題2.15〕指令指針I(yè)P是通用存放器還是專用存放器?有指令能夠直接它賦值嗎?哪類

指令的執(zhí)彳亍會改變它的值?

〔解答〕

指令指針I(yè)P不是通用存放器,不可直接賦值,屬于專用存放器。有且僅有循環(huán)、轉(zhuǎn)移、

子程序調(diào)用和返回、中斷類等指令可以改變它的值。

〔習題2.16〕控制轉(zhuǎn)移類指令中有哪三種尋址方式?

〔解答〕

控制轉(zhuǎn)移類指令的尋址方式:相對尋址、直接尋址方式和間接尋址方式〔又可以分成

存放器和存儲器間接尋址〕0

〔習題2.17〕什么是短轉(zhuǎn)移shortjump、近轉(zhuǎn)移nearjump和遠轉(zhuǎn)移farjump?什

么是段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移?8086有哪些指令可以實現(xiàn)段間轉(zhuǎn)移?

〔解答〕

短轉(zhuǎn)移:指段內(nèi)-128~127之間的轉(zhuǎn)移,位移量用一個字節(jié)表示

近轉(zhuǎn)移:指段內(nèi)±32K之間的轉(zhuǎn)移,位移量用一個字表示

遠轉(zhuǎn)移:指段間1MB范圍的轉(zhuǎn)移

段內(nèi)轉(zhuǎn)移:指在同一個代碼段內(nèi)的轉(zhuǎn)移,可以是短轉(zhuǎn)移或者近轉(zhuǎn)移

段間轉(zhuǎn)移:指轉(zhuǎn)移到另外一個代碼段,就是遠轉(zhuǎn)移

8086/8088CPU的JMP、CALL和INTn指令可以實現(xiàn)段間轉(zhuǎn)移

〔習題2.18]8086的條件轉(zhuǎn)移指令的轉(zhuǎn)移范圍有多大?實際編程時,你如何處理超

出范圍的條件轉(zhuǎn)移?

〔解答〕

8086的條件轉(zhuǎn)移的轉(zhuǎn)移范圍:在當前指令地址的+127~?128之內(nèi)。

如條件轉(zhuǎn)移的轉(zhuǎn)移范圍超出此范圍,可在此范圍內(nèi)安排一條無條件轉(zhuǎn)移,再轉(zhuǎn)移到范

圍外的目標地址。

〔習題2.19〕假設(shè)DS=2000H,BX=1256H,SI=528FH,位移量TABLE=2OA1H,

[232F7H]=3280Hz[264E5H]=2450H,試問執(zhí)行以下段內(nèi)間接尋址的轉(zhuǎn)移指令后,轉(zhuǎn)移

的有效地址是什么?

[1]JMPBX

〔2〕JMPTABLE[BX]

⑶JMP[BX][SI]

〔解答〕

〔1〕轉(zhuǎn)移的有效地址EA=BX=1256H

〔2〕轉(zhuǎn)移的有效地址EA=[DS:20AlH+1256H]=[232F7]=3280H

[3]轉(zhuǎn)移的有效地址EA=[DS:1256H+528FH]=264E5H=2450H

〔習題2.20〕判斷以下程序段慟親的條件

(1)xorax,leleh

jeequal

(2)testallOOOOOOlb

jnzthere

⑶cmpcx,64h

jbthere

〔解答〕

⑴AX=leleh〔異或后為0〕

⑵AL的DO或D7至少有一位為1

(3)CX〔無符號數(shù)〕<64h

〔習題2.21]設(shè)置CX=0,那么LOOP指令將循環(huán)多少次?例如:

movcx,0

delaydoopdelay

〔解答〕

216次。

〔習題2.22〕假設(shè)AX和SI存放的是有符號數(shù),DX和DI存放的是無符號數(shù),請用比

擬指令和條件轉(zhuǎn)移指令實現(xiàn)以下判斷:

⑴假設(shè)DX>DI,轉(zhuǎn)到above執(zhí)行;

〔2〕假設(shè)AX>SI,轉(zhuǎn)到greater執(zhí)行;

〔3〕假設(shè)CX=0,轉(zhuǎn)到zero執(zhí)行;

⑷假設(shè)AX-SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行;

⑸假設(shè)SI<AX,轉(zhuǎn)至I」less-eq執(zhí)行;

[6[假設(shè)DI<DX,轉(zhuǎn)至I」below_eq執(zhí)行。

〔解答〕

⑴假設(shè)DX>DIf轉(zhuǎn)到above執(zhí)行

empdx,di

jaabove;=jnbeabove

⑵假設(shè)AX>SI,轉(zhuǎn)到greater執(zhí)行

empax,si

jggreater;=jnlegreater

⑶假設(shè)CX=0,轉(zhuǎn)到zero執(zhí)行

empcx,0

jzzero;=jexzzero

⑷假設(shè)AX-SI產(chǎn)生溢出,轉(zhuǎn)到overflow執(zhí)行;

empax,si

jooverflow

[5)假設(shè)SI<AX,轉(zhuǎn)到less.eq執(zhí)行;

cmpsi,ax;cmpax,si

jleless_eq;jgeless_eq

⑹假設(shè)DI<DX,轉(zhuǎn)到below_eq執(zhí)行。

cmpdi,dx;cmpdx,di

jbebelow_eq;jaebelow_eq

〔習題2.23〕有一個首地址為array的20個字的數(shù)組,說明以下程序段的功能。

movcx,20

movax,0

movsi,ax

sumjoop:addax,array[si]

addsi,2

loopsumjoop

movtotal,ax

〔解答〕

將首地址為array得20個字的數(shù)組求和,并將結(jié)果存入total單元中。

〔習題2.24〕按照以下要求,編寫相應的程序段:

[1]起始地址為string的主存單元中存放有一個字符串〔長度大于6〕,把該字符串

中的第1個和第6個字符〔字節(jié)量〕傳送給DX存放器。

[2]從主存buffer開始的4個字節(jié)中保存了4個非壓縮BCD碼,現(xiàn)揚氐〔高〕地

址對低〔高〕位的原那么,將它們合并到DX中。

〔3〕編寫一個程序段,在DX高4位全為。時,使AX=0;否那么使AX=-1。

〔4〕有兩個64位數(shù)值,按"小端方式〃存放在兩個緩沖區(qū)buffer1和bu仟er2中,

編寫程序段完成bufferl-buffer2功能。

〔5〕假設(shè)從B800h:0開始存放有100個16位無符號數(shù),編程求它們的和,并把

32位的和保存在DX.AX中。

〔6〕字符串string包含有32KB內(nèi)容,將其中的‘$'符號替換成空格。

[7]有一個100個字節(jié)元素的數(shù)組,其首地址為array,將每個元素減1〔不考慮溢

出〕存于原處。

〔8〕統(tǒng)計以‘$'結(jié)尾的字符串srting的字符個數(shù)。

〔解答〕

(1)解答:

movsi,0

movdl,string[si];第1個字符送dl存放器:movdl,stirng[O]

movsi,5

;第個字符送存放器:

movdhzstring[si]6dhmovdl,stirng[5]

⑵解答:

xorsi,si;si清零

moval,buffer[si];第一字節(jié)

incsi

movah,buffer[si];第二字節(jié)

movcl,4

shlah,cl;BCD碼碎!J高半字節(jié)

oralah;組合成壓縮BCD碼

movdl,al;存入dl寄..

incsi

moval,buffer[si];第三字節(jié)

incsi

movah,buffer[si];第四字節(jié)

movcl,4

shlah,cl;BCD碼移到高半字節(jié)

oral,ah;組合成壓縮BCD碼

movdh,al;存入dh寄..

[3)解答:

testdx,OfOOOh;testdh,OfOh

jznext;jnznext

movax,-l;movax,0

jmpagain

next:movax,0;movax,Offffh

again:...

⑷解答:

movax,wordptrbufferl

subax,wordptrbuffer2;先減低16位

movdx,wordptrbufferl+2

sbbdx,wordptrbuffer2+2;后減高16位,需減低16位的借位

⑸解答:

movax,0b800h

movds,ax;E殳地址

xorsi,si;地址偏移量si=0

xordx,dx;和的高字dx=0

movcx,99;加的次數(shù)

movax,[si];第一個數(shù)

again:incsi;指向下一個字單元

incsi

addaxz[si];加下一個數(shù)

jncnoc;無進位轉(zhuǎn)

incdx;有進位dx=dx+l

noc:decex;次數(shù)?1

jnzcx,again;非0繼續(xù)加

〔6〕解答1:不使用串操作指令〔更好〕

movsi,offsetstring

movcx,8000h;32k=2A15=8000h

again:empbyteptr[si],$;$=24h

jnznext;不要采用jz進行分支

movbyteptr[si],'';"=20h

next:incsi

loopagain;decex

;jnzagain

〔6〕解答2:使用串操作指令

movdi,offsetstring

moval/$'

movcx,8000h

cld

again:scasb

jnznext

movbyteptres:[di-1],

next:loopagain

⑺解答1:

movsi,offsetarray

movex,100

again:decbyteptr[si]

incsi

loopagain

[7)解答2:

xorsi,si;si<—0

movex,100;循環(huán)次數(shù)

again:decarray[si]

incsi

loopagain

[7]解答3:

movsi,offsetarray

movdi,si

movax,ds

moves,ax

movex,100

eld

againdodsb

decal

stosb

loopagain

⑻解答:

xorsi,si;si<—0

court:empstring[si],$

jedone

incsi

jmpcoun

done:...

〔習題2.25〕對下面要求,分別給出3種方法,每種方法只用一條指令。

(1)使CF=0(2)使AX=0⑶同時使AX=0和CF=0

〔解答〕

(1)解答:

cic

andax,ax

orax,ax

⑵解答:

xorax,ax

andax,0

movax,0

⑶解答:

andax,0

xorax,ax

subax,ax

〔習題2.26〕參照本習題的示意圖,分析調(diào)用序列,畫出每次調(diào)用及返回時的堆棧狀

態(tài)。其中CALL前是該指令所在的邏輯地址;另外,段內(nèi)直接調(diào)用指令的機器代碼的字節(jié)

數(shù)為3,段間直接調(diào)用指令那么為5個字節(jié)。

〔解答〕

主程序轉(zhuǎn)子suba時段內(nèi)調(diào)用:斷點1為2000h:0400h+3,

轉(zhuǎn)子是只將IP壓棧。

suba轉(zhuǎn)子subb時段間調(diào)用:斷點2為2000h:0840h+5,轉(zhuǎn)子時須將cs段地址和

IP壓棧

suba轉(zhuǎn)子subc時段內(nèi)調(diào)用:斷點3為2000h:0c021h+3,轉(zhuǎn)子是只將IP壓棧。

注:壓棧時先修改再壓入斷點,彈棧時先彈出斷點再修改

spspo

〔習題2.27]AX、BX存放的是4位壓縮BCD表示的十進制數(shù),請說明如下子程序

的功能和出口參數(shù)。

addal,bl

daa

xchgal,ah

adcal,bh

daa

xchgal,ah

ret

〔解答〕

壓縮BCD碼力口法:AX-AX+BX

出口參數(shù):AX=BCD碼和

〔習題2.28]AAD指令是用于除法指令之前,進行非壓縮BCD碼調(diào)整的。實際上,

處理器的調(diào)整過程是:AL-AHx10+AL,AH-0。如果指令系統(tǒng)沒有AAD指令,請用一

個子程序完成這個調(diào)整工作。

〔解答〕

shlah,l;ah=2*a(設(shè)原ah=a)

movdl,ah;dl=2*a

movcl,2;設(shè)定移位次數(shù)

shlah,cl;ah=8*a

addah,dl;ah=10*a

addal/ah;al=10*a+al

xorah,ah;清零ah

int3;返回DOS

注意:入口:AX中存放有"和"〔兩非壓縮BCD碼〕

出口:AL中已為調(diào)整后的二進制數(shù)

〔習題2.29〕解釋如下有關(guān)中斷的概念:

〔1〕內(nèi)部中斷和外部中斷

〔2〕單步中斷和斷點中斷

〔3〕除法錯中斷和溢出中斷

〔4〕中斷向量號和中斷向量表

〔解答〕

〔1〕內(nèi)部中斷是由于8086CPU內(nèi)部執(zhí)行程序引起的程序中斷;外部中斷是來自

8086CPU之外的原因引起的程序中斷;

〔2〕單步中斷是假設(shè)單步標志TF為1,那么在每條指令執(zhí)行結(jié)束后產(chǎn)生的中斷;斷

點中斷是供調(diào)試程序使用的,它的中斷類型號為3通常調(diào)試程序時,把程序按程序的任務

分成幾段,然后,每段設(shè)一個段點;

〔3〕除法錯中斷是在執(zhí)行除法指令時,假設(shè)除數(shù)為0或商超過了存放器所能表達的范

圍產(chǎn)生的中斷;溢出中斷是在執(zhí)行溢出中斷指令I(lǐng)NTO時,假設(shè)溢出標志OF為1時產(chǎn)生

的中斷;

〔4〕中斷向量號是中斷類型號;中斷向量表是中斷向量號與它所對應的中斷效勞程

序起始地址的轉(zhuǎn)換表。

〔習題2.30〕試比擬INTn和段間CALL指令、IRET和段間RET指令的功能。

〔解答〕

INTn響應中斷時,除象CALL保護斷點外,還應保護FR;段間CALL指令用在主程

序中實現(xiàn)子程序的調(diào)用。IRET返回時,除象RET恢復斷點外,還應恢復FR;子程序執(zhí)行

完成后,應返回主程序中繼續(xù)執(zhí)行,這一功能由RET指令完成。

第3章匯編語言程序格式

〔習題3.1)偽指令語句與硬指令語句的本質(zhì)區(qū)別是什么?偽指令有什么主要作用?

〔解答〕

偽指令語句與硬指令語句的本質(zhì)區(qū)別是能不能產(chǎn)生CPU動作;

偽指令的作用是完成對如存儲模式、主存變量、子程序、宏及段定義等很多不產(chǎn)生CPU

動作的說明,并在程序執(zhí)行前由匯編程序完成處理。

〔習題3.2]什么是標識符,匯編程序中標識符怎樣組成?

〔解答〕

為了某種需要,每種程序語言都規(guī)定了在程序里如何描述名字,程序語言的名字通常

被稱為標識符;

匯編語言中的標識符一般最多由31個字母、數(shù)字及規(guī)定的特殊符號〔如一,$,?,

@〕組成,不能以數(shù)字開頭,

〔習題3.3〕什么是保存字,匯編語言的保存字有哪些類型,并舉例說明。

〔解答

保存字是在每種語言中規(guī)定了有特殊意義和功能的不允許再做其它用處的字符串;匯

編語言的保存字主要有硬指令助記、偽指令助記符、運算符、存放器名以及預定義符號等。

匯編語言對大小寫不敏感。如定義字節(jié)數(shù)和字符串的DB就是偽指令助記符。

〔習題3.4〕匯編語句有哪兩種,每個語句由哪4個局部組成?

〔解答〕

匯編語句有執(zhí)行性語句和說明性語句;

執(zhí)行性語句由標號、硬指令助記符、操作數(shù)和注釋四局部組成;

說明性語句由名字、偽指令助記符、參數(shù)和注釋四局部組成

〔習題3.5〕匯編語言程序的開發(fā)有哪4個步驟,分別利用什么程序完成、產(chǎn)生什么

輸出文件。

〔解答〕

1.編輯文本編輯程序匯編語言源程序.asm

2.匯編匯編程序目標模塊文件.obj

3.連接連接程序可執(zhí)行文件.exe或

4.調(diào)試調(diào)試程序應用程序

〔習題3.6〕區(qū)分以下概念:

〔1〕變量和標號

〔2〕數(shù)值表達式和地址表達式

[3]符號常量和字符串常量

〔解答〕

〔1〕變量是在程序運行過程中,其值可以被改變的量;標號是由用戶自定義的標識符,

指向存儲單元,表示其存儲內(nèi)容的邏輯地址。

〔2〕數(shù)值表達式一般是由運算符連接的各種常數(shù)所構(gòu)成的表達式,地址表達式是由名

字、標號以及利用各種的操作符形成的表達式。

〔3〕在程序中,為了使常量更便于使用和閱讀,經(jīng)常將一些常量用常量定義語句定義

為符號常量,被一對雙引號括起來的假設(shè)干個字符組成的字符序列被稱為字符串常量。

〔習題3.7)假設(shè)myword是一個字變量,mybyte1和mybyte2是兩個字節(jié)變量,

指出以下語句中的錯誤原因。

〔1〕movbyteptr[bx],lOOO

〔2〕movbx,offsetmyword[si]

〔〕

3cmpmybytel/mybyte2

⑷moval,mybytel+mybyte2

〔5〕subaI,myword

〔6〕jnzmyword

〔解答〕

Cl)1000超出了一個字節(jié)范圍

〔2〕存放器的值只有程序執(zhí)行時才能確定,而offset是匯編過程計算的偏移地址,

故無法確定,改為leabx,myword[si]

〔3〕兩個都是存儲單元,指令不允許

〔4〕變量值只有執(zhí)行時才確定,匯編過程不能計算

〔5〕字節(jié)量AL與字量myword,類型不匹配

〔6〕Jcc指令只有相對尋址方式,不支持間接尋址方式

〔習題3.8)OPR1是一個常量,問以下語句中兩個AND操作有什么區(qū)別?

ANDAL,OPR1ANDOfeh

〔解答〕

前者為"與"操作硬指令助記符,可匯編成機器代碼。

后者為邏輯運算符,在匯編時進行"與"運算,產(chǎn)生具體數(shù)值。

〔習題3.9〕給出以下語句中,指令立即數(shù)〔數(shù)值表達式〕的值:

⑴moval,23hAND45hOR67h

〔2〕movax,1234h/16+10h

〔3〕movax,NOT(65535XOR1234h)

〔4〕moval,LOW1234hORHIGH5678h

⑸movax,23hSHL4

〔6〕movax,1234hSHR6

⑺moval;a'AND(NOTfa'A'))

〔8〕moval/H,OR00100000b

〔9〕movax,(76543LT32768)XOR7654h

〔解答〕

注:對于邏輯運算,有關(guān)操作數(shù)可化為二進制數(shù)。

(1)67h

溫馨提示

  • 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

提交評論