《微機原理與應(yīng)用》教材課后習(xí)題與答案_第1頁
《微機原理與應(yīng)用》教材課后習(xí)題與答案_第2頁
《微機原理與應(yīng)用》教材課后習(xí)題與答案_第3頁
《微機原理與應(yīng)用》教材課后習(xí)題與答案_第4頁
《微機原理與應(yīng)用》教材課后習(xí)題與答案_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《微機原理及應(yīng)用》習(xí)題答案

第一章

■1.11請完成下列數(shù)制轉(zhuǎn)換:

(1)將174.66D轉(zhuǎn)換為對應(yīng)的二進制和十六進制形式。

(2)將100011101011.01011B轉(zhuǎn)換為對應(yīng)的十進制和十六進制形式。

(3)將F18A6.6H轉(zhuǎn)換為對應(yīng)的二進制和十進制形式。

答:174.66D=10101110.1010B=AE.AH

100011101011.01011B=2283.34375D=8EB.58H

FI8A6.6H=989350.375D

■1.12請寫出與數(shù)據(jù)+37和-37對應(yīng)的8位機器數(shù)原碼、反碼和補碼,并分別用二進制和十

六進制表示出來。

答:-37D=(10100101B)原=(11011010B)反=(11011011B)補

■1.138位機器數(shù)46H,若作為無符號數(shù)和補碼有符號數(shù),其對應(yīng)的真值各是什么?若作

為BCD碼和ASCII碼,其對應(yīng)的又是什么?

答:無符號數(shù)46H=70,補碼46H=+70BCD碼46H=46,ASCII碼46H=“F”

第二章

?2.5什么是8088中的邏輯地址和物理地址?邏輯地址如何轉(zhuǎn)換成物理地址?1MB最多能

分成多少個邏輯段?請將如下邏輯地址用物理地址表達:

(1)FFFFH:0H(2)40H:17H(3)2000H:4500H(4)B821H:4567H

答:(1)FFFFH:0H=FFFFOH

(2)40H:17H=00417H

⑶2000H:4500H=24500H

(4)B821H:4567H=BC777H

?2.8已知DS=2000H,BX=0100H,SI=0002,存儲單元120I00H卜[20103H]依次存放

12H,34H,56H,78H,[21200H]~[21203H]依次存放2AH,4CH,87H,65H,說明下列每條指令執(zhí)行

完后AX寄存器的內(nèi)容以及源操作數(shù)的尋址方式?

答:⑴AX=1200H,立即數(shù)尋址;

(2)AX=0100H,寄存器尋址;

(3)AX=4C2AH,直接尋址;

(4)AX=3412H,寄存器間接尋址;

(5)AX=4C2AH,寄存器相對尋址;

(6)AX=7865H,基址變址尋址;

⑺AX=65B7H,基址變址相對尋址。

?2.9說明下面各條指令的具體錯誤原因:

(1)movcx,dl(2)movip,ax(3)moves,1234h(4)moves,ds

