最新《微机原理及应用》教材课后习题及答案.docx
《最新《微机原理及应用》教材课后习题及答案.docx》由会员分享,可在线阅读,更多相关《最新《微机原理及应用》教材课后习题及答案.docx(29页珍藏版)》请在冰豆网上搜索。
最新《微机原理及应用》教材课后习题及答案
《微机原理及应用》习题答案
第一章
⏹1.11请完成下列数制转换:
(1)将174.66D转换为对应的二进制和十六进制形式。
(2)将100011101011.01011B转换为对应的十进制和十六进制形式。
(3)将F18A6.6H转换为对应的二进制和十进制形式。
答:
174.66D=10101110.1010B=AE.AH
100011101011.01011B=2283.34375D=8EB.58H
F18A6.6H=989350.375D
⏹1.12请写出与数据+37和-37对应的8位机器数原码、反码和补码,并分别用二进制和十六进制表示出来。
答:
-37D=(10100101B)原=(11011010B)反=(11011011B)补
⏹1.138位机器数46H,若作为无符号数和补码有符号数,其对应的真值各是什么?
若作为BCD码和ASCII码,其对应的又是什么?
答:
无符号数46H=70,补码46H=+70BCD码46H=46,ASCII码46H=“F”
第二章
●2.5什么是8088中的逻辑地址和物理地址?
逻辑地址如何转换成物理地址?
1MB最多能分成多少个逻辑段?
请将如下逻辑地址用物理地址表达:
(1)FFFFH:
0H
(2)40H:
17H(3)2000H:
4500H(4)B821H:
4567H
答:
⑴FFFFH:
0H=FFFF0H
⑵40H:
17H=00417H
⑶2000H:
4500H=24500H
⑷B821H:
4567H=BC777H
●2.8已知DS=2000H,BX=0100H,SI=0002,存储单元[20100H]~[20103H]依次存放12H,34H,56H,78H,[21200H]~[21203H]依次存放2AH,4CH,87H,65H,说明下列每条指令执行完后AX寄存器的内容以及源操作数的寻址方式?
答:
⑴AX=1200H,立即数寻址;
⑵AX=0100H,寄存器寻址;
⑶AX=4C2AH,直接寻址;
⑷AX=3412H,寄存器间接寻址;
⑸AX=4C2AH,寄存器相对寻址;
⑹AX=7865H,基址变址寻址;
⑺AX=65B7H,基址变址相对寻址。
●2.9说明下面各条指令的具体错误原因:
(1)movcx,dl
(2)movip,ax(3)moves,1234h(4)moves,ds
(5)moval,300(6)mov[sp],ax(7)movax,bx+di(8)mov20h,ah
答:
⑴操作数类型不同;
⑵不能手工修改IP;
⑶不能将立即数直接MOV到段寄存器;
⑷不能在段寄存器之间直接MOV数据;
⑸300大于AL所能存放的数据的范围;
⑹寄存器间接寻址只能用BX/BP/SI/DI之一;
⑺MOVAX,[BX+DI];
⑻目的操作数不能是立即数。
●2.10已知数字0~9对应的格雷码依次为:
18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H,它存在于以table为首地址(设为200H)的连续区域中。
请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
leabx,table
moval,8
xlat
答:
leabx,table;bx=0200h
moval,8;al=08h
xlat;al=12h
●2.11给出下列各条指令执行后的AL值,以及CF,ZF,SF,OF和PF的状态:
moval,89h
addal,al
addal,9dh
cmpal,0bch
subal,al
decal
incal
答:
⑴al=89h
⑵al=12h,CF=1,ZF=0,SF=0,OF=1,PF=1,AF=1
⑶al=afh,CF=0,ZF=0,SF=1,OF=0,PF=1,AF=0
⑷al=afh,CF=1,ZF=0,SF=1,OF=1,PF=1,AF=0
⑸al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=0
⑹al=ffh,CF=0,ZF=0,SF=1,OF=0,PF=1,AF=1
⑺al=00h,CF=0,ZF=1,SF=0,OF=0,PF=1,AF=1
●2.12请分别用一条汇编语言指令完成如下功能:
(1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加并把结果送到AL中。
(3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。
答:
⑴adddx,bx;
⑵addal,[bx+si];
⑶add[bx+00b2h],cx
⑷addwordptr[0520h],3412h
⑸addal,0a0h
●2.13设X,Y,Z,V均为16位带符号数,分别装在X,Y,Z,V存储器单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处。
movax,x
imuly
movcx,ax
moxbx,dx
movax,z
cwd
addcx,ax
adcbx,dx
subcx,540
abbbx,0
movax,v
cwd
subax,cx
abbdx,bx
idivx
答:
(V-(X*Y+Z-540))/X
●2.14给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
movax,1470h
andax,ax
orax,ax
xorax,ax
notax
testax,0f0f0h
答:
⑴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
⑷ax=0000h,CF=0,ZF=0,SF=0,OF=1,PF=1
⑸ax=0ffffh,CF=0,ZF=0,SF=0,OF=1,PF=1
⑹ax=0ffffh,CF=0,ZF=0,SF=1,OF=0,PF=1
●2.16假设DS=2000H,BX=1256H,TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?
答:
⑴1256h;⑵3280h
●2.17判断下列程序段跳转的条件
(1)xorax,leleh
jeequal
(2)testal,10000001b
jnzthere
(3)cmpcx,64h
jbthere
答:
⑴ax=1e1eh;⑵al=1******1b;⑶cx<64h
●2.18如下是一段软件延时程序,请问NOP指令执行了多少次?
xorcx,cx
delay:
nop
loopdelay
答:
65536
●2.19有一个首地址为array的20个字的数组,说明下列程序段的功能。
movcx,20
movax,0
movsi,ax
sumlp:
addax,array[si]
addsi,2
loopsumlp
movtotal,ax
答:
将array数组的20个字(无进位)累加,其和存入total单元。
●2.20按照下列要求,编写相应的程序段:
(1)由string指示的起始地址的主存单元中存放一个字符串(长度大于6),把该字符串的第1个和第6个字符(字节量)传送给DX寄存器。
(2)有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。
(3)编写一个程序段,在DX高4位全为0时,使AX=0;否则,使AX=-1。
(4)把DX.AX中的双字右移4位。
(5)有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借位)存于原处。
答:
⑴movdl,string
movdh,string+5
⑵movax,wordptrbuffer1
subax,wordptrbuffer2
movdx,wordptrbuffer1+2
sbbdx,buffer2+2
⑶testdx,0f0h
jet1
movax,-1
jmpdone
t1:
movax,0
done:
…..
⑷movax,1234h
movdx,5678h
movcx,4
lp1:
shrdx,1
rcrax,1
looplp1
⑸leabx,array
movcx,100
lp1:
sub[bx],1
incbx
looplp1
●2.25编写一个程序段:
先提示输入数字“InputNumber:
0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!
”,继续等待输入数字。
答:
.modelsmall
.stack100h
.data
messagedb“InputNumber:
0~9”,0dh,0ah,“$”
errordb“Error!
”,0dh,0ah,“$”
.code
.startup
movdx,offsetmessage
movah,09h
int21h
begin1:
movah,01h
int21h
cmpal,“0”
jberr1
cmpal,“9”
jaerr1
movdl,al
movah,02h
int21h
.exit
err1:
movoffseterror
movah,09h
int21h
jmpbegin1
end
第三章
3.11请设置一个数据段,按照如下要求定义变量:
(1)my1b为字符串变量,表示字符串“PersonalComputer”。
(2)my2b为用十进制数表示的字节变量,这个数的大小为20。
(3)my3b为用十六进制数表示的字节变量,这个数的大小为20。
(4)my4b为用二进制数表示的字节变量,这个数的大小为20。
(5)my5w为20个未赋值的字变量。
(6)my6c为100的符号常量。
(7)my7c为字符串常量,代替字符串“PersonalComputer”。
答:
my1bdb“PersonalComputer”
my2bdb20
my3bdb14h
my4bdb00010100b
my5wdw20dup(?
)
my6cequ100
my7cequ
3.14设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
;数据段
org100h
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假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的具体错误原因。
⑴movbyteptr[bx],1000
(2)movbx,offsetmyword[si]
(3)cmpmybyte1,mybyte2
(4)movmybyte1,al+1
(5)subal,myword
(6)jnzmyword
答:
⑴1000大于字节变量所能表示的范围
movbyteptr[BX],5
表示的意思是把5以字节的形式传送给DS:
BX,
1000超过了0ffh,也就是大于1个字节,所以无法传送会出现errorA2050:
Valueoutofrange(值超出范围)
数据类型不匹配,目的地址单元是字节单元,1000大于255。
无法存放。
⑵OFFSET只能用于简单变量
OFFSET后只能跟标识符。
⑶双操作数不能同时为存储器操作数
CMP的两个操作数不能同时在存储器中。
⑷数值表达式应为运算符加常量
运算符只能对常数进行操作,不能对变量进行操作。
⑸两操作数类型不一致
数据类型不匹配,AL是8位的,MYWORD是16位变量。
⑹条件跳转只能是短跳转
MYWORD是变量,其指的单元中存放的是操作数,不能用做跳转入口。
3.17已知用于LED数码管的显示代码表为:
LEDtabledb0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
db80h,90h,88h,83h,0c6h,0c1h,86h,8eh
它依次表示0~9,A~F这16个数码的显示代码。
现编写一个程序实现将lednum中的一个数字(0~9、A~F)转换成对应的LED显示代码。
答:
stacksegmentstack
db100hdup(?
)
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
leabx,ledtable
moval,lednum
xlat
movax,4c00h
int21h
codeends
endstart
解析:
stack 段是缺省的堆栈段时写成 stack segment para stack'stack' 比较简单省事儿,因为这样链接程序会自动设置 exe 可执行文件里初始堆栈指针,程序里就不用自己进行设置了。
如果没有最后的那个 'stack' 说明项,就需要自己设置 ss:
sp 。
'stack'是类别名。
把我定义的stack segment关联到栈,省去了assume ss:
stack对么,所以我可以写成stack segment stack.
3.18编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。
假设变量存放的是8位有符号数。
答:
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设变量bufX为有符号数16位数,请将它的符号状态保存在signX,即:
如果变量值大于等于0,保存0;如果X小于0,保存-1.编写该程序。
答:
datasegment
buffxdw13
signxdw?
dataends
stacksegmentstack
db100dup(?
)
stackends
codesegment'code'
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和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:
(1)如果这3个数都不相等,则显示0。
(2)如果这3个数中有两个数相等,则显示1。
(3)如果这3个数都相等,则显示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
jeview1
cmpbl,cl
jeview1
movdl,'0'
jmpview
cac:
cmpal,cl
jeview2
view1:
movdl,'1'
jmpview
view2:
movdl,'2'
view:
movah,02h
int21h
movax,4c00h
int21h
codeends
endstart
3.21例3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段?
答:
datasegment
numberdb78h
addrsdwoffsetfun0,offsetfun1,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
movcx,8
movbx,0
lp1:
shrdh,1
jcnext
again:
incbx
incbx
looplp1
jmpdone
next:
jmpaddrs[bx]
fun0:
movdl,'0'
jmpview
fun1:
movdl,'1'
jmpview
fun2:
movdl,'2'
jmpview
fun3:
movdl,'3'
jmpview
fun4:
movdl,'4'
jmpview
fun5:
movdl,'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个无符号字节数据之和,并将结果存入字节变量SUM中(不考虑进位)。
答:
datasegment
numdb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h
sumdb?
dataends
stacksegmentstack
db100dup(?
)
stackends
codesegment'code'
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movcx,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
movcx,0
movbx,0
moval,''
again:
scasb
jnenext
incbx
next:
deccx
jneagain
movax,4c00h
int21h
codeends
endstart
3.24编写计算100个正整数之和的程序。
如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow!
’。
答:
datasegment
numdw100dup(800)
sumdw?
msgdb'Overflow!
',13,10,'$'
dataends
stacksegmentstack
db100dup(?
)
stackends
codesegment'code'
assumecs:
code,ds:
data,ss:
stack
start:
movax,da