版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《微机原理及应用》习题答案
第一章
■1.11请完成下列数制转换:
(1)将174.66D转换为对应的二进制和十六进制形式。
(2)将100011101011.01011B转换为对应的十进制和十六进制形式。
(3)将F18A6.6H转换为对应的二进制和十进制形式。
答:174.66D=10101110.1010B=AE.AH
100011101011.01011B=2283.34375D=8EB.58H
FI8A6.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
答:(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,说明下列每条指令执行
完后AX寄存器的内容以及源操作数的寻址方式?
答:⑴AX=1200H,立即数寻址;
(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
答:⑴操作数类型不同:
⑵不能手工修改IP;
⑶不能将立即数直接MOV到段寄存器;
⑷不能在段寄存器之间直接MOV数据;
(5)300大于AL所能存放的数据的范围;
⑹寄存器间接寻址只能用BX/BP/SI/DI之一;
(7)MOVAX,[BX+DI];
⑻目的操作数不能是立即数。
•2.10已知数字0~9对应的格雷码依次为:18H,34H,O5H,O6H,O9H,OAH,OCH,11HJ2H,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,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寄存器的内容相加,结果存入DX寄存器。
(2)用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加
并把结果送到AL中。用BX和位移量OB2H的寄存器相对寻址
方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存
储器中。
(4)用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果
送回该存储单元中。
(5)把数0A0H与AL寄存器的内容相加,并把结果送回AL中。
答:
(1)adddx,bx;
⑵addaL[bx+si];
(3)add[bx+00b2h],ex
(4)addwordptr[0520h],3412h
(5)addaLOaOh
・2.13设X,Y,Z,V均为16位带符号数,分别装在X,Y,Z,V存储器单元中,阅读如下程序段,
得出它的运算公式,并说明运算结果存于何处。
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给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
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假设
DS=2000H,BX=1256H,TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试
问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?
答:⑴1256h;⑵3280h
•2.17判断下列程序段跳转的条件
(1)xoraxjeleh
jeequal
(2)testalJ000000lb
jnzthere
⑶cmpcx,64h
jbthere
答:⑴ax=leleh;(2)al=l******lb;(3)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
movtotai,ax
答:将array数组的20个字(无进位)累加,其和存入total单元。
•2.20按照下列要求,编写相应的程序段:
(1)由string指示的起始地址的主存单元中存放一个字符串(长度大于6),把该字符串
的第1个和第6个字符(字节量)传送给DX寄存器。
(2)有两个32位数值,按“小端方式”存放在两个缓冲区bufferl和buffer2中,编写程
序段完成DX.AX-buffer1-buffer2功能。
(3)编写一个程序段,在DX高4位全为。时,使AX=0;否则,使AX=・1。
(4)把DX.AX中的双字右移4位。
(5)有一个100个字节元素的数组,其首地址为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编写一个程序段:先提示输入数字“InpulNumber:。〜9"燃后在下一行显示输入的数
字,结束;如果不是键入了0〜9数字,就提示错误"Error!”,继续等待输入数字。
答:
.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请设置一个数据段,按照如下要求定义变量:
(1)mylb为字符串变量,表示字符串“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<PersonalComputer
3.14设在某个程序中有如下片段,请写出每条传送指令执行后寄存器AX的内容:
;数据段
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假设myword是一个字变量,mybytel和mybyte2是两个字节变量,指出下列语句中
的具体错误原因。
(1)movbyteptr[bx],1000
(2)movbx,offsetmyword[si]
(3)cmpmybytel,mybyte2
(4)movmybytel,al+l
(5)subal,myword
(6)jnzmyword
答:
01)1000大于字节变量所能表示的范围
movbyteptr[BX],5
表示的意思是把5以字节的形式传送给DS:BX,
1000超过了Offh,也就是大于1个字节,所以无法传送会出现errorA2050:Valueoutofrange(值超出
范围)
数据类型不匹配,目的地址单元是字节单元,1000大于255。无法存放。
#(2)OFFSET只能用于简单变量
OFFSET后只能跟标识符。
・(3)双操作数不能同时为存储器操作数
CMP的两个操作数不能同时在存储器中。
•⑷数值表达式应为运算符加常量
运算符只能对常数进行操作,不能对变量进行操作。
.5)两操作数类型不一致
数据类型不匹配,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中的一个数
字(。〜9、A〜F)转换成对应的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比较简单省事儿,因为这样链接程
序会自动设置exe可执行文件里初始堆栈指针,程序里就不用自己进行设置了。如果没有最后的那
个'stack'说明项,就需要自己设置ss:sp。’stack堤类别名。
把我定义的stacksegment关联到栈,省去了assumess:stack对么,所以我可以写成stacksegmentstack.
3.18编制一个程序,把变量bufX和bufY中较大者存入bu亿;若两者相等,则把其中之
一存入bu亿中。假设变量存放的是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'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个有符号十六进制数,编写一个比较相等关系的程序:
(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
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中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅
执行最低为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个无符号
字节数据之和,并将结果存入字节变量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个正整数之和的程序。如果和不超过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位无符号二进制数转换成为用8421BCD码表示的5位十进制
数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千
位”;一次用余数除以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码表示的两位十进制数转换位对应二进制数
;入口参数:DH=十位数的ASCH码,DL=j位数的ASCH码
;出口参数:AL二对应的二进制数
答:
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调用HTOASC子程序,编写显示一个字节的16进制数、后跟“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写一个子程序,根据入口参数AL=0、1、2,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华中农业大学动物科学技术学院动物医学院2027年硕士研究生部分专业招考招生计划笔试模拟试题及答案解析
- 2026年茂名市茂港区公务员人员招聘考试参考试题与答案详解
- 成都轻工职业技术大学2026年10月公开招聘人事代理工作人员(10人)笔试备考题库及答案解析
- 2026年莆田市涵江区公务员人员招聘考试模拟试题与答案详解
- 2026河南信阳市潢川县就业创业服务中心招聘2名全日制公益性岗位笔试模拟试题及答案解析
- 2026年皮革箱包行业洞察报告及未来五至十年发展趋势报告
- 2026上海现代制药股份有限公司纪检工作人员招聘笔试备考题库及答案解析
- 2026年湖南省常德市事业单位人员招聘笔试试题与答案详解
- 2026年医学生产用信息化学品制造行业现状及前景展望报告及未来五至十年智能体与场景落地
- 2026年黄山市黄山区国发投资控股集团有限公司公开招聘工作人员考试参考题库及答案解析
- 2026浙江宁波市镇海区蛟川街道办事处招聘5人笔试备考题库及答案详解
- 国企党务工作者(党建岗)面试题和专题题20问及答案
- 继发性甲状旁腺功能亢进
- 广东省粤科金融集团有限公司招聘笔试题库2026
- 2025-2030株洲轨道交通行业竞争格局分析及智能化升级研究
- 2025初中生汉字听写大会竞赛考试参考试题(含答案)
- 2026年淮北矿业集团所属企业招聘备考题库及完整答案详解
- (新教材)2026年人教部编版一年级上册语文 第8课 升国旗 课件
- 双电源自动切换系统实验报告
- 电子信息类专业导论(第3版)课件全套 张有光 00 课程简介 - 12 中国大学教育:理念与实践
- 初中语文阅读教学主问题设计:策略、实践与效能提升
评论
0/150
提交评论