(5)moval,300(6)mov[spj,ax(7)movax,bx+di(8)mov20h,ah

答:⑴操作數(shù)類型不同:

⑵不能手工修改IP;

⑶不能將立即數(shù)直接MOV到段寄存器;

⑷不能在段寄存器之間直接MOV數(shù)據(jù);

(5)300大于AL所能存放的數(shù)據(jù)的范圍;

⑹寄存器間接尋址只能用BX/BP/SI/DI之一;

(7)MOVAX,[BX+DI];

⑻目的操作數(shù)不能是立即數(shù)。

?2.10已知數(shù)字0~9對應(yīng)的格雷碼依次為:18H,34H,O5H,O6H,O9H,OAH,OCH,11HJ2H,14H,

它存在于以table為首地址(設(shè)為200H)的連續(xù)區(qū)域中。請為如下程序段的每條指令加上注

釋,說明每條指令的功能和執(zhí)行結(jié)果。

leabx,table

moval,8

xlat

答:

leabx,table;bx=0200h

moval,8;al=08h

xlat;al=12h

?2.11給出下列各條指令執(zhí)行后的AL值,以及CF,ZF,SF,OF和PF的狀態(tài):

moval,89h

addal,al

addal,9dh

cmpal,Obch

subal,al

decal

incal

答:⑴al=89h

⑵al=12h,CF=1,ZF=0,SF=0,OF=1,PF=1,AF=1

(3)al=afh,CF=O,ZF=O,SF=1,OF=0,PF=1,AF=O

(4)al=afh,CF=1,ZF=O,SF=1,OF=1,PF=1,AF=0

(5)al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=0

(6)al=ffh,CF=O,ZF=O,SF=1QF=O,PF=1,AF=1

(7)al=00h,CF=O,ZF=1,SF=0,OF=0,PF=1,AF=1

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

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

(2)用寄存器BX和SI的基址變址尋址方式把存儲器的一個字節(jié)與AL寄存器的內(nèi)容相加

并把結(jié)果送到AL中。用BX和位移量OB2H的寄存器相對尋址

方式把存儲器中的一個字和CX寄存器的內(nèi)容相加,并把結(jié)果送回存

儲器中。

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

送回該存儲單元中。

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

答:

(1)adddx,bx;

⑵addaL[bx+si];

(3)add[bx+00b2h],ex

(4)addwordptr[0520h],3412h

(5)addaLOaOh

?2.13設(shè)X,Y,Z,V均為16位帶符號數(shù),分別裝在X,Y,Z,V存儲器單元中,閱讀如下程序段,

得出它的運算公式,并說明運算結(jié)果存于何處。

movax,x

imuly

movex,ax

moxbx,dx

movax,z

cwd

addex,ax

adcbx,dx

subex,540

abbbx,0

movax,v

cwd

subax,ex

abbdx,bx

idivx

答:(V—(X*Y+Z-540))/X

?2.14給出下列各條指令執(zhí)行后的結(jié)果,以及狀態(tài)標(biāo)志CF、OF、SF、ZF、PF的狀態(tài)。

movax,1470h

andax,ax

orax,ax

xorax,ax

notax

testax,OfOfOh

答:⑴ax=1470h

⑵ax=1470h,CF=0,ZF=0,SF=0,OF=0,PF=0

⑶ax=1470h,CF=0,ZF=0,SF=0,OF=0,PF=0

(4)ax=0000h,CF=0,ZF=0,SF=0,OF=1,PF=1

⑸ax=Offffh,CF=0,ZF=0,SF=0QF=1,PF=1

(6)ax=Offffh,CF=O,ZF=O,SF=1,OF=0,PF=1?2.16假設(shè)

DS=2000H,BX=1256H,TABLE的偏移地址是20A1H,物理地址232F7H處存放3280H,試

問執(zhí)行下列段內(nèi)間接尋址的轉(zhuǎn)移指令后,轉(zhuǎn)移的有效地址是什么?

答:⑴1256h;⑵3280h

?2.17判斷下列程序段跳轉(zhuǎn)的條件

(1)xoraxjeleh

jeequal

(2)testalJ000000lb

jnzthere

⑶cmpcx,64h

jbthere

答:⑴ax=leleh;(2)al=l******lb;(3)cx<64h

?2.18如下是一段軟件延時程序,請問NOP指令執(zhí)行了多少次?

xorcx,cx

delay:nop

loopdelay

答:65536

?2.19有一個首地址為array的20個字的數(shù)組,說明下列程序段的功能。

movcx,20

movax,0

movsi,ax

sumlp:addax,array[si]

addsi,2

loopsumlp

movtotai,ax

答:將array數(shù)組的20個字(無進位)累加,其和存入total單元。

?2.20按照下列要求,編寫相應(yīng)的程序段:

(1)由string指示的起始地址的主存單元中存放一個字符串(長度大于6),把該字符串

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

(2)有兩個32位數(shù)值,按“小端方式”存放在兩個緩沖區(qū)bufferl和buffer2中,編寫程

序段完成DX.AX-buffer1-buffer2功能。

(3)編寫一個程序段,在DX高4位全為。時,使AX=0;否則,使AX=?1。

(4)把DX.AX中的雙字右移4位。

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

位)存于原處。

答:

(1)movdl,string

movdh,string+5

(2)movax,wordptrbufferl

subax,wordptrbuffer2

movdx,wordptrbufferl+2

sbbdx,buffer2+2

(3)testdx,OfOh

jetl

movax,-1

jmpdone

tl:movax,0

done:.....

(4)movax,1234h

movdx,5678h

movex,4

Ipl:

shrdx,1

rcrax,1

loopIpl

(5)leabx,array

movex,100

Ipl:

sub[bx],1

incbx

