微机原理前九章部分习题详解Word文档下载推荐.docx
《微机原理前九章部分习题详解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《微机原理前九章部分习题详解Word文档下载推荐.docx(54页珍藏版)》请在冰豆网上搜索。
![微机原理前九章部分习题详解Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/14/ff67b1e7-c143-4d2e-9b48-b7646ac4b7d5/ff67b1e7-c143-4d2e-9b48-b7646ac4b7d51.gif)
基本输入输出系统
主要功能:
用来驱动和管理诸如键盘、显示器、打印机、磁盘、时钟、串行通信接口等基本的输入输出设备
〔习题1.12〕
请写出与数据+37和-37对应的8位机器数原码、反码、补码和移码,并分别用二进制和十六进制表示出来。
原码反码补码
+37001101111100100000110111
-37101101111100100011001001
〔习题1.13〕
请将上题中+37和-37的8位补码机器数分别扩充为16位和32位的形式,用十六进制表示出来。
有符号数的扩展
0037H00000037H
FF37HFFFFFFF37H
〔习题1.14〕
8位机器数46H,若作为无符号数和补码有符号数看待,其对应的真值各是什么?
若作为BCD码和ASCII码看待,它代表的又各是什么?
无符号数:
4×
16+6=70
补码有符号数:
70(正数)
BCD码:
46
ASCII码:
大写字母‘F’
〔习题1.18〕
请分别写出数据50和50H所对应的BCD码,分别用二进制和十六进制数表示出来并将它们和原始数据进行对比。
5000110010
50H01010000
80H10000000
第二章
35689101112141617181920
〔习题2.3〕
什么是标志?
状态标志和控制标志有什么区别?
画出标志寄存器FLAGS,说明各个标志的位置和含义。
标志用于反映指令执行结果或控制指令执行形式。
状态标志记录程序运行结果的状态信息。
控制标志位由程序需要用指令进行设置,控制处理器执行指令的方式。
含义:
P29
〔习题2.5〕
什么是8088中的逻辑地址和物理地址?
逻辑地址如何转换成物理地址?
1MB最多能分成多少个逻辑段?
请将如下逻辑地址用物理地址表达:
(1)FFFFH:
0⑵40H:
17H⑶2000H:
4500H⑷B821H:
4567H
物理地址:
物理存储单元具有的一个唯一的20位编号
逻辑地址:
在8088内部和用户编程时,所采用的“段地址:
偏移地址”形式
将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址
1MB最多能分成1MB÷
16B=220÷
24=216个逻辑段,因为每隔16个字节单元就可以开始一个逻辑段
FFFFH:
0=FFFF0H
40H:
17H=00417H
2000H:
4500H=24500H
B821H:
4567H=BC777H
〔习题2.6〕
8088有哪4种逻辑段,各种逻辑段分别是什么用途?
•代码段(CodeSegment)用来存放程序的指令序列。
处理器利用CS:
IP取得下一条要执行的指令
•堆栈段(StackSegment)确定堆栈所在的主存区域。
处理器利用SS:
SP操作堆栈中的数据
•数据段(DataSegment)存放当前运行程序所用的数据。
处理器利用DS:
EA存取数据段中的数据
•附加段(ExtraSegment)是附加的数据段,也用于数据的保存。
处理器利用ES:
EA存取数据段中的数据
〔习题2.8〕
已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12H、34H、56H、78H,[21200H]~[21203H]依次存放2AH、4CH、B7H、65H,说明下列每条指令执行完后AX寄存器的内容,以及源操作数的寻址方式?
⑴movax,1200h
⑵movax,bx
⑶movax,[1200h]
⑷movax,[bx]
⑸movax,[bx+1100h]
⑹movax,[bx+si]
⑺movax,[bx][si+1100h]
⑴movax,1200h;
AX=1200H,立即数寻址
⑵movax,bx;
AX=0100H,寄存器寻址
⑶movax,[1200h];
AX=4C2AH,直接寻址
⑷movax,[bx];
AX=3412H,寄存器间接寻址
⑸movax,[bx+1100h];
AX=4C2AH,寄存器相对寻址
⑹movax,[bx+si];
AX=7856H,基址变址寻址
⑺movax,[bx][si+1100h];
AX=65B7H,相对基址变址寻址
〔习题2.9〕
说明下面各条指令的具体错误原因
⑴movcx,dl⑵movip,ax
⑶moves,1234h⑷moves,ds
⑸moval,300⑹mov[sp],ax
⑺movax,bx+di⑻mov20h,ah
(1)movcx,dl寄存器长度不匹配
(2)movip,axip为指令指针,不能随意修改
(3)moves,1234h不能将立即数直接给段附加寄存器
(4)moves,ds段寄存器间不能直传
(5)moval,300300超出al的范围(6)mov[sp],ax入栈操作pushax
(7)movax,bx+di应为movax,[bx+di](8)mov20h,ah目的操作数不能为立即数
〔习题2.10〕
已知数字0~9对应的格雷码依次为:
18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。
请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
leabx,table
moval,8
xlat
leabx,table;
获取table的首地址,BX=200H
moval,8;
传送欲转换的数字,AL=8
xlat;
转换为格雷码,AL=12H
〔习题2.11〕
给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:
moval,89h
addal,al
addal,9dh
cmpal,0bch
subal,al
decal
incal
moval,89h;
AL=89HCFZFSFOFPF
addal,al;
AL=12H10011
addal,9dh;
AL=0AFH00101
cmpal,0bch;
AL=0AFH10101
subal,al;
AL=00H01001
decal;
AL=0FFH00101
incal;
〔习题2.12〕
请分别用一条汇编语言指令完成如下功能:
⑴把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。
⑵用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
⑶用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。
⑷用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中。
⑸把数0A0H与AL寄存器的内容相加,并把结果送回AL中
⑴把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器adddx,bx
⑵用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中addal,[bx+si]
⑶用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中add[bx+0b2h],cx
⑷用位移量为0520H的直接寻址方式把存储器中的一个字与数3412H相加,并把结果送回该存储单元中
addwordptr[0520h],3412h
⑸把数0A0H与AL寄存器的内容相加,并把结果送回AL中addal,0a0h
〔习题2.14〕
给出下列各条指令执行后的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
movax,1470h
andax,ax
orax,ax
xorax,ax
notax
testax,0f0f0h
movax,1470h;
AX=1470HCFZFSFOFPF
andax,ax;
AX=1470H00000
orax,ax;
AX=1470H00000
xorax,ax;
AX=0000H01001
notax;
AX=FFFFH01001
testax,0f0f0h;
AX=FFFFH00101
〔习题2.16〕
假设DS=2000H、BX=1256H、TABLE的偏移地址是20A1H,物理地址232F7H处存放3280H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么?
⑴JMPBX
1JMPTABLE[BX]
1256H
3280H
〔习题2.17〕
判断下列程序段跳转的条件
⑴xorax,1e1eh
jeequal
⑵testal,10000001b
jnzthere
⑶cmpcx,64h
jbthere
jeequal;
AX=1e1eh(异或后为0)
jnzthere;
AL的D0或D7至少有一位为1
2cmpcx,64h
jbthere;
CX(无符号数)<64h
〔习题2.18〕
如下是一段软件延时程序,请问NOP指令执行了多少次?
xorcx,cx
delay:
nop
loopdelay
FF次
〔习题2.19〕
有一个首地址为array的20个字的数组,说明下列程序段的功能。
movcx,20
movax,0
movsi,ax
sumlp:
addax,array[si]
addsi,2
loopsumlp
movtotal,ax
对数组中的20个字求和,结果保存在total中
〔习题2.20〕
按照下列要求,编写相应的程序段:
⑴由string指示起始地址的主存单元中存放有一个字符串(长度大于6),把该字符串中的第1个和第6个字符(字节量)传送给DX寄存器。
⑵有两个32位数值,按“小端方式”存放在两个缓冲区buffer1和buffer2中,编写程序段完成DX.AX←buffer1-buffer2功能。
⑶编写一个程序段,在DX高4位全为0时,使AX=0;
否则使AX=-1。
⑷把DX.AX中的双字右移4位
⑸有一个100个字节元素的数组,其首地址为array,将每个元素减1(不考虑溢出或借位)存于原处。
(1)
movdl,string[1]
movdh,string[6]
(2)
movax,wordptrbuffer1
subax,wordptrbuffer2
;
先减低16位
movdx,wordptrbuffer1+2
sbbdx,wordptrbuffer2+2
后减高16位,需减低16位的借位
(3)
testdx,0f000h
jznext
movax,-1
jmpdone
next:
movax,0
done:
…
(4)
movcx,4
again:
shrdx,1;
右移一位,移出的低位进入CF标志
rcrax,1;
将CF移进AX高位,同时实现AX右移
loopagain;
循环4次,实现4位右移
(5)
movcx,100
movbx,0
subarray[bx],1
incbx
loopagain
〔习题2.21〕
AAD指令是用于除法指令之前,进行非压缩BCD码调整的。
实际上,处理器的调整过程是:
AL←AH×
10+AL,AH←0。
如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。
aadpproc
pushbx
shlah,1
movbl,ah
addbl,ah
addal,bl
movah,0
popbx
ret
aadpendp
〔习题2.23〕
DAA指令的调整操作是:
①如果AL的低4位是A~F,或者AF标志为1,则AL←AL+6,且使AF=1;
②如果AL的高4位是A~F,或者CF标志为1,则AL←AL+60H,且使CF=1;
阅读如下子程序,说明其为什么能够实现AL低4位表示的一位16进制数转换成对应的ASCII码。
并且将该程序加上在屏幕上显示的功能,编写成通用的子程序。
htoascproc
andal,0fh
addal,90h
daa
adcal,40h
htoascendp
pushdx
aadal,90h
12
movdl,al
movah,2
int21h;
显示个位数
popdx
〔习题2.24〕
乘法的非压缩BCD码调整指令AAM执行的操作是:
AH←AL÷
10的商,AL←AL÷
10的余数。
利用AAM可以实现将AL中的100内数据转换为ASCII码,程序如下:
xorah,ah
aam
addax,3030h
利用这段程序,编写一个显示AL中数值(0~99)的子程序。
dispascproc
pushax
movdl,ah
显示十位数
popax
dispascendp
〔习题2.25〕
编写一个程序段:
先提示输入数字“InputNumber:
0~9”,然后在下一行显示输入的数字,结束;
如果不是键入了0~9数字,就提示错误“Error!
”,继续等待输入数字。
;
数据段
inmsgdb‘InputNumber:
0~9’,0dh,0ah,’$’
ermsgdb‘Error!
’,’$’
代码段
movdx,offsetinmsg
movah,9
显示输入数字0~9
movah,1
接受一个字符
cmpal,’0’;
判断是否输入的是数字0~9
jberdisp
cmpal,’9’
jaerdisp
显示输入的数字
jmpdone;
结束
erdisp:
movdx,offsetermsg
显示输入错误
jmpagain;
继续输入
第三章
461213222631
〔习题3.4〕
如何规定一个程序执行的开始位置,主程序执行结束应该如何返回DOS,源程序在何处停止汇编过程?
使用start标识符
实例:
程序框架
start:
movax,@data
movds,ax
……
movax,4c00h
int21h
endstart
〔习题3.6〕
给出你采用一个源程序格式书写的例题3.1源程序。
.modelsmall
.stack
.data
stringdb’Hello,Assembly!
’,0dh,0ah,’$’
.code
movax,@data
movds,ax
movdx,offsetstring
int21hmovax,4c00h
int21h
endstart
〔习题3.10〕
画图说明下列语句分配的存储空间及初始化的数据值:
⑴byte_vardb’ABC’,10,10h,’EF’,3dup(-1,?
3dup(4))
⑵word_vardw10h,-5,3dup(?
)
见微机原理wjyl习题题解1caogao.ppt-P24
〔习题3.12〕
希望控制变量或程序代码在段中的偏移地址,应该使用哪个伪指令?
〔解答〕
ORG
〔习题3.13〕
名字和标号有什么属性?
名字和标号对应储存单元的标号和地址,含有段地址和偏移地址。
类型:
DBDWDD/NEARFAR
〔习题3.16〕
编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。
movah,1;
只允许输入小写字母
subal,20h;
转换为大写字母
显示
〔习题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显示代码。
.stack256
LEDtableDB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h
DB80h,90h,88h,83h,0c6h,0clh、86h,8eh
lednumDB?
.startup
movbx,offsetLEDtable
moval,lednum
al中存有对应的LED显示代码。
.exit0
end
〔习题3.18〕
编制一个程序,把变量bufX和bufY中较大者存入bufZ;
若两者相等,则把其中之一存入bufZ中。
假设变量存放的是8位有符号数。
movax,bufX
cmpax,bufY
jaedone
movax,bufY
movbufZ,ax
〔习题3.19〕
设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:
如果变量值大于等于0,保存0;
如果X小于0,保存-1。
编写该程序。
bufXdw-7
signXdb?
cmpbufX,0;
testbufX,80h
jlnext;
jnznext
movsignX,0
movsignX,-1
.exit0
end
〔习题3.20〕
bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序:
⑴如果这3个数都不相等,则显示0;
⑵如果这3个数中有两个数相等,则显示1;
⑶如果这3个数都相等,则显示2。
movdl,’2’
movax,bufX
cmpax,bufY
jenext1
decdl
next1:
cmpax,bufZ
jenext2
next2:
movah,2
〔习题3.21〕
例题3.7中,如果要实现所有为1的位都顺序执行相应的处理程序段(而不是例题中仅执行最低为1位的处理程序段),请写出修改后的代码段?
moval,number
movbx,0;
BX←记录为1的位数
restart:
cmpal,0;
AL=0结束
jzdone
shral,1;
最低位右移进入CF
jc