loopIpl

?2.25編寫一個程序段:先提示輸入數(shù)字“InpulNumber:。?9"燃后在下一行顯示輸入的數(shù)

字,結(jié)束;如果不是鍵入了0?9數(shù)字,就提示錯誤"Error!”,繼續(xù)等待輸入數(shù)字。

答:

.modelsmall

.stack100h

.data

messagedb“InputNumber:0?9”,Odh,Oah,$

errordb“Error!”,Odh,Oah,$

.code

.startup

movdx,offsetmessage

movah,09h

int21h

begin1:movah,Olh

int21h

empah"0”

jberrlempal.“9”

jaerrl

movdLal

movah,02h

int21h

.exit

errl:movoffseterror

movah,09h

int21h

jmpbegin1

end

第三章

3.11請設(shè)置一個數(shù)據(jù)段,按照如下要求定義變量:

(1)mylb為字符串變量,表示字符串“PersonalComputer”。

(2)my2b為用十進制數(shù)表示的字節(jié)變量,這個數(shù)的大小為20。

(3)my3b為用十六進制數(shù)表示的字節(jié)變量,這個數(shù)的大小為20。

(4)my4b為用二進制數(shù)表示的字節(jié)變量,這個數(shù)的大小為20。

(5)my5w為20個未賦值的字變量。

(6)my6c為100的符號常量。

(7)my7c為字符串常量,代替字符串“PersonalComputer”。

答:

?my1bdb"PersonalComputer^^

my2bdb20

my3bdb14h

my4bdb00010100b

my5wdw20dup(?)

my6cequ100

my7cequ<PersonalComputer

3.14設(shè)在某個程序中有如下片段,請寫出每條傳送指令執(zhí)行后寄存器AX的內(nèi)容:

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

orglOOh

varwdw1234h,5678h

varbdb3,4

varddd12345678h

buffdb10dup(?)

messdb'hello'

;代碼段

movax,offsetmess

movax,typebuff+typemess+typevard

movax,sizeofvarw+sizeofbuff+sizeofmess

movax,lengthofvarw+lengthofvard

答:

渝offsetvarb=0104h

offsetmess=0114h

?typebuff=1;typemess=1;

typevard=4

■sizeofvarw=4;sizeofbuff=10;

sizeofmess=5

.lengthofvarw=2:lengthofvard=1

3.15假設(shè)myword是一個字變量,mybytel和mybyte2是兩個字節(jié)變量,指出下列語句中

的具體錯誤原因。

(1)movbyteptr[bx],1000

(2)movbx,offsetmyword[si]

(3)cmpmybytel,mybyte2

(4)movmybytel,al+l

(5)subal,myword

(6)jnzmyword

答:

01)1000大于字節(jié)變量所能表示的范圍

movbyteptr[BX],5

表示的意思是把5以字節(jié)的形式傳送給DS:BX,

1000超過了Offh,也就是大于1個字節(jié),所以無法傳送會出現(xiàn)errorA2050:Valueoutofrange(值超出

范圍)

數(shù)據(jù)類型不匹配,目的地址單元是字節(jié)單元,1000大于255。無法存放。

#(2)OFFSET只能用于簡單變量

OFFSET后只能跟標(biāo)識符。

?(3)雙操作數(shù)不能同時為存儲器操作數(shù)

CMP的兩個操作數(shù)不能同時在存儲器中。

?⑷數(shù)值表達式應(yīng)為運算符加常量

運算符只能對常數(shù)進行操作,不能對變量進行操作。

.5)兩操作數(shù)類型不一致

數(shù)據(jù)類型不匹配,AL是8位的,MYWORD是16位變量。

?⑹條件跳轉(zhuǎn)只能是短跳轉(zhuǎn)

MYWORD是變量,其指的單元中存放的是操作數(shù),不能用做跳轉(zhuǎn)入口。

3.17已知用于LED數(shù)碼管的顯示代碼表為:

LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

db80h,90h,88h,83h,0c6h,0c1h,86h,8eh

它依次表示0?9,A?F這16個數(shù)碼的顯示代碼?,F(xiàn)編寫一個程序?qū)崿F(xiàn)將lednum中的一個數(shù)

字(。?9、A?F)轉(zhuǎn)換成對應(yīng)的LED顯示代碼。

答:

stacksegmentstack

dblOOhdup(?)

stackends

datasegment

ledtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

db80h,90h,88h,83h,0c6h,0c1h,86h,8eh

lednumdb3

dataends

codesegment'code*

assumecs:code,ss:stack,ds:data

start:

movax,data

movds,ax

leabxjedtable

moval,lednum

xlat

movax,4c00h

int21h

codeends

endstart

解析:stack段是缺省的堆棧段時寫成stacksegmentparastack&tacK比較簡單省事兒,因為這樣鏈接程

序會自動設(shè)置exe可執(zhí)行文件里初始堆棧指針,程序里就不用自己進行設(shè)置了。如果沒有最后的那

個'stack'說明項,就需要自己設(shè)置ss:sp?!痵tack堤類別名。

把我定義的stacksegment關(guān)聯(lián)到棧,省去了assumess:stack對么,所以我可以寫成stacksegmentstack.

3.18編制一個程序,把變量bufX和bufY中較大者存入bu億;若兩者相等,則把其中之

一存入bu億中。假設(shè)變量存放的是8位有符號數(shù)。

答:

datasegment

xdb13

ydb-3

zdb?

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code'

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

moval,x

movah,y

cmpal,ah

jbechange

movz,ah

jmpdone

change:

movz,al

done:

movax,4c00h

int21h

codeends

endstart

3.19設(shè)變量bufX為有符號數(shù)16位數(shù),請將它的符號狀態(tài)保存在signX,即:如果變量值大

于等于0,保存0;如果X小于0,保存-1.編寫該程序。

答:

datasegment

buffxdw13

signxdw?

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code1

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

movax,buffx;ax=13

cmpax,0

jbechange

movsignx,0

jmpdone

change:

movsignx,-1

done:

movax,4c00h

int21h

codeends

endstart

3.20bufX、bufY和bu億是3個有符號十六進制數(shù),編寫一個比較相等關(guān)系的程序:

(1)如果這3個數(shù)都不相等,則顯示0。

(2)如果這3個數(shù)中有兩個數(shù)相等,則顯示1。

(3)如果這3個數(shù)都相等,則顯示2。

答:

datasegment

bufxdb13

bufydb-3

bufzdb-3

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code'

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

moval,bufx

movbl,bufy

movcl,bufz

cmpal,bl

jecac

cmpal,cl

jeviewl

cmpbl,cl

jeviewl

movdl;Of

jmpview

cac:

cmpal,cl

jeview2

viewl:

movdl;r

jmpview

view2:

movdl/21

view:

movah,O2h

int21h

movax,4c00h

int21h

codeends

endstart

3.21例3.7中,如果要實現(xiàn)所有為1的位都順序執(zhí)行相應(yīng)的處理程序段(而不是例題中僅

執(zhí)行最低為1位的處理程序段),請寫出修改后的代碼段?

答:

datasegment

numberdb78h

addrsdwoffsetfunO,offsetfunl,offsetfun2,offsetfun3,

offsetfun4,offsetfun5,offsetfun6,offsetfun7

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code'

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

movdh,number

movex,8

movbx,0

Ipl:

shrdh,1

jcnext

again:

incbx

incbx

loopIpl

jmpdone

next:

jmpaddrsfbx]

funO:

movdl,'O'

jmpview

funl:

movdl,T

jmpview

fun2:

movdl,2

jmpview

fun3:

movdl,3'

jmpview

fun4:

movdl,4

jmpview

fun5:

movdi,'5'

jmpview

fun6:

movdl,6

jmpview

fun7:

movdl,7'

jmpview

view:

movah,02h

int21h

jmpagain

done:

movax,4c00h

int21h

codeends

endstart

3.22編制程序完成12H,45H,F3H,6AH,20H,FEH,90H,C8H,57H和34H共10個無符號

字節(jié)數(shù)據(jù)之和,并將結(jié)果存入字節(jié)變量SUM中(不考慮進位)。

答:

datasegment

numdb12h,45h,Of3h,6ah,20h,Ofeh,90h,Oc8h,57h,34h

sumdb?

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code'

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

movex,10

leabx,num

again:

moval,[bx]

addsum,al

incbx

loopagain

movax,4c00h

int21h

codeends

endstart

3.23求主存0040H:0開始的一個64KB物理段中共有多少個空格?

答:

stacksegmentstack

db100dup(?)

stackends

codesegment'code'

assumecs:code,ss:stack

start:

movax,0040h

moves,ax

movdi,0

movex,0

movbx,0

moval,'*

again:

scasb

jnenext

incbx

next:

decex

jneagain

movax,4c00h

int21h

codeends

endstart

3.24編寫計算100個正整數(shù)之和的程序。如果和不超過16位字的范圍(65535),則保存

其和到wordsum,如超過則顯示4overflow!\

答:

datasegment

numdw100dup(800)

sumdw?

msgdb'Overflow!',13,10,$

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code1

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

movex,100

leabx,num

movax,0

again:

addax,[bx]

incbx

incbx

jcerr

loopagain

movsum,ax

jmpdone

err:

movdx,offsetmsg

movah,09h

int21h

done:

movax,4c00h

int21h

codeends

endstart

3.25編制程序完成將一個16位無符號二進制數(shù)轉(zhuǎn)換成為用8421BCD碼表示的5位十進制

數(shù)。轉(zhuǎn)換算法可以是:用二進制數(shù)除以10000,商為“萬位”,再用余數(shù)除以1000,得到“千

位”;一次用余數(shù)除以100、10和1,得到“百位”、“十位”和“個位”。

答:

datasegment

bnumdw19982

dnumdb5dup(?)?*$'

dataends

stacksegmentstack

db100dup(?)

stackends

codesegment'code1

assumecs:code,ds:data,ss:stack

start:

movax,data

movds,ax

movax,bnum

leabx,dnum

movdl,0

cwd

movex,10000

divex

addal,30h

mov[bxj,al

incbx

movax,dx

cwd

movex,1000

divex

addal,30h

mov[bx],al

incbx

movax,dx

cwd

movex,100

divex

addal,30h

mov[bx],al

incbx

movax,dx

cwd

movex,10

divex

addal,30h

mov[bx],al

incbx

adddl,30h

mov[bxj,dl

movdx,offsetdnum

movah,09h

int21h

movax,4c00h

int21h

codeends

endstart

3.27編寫一個源程序,在鍵盤上按一個鍵,將從AL返回的ASCII碼值顯示出來,如果按

下ESC鍵則程序退出。

答:

stacksegmentstack

dblOOhdup(?)

stackends

codesegment'code'

assumecs:code,ss:stack

start:

movah,O7h

int21h

cmpal,Ibh

jedone

pushax

movdl,al

movcl,4

shrdl,cl

callhtoasc

movah,02h

int21h

popax

movdl,al

anddl,Ofh

callhtoasc

movah,02h

int21h

jmpstart

done:

movax,4c00h

int21h

htoascproc

adddl,30h

cmpdl,39h

jbehtoend

adddl,7

htoend:

ret

htoascendp

codeends

endstart

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

;子程序功能:把用ASCII碼表示的兩位十進制數(shù)轉(zhuǎn)換位對應(yīng)二進制數(shù)

;入口參數(shù):DH=十位數(shù)的ASCH碼,DL=j位數(shù)的ASCH碼

;出口參數(shù):AL二對應(yīng)的二進制數(shù)

答:

stacksegmentstack

dblOOhdup(?)

stackends

codesegment'code'

assumecs:code,ss:stack

start:

movdx,3932h

callasctoh

movax,4c00h

int21h

asctohproc

pushex

subdx,3030h

movcl,10

moval,dh

mulcl

addal,dl

popex

ret

asctohendp

codeends

endstart

3.29調(diào)用HTOASC子程序,編寫顯示一個字節(jié)的16進制數(shù)、后跟“H”的子程序。

答:

stacksegmentstack

dblOOhdup(?)

stackends

codesegment'code1

assumecs:code,ss:stack

start:

movah,07h

int21h

empal,Ibh

jedone

callhtoah

jmpstart

done:

movax,4c00h

int21h

htoahproc

pushax

pushex

pushdx

pushax

movdl,al

movcl,4

shrdl,cl

callhtoasc

movah,02h

int21h

popax

movdl,al

anddl,Ofh

callhtoasc

movah,02h

int2lh

movdl,H

movah,02h

int21h

popdx

popex

popax

ret

htoahendp

htoascproc

adddl,30h

empdl,39h

jbehtoend

adddl,7

htoend:

ret

htoascendp

codeends

endstart

3.30寫一個子程序,根據(jù)入口參數(shù)AL=0、1、2,

溫馨提示

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

評論

0/150

提交評論