计算机硬件与接口习题答案周明德Word格式.docx
《计算机硬件与接口习题答案周明德Word格式.docx》由会员分享,可在线阅读,更多相关《计算机硬件与接口习题答案周明德Word格式.docx(144页珍藏版)》请在冰豆网上搜索。
LDH,n
LDA,H
LDH,A
LDA,(n)
LD(n),A
LDA,(H)
LD(H),A
3En
26n
7C
67
3An
32n
7E
77
n→A
n→H
H→A
A→H
以n为地址,把该单元的内容送A,即(n)→A
把A的内容送至以n为地址的单元,A→(n)
以H的内容为地址,把该单元的内容送A,(H)→A
把A的内容送至以H的内容为地址的单元,A→(H)
加法
ADDA,n
ADDA,H
ADDA,(H)
C6n
84
86
A+n→A
A+H→A
A与以H为地址的单元的内容相加,A+(H)→A
减法
SUBn
SUBH
SUB(H)
D6n
94
96
A–n→A
A–H→A
A-(H)→A
逻辑与
ANDA
ANDH
A7
A4
A∧A→A
A∧H→A
逻辑或
ORA
ORH
B7
B4
A∨A→A
A∨H→A
异或
XORA
XORH
AF
AC
A⊕A→A
A⊕H→A
增量
INCA
INCH
3C
24
A+1→A
H+1→H
减量
DECA
DECH
3D
25
A-1→A
H-1→H
无条件
转移
JPn
JPZ,n
JPNZ,n
JPC,n
JPNC,n
JPM,n
JPP,n
C3n
CAn
C2n
DAn
D2n
FAn
F2n
n→PC
Z=1,n→PC
Z=0,n→PC
Cy=1,n→PC
Cy=0,n→PC
S=1,n→PC
S=0,n→PC
停机指令
HALT
76
停机
在给定的模型机中,若有以下程序,分析在程序运行后累加器A中的值为多大。
若此程序放在以10H为起始地址的存储区内,画出此程序在内存中的存储图。
LDA,20H
ADDA,15H
LDA,30H
ADDA,36H
ADDA,1FH
HALT
[解]程序在存储器中存放示意图如图1-1所示:
地址
内容
指令
10H
3E
LDA,20H
11H
20
12H
C6
ADDA,15H
13H
15
14H
LDA,30H
15H
30
16H
ADDA,36H
17H
36
18H
ADDA,1FH
19H
1F
1AH
图1-1题1.11中程序在存储器中存放示意图。
这段程序运行完后累加器A中的值为A=30H+36H+1FH=85H。
1.12要求同题1.6,程序如下:
LDA,50H
SUB30H
LDA,10H
ADDA,36H
SUB1FH
分析程序运行后累加器中的值是多少,并且画出该程序在内存中的存储图。
[解]程序在存储器中存放示意图如图1-2所示:
LDA,50H
50
D6
ADDA,30H
LDA,10H
10
图1-2题1.12中的程序在存储器中的存放示意图
这段程序运行完后累加器A中的值为A=10H+36H-1FH=27H。
1.13在给定的模型机中,写出用累加的办法实现15×
15的程序。
[解]
LDA,0
LDH,15
LOOP:
ADDA,15
DECH
JPNZ,LOOP
1.14在给定的模型机中,写出用累加的办法实现20×
20的程序。
[解]模型机的寄存器是8位,其最大能表示的值为256。
而20×
20=400超出了模型机中能表示的最大值。
故此题在模型机中无法做。
需要用8086中的寄存器对才能实现。
1.15在模型机中,用重复相减的办法实现除法的程序如下:
LDA,(M2);
M2为放除数的存储单元
LDH,A
XORA
LOOP:
LD(M3),A;
M3为放商的存储单元
LDA,(M1);
M1为放被除数(或余数)的存储单元
SUBH
JPC,DONE
LD(M1),A
LDA,(M3)
INCA
JPLOOP
DONE:
MALT
若此程序放在以20H开始的存储区,画出它的存储图。
[解]程序在存储器中的存储图如图1-3所示。
20H
3A
LDA,(M2)
21H
M2
22H
LDH,A
23H
XORA
24H
32
LD(M3),A
25H
M3
26H
LDA,(M1)
27H
M1
28H
SUBH
29H
DA
JPC,DONE
2AH
2BH
LD(M1),A
2CH
2DH
LDA,(M3)
2EH
2FH
INCA
30H
C3
JPLOOP
31H
32H
图1-3题1.15中的程序在存储器中存放的示意图
1.16在模型机中,把二进制数转换为BCD码的程序流程图如图1-4所示。
图1-4题1.16程序流程图
编写出该程序。
LDH,0;
计数值H清零
LDA,(Binary);
把待转换的二进制数→A
S1:
SUBA,64H;
待转换的二进制数-100
JPM,S2;
结果﹤0,转S2
INCH;
计数值加1
JPS1
S2:
ADDA,64H;
恢复剩余的二进制数
LD(Binary),A;
保存剩余的二进制数
LD(BCD3),H;
保存百位BCD码
LDH,0;
LDA,(Binary);
剩余的二进制数→A
S3:
SUBA,0AH;
剩余的二进制数-10
JPM,S4;
结果﹤0,转S4
JPS3
S4:
ADDA,0AH;
LD(BCD1),A;
保存个位BCD码
LD(BCD2),H;
保存十位BCD码
HALT
第2章
2.18086的基本程序执行寄存器是由哪些寄存器组成?
[解]基本程序执行寄存器由以下寄存器组成∶
(1)通用寄存器。
这八个寄存器能用于存放操作数和指针。
(2)段寄存器。
这些寄存器最多能保持四个段选择子。
(3)FLAGS(程序状态和控制)寄存器。
FLAGS寄存器报告正在抵行的程序的状态并允许有限地(应用程序级)控制处理器。
(4)IP(指令指针)寄存器。
IP寄存器包合下一条要挑行的指令的16-位指针。
2.28086的存储器是如何组织的?
地址如何形成?
[解]8086有20条地址引线,它的直接寻址能力为2**20=1M字节。
所以,在一个8086组成的系统中,可以有多达1M字节的存储器。
这1M字节逻辑上可以组织成一个线性矩阵。
地址从00000H到FFFFFH。
但是,在8086内部的AIU能进行16位运算,有关地址的寄存器如SP、IP,以及BP、SI、DI等也都是16位的,因而8086对地址的运算也只能是16位。
这就是说,对于8086来说,各种寻址方式,寻找操作数的范围最多只能是64K字节。
所以,整个1M字节存储器以64K为范围分为若干段。
在寻址一个具体物理单元时,必须要由一个基地址再加上由各种寻址方式确定的的16位偏移量来形成实际的20位物理地址。
段基地址就是由8088中的段寄存器,中的16位数自动左移4位,然后与16位偏移量相加,形成20位物理地址。
2.3通用寄存器起什么作用?
[解]通用寄存器主要用于∶
(1)逻辑和算术操作的操作数
(2)用于地址计算的操作数
(3)内存指针
2.4指令地址如何形成?
[解]由段寄存器CS确定的段基地址与由指令指针确定的偏移量相加形成指令地址。
2.5如何形成指令中的各种条件码?
[解]指令中的条件码,即标志寄存器中的状态标志。
它们主要由算术和逻辑运算指令设置或清除。
指令系统中也有设置或清除进位标志的指令。
2.68086的总线接口部件有哪些功能?
请逐一说明。
[解]总线接口单元(BIU)负责与存储器接口;
执行单元(EU)执行各种操作。
BIU主要由段寄存器、指令指针、加法器(形成20位地址)、预取的指令流队列等组成。
2.78086的总线接口部件由哪几部分组成?
[解]8086中的总线接口单元(BIU)负责CPU与存储器之间的信息传送。
具体地说,BIU既负责从内存的指定部分取出指令,送至指令队列中排队(8086的指令队列有6个字节,而8088的指令队列只有4个字节);
也负责传送执行指令时所需的操作数。
执行单元(EU)负责执行指令规定的操作。
2.8段寄存器CS=1200H,指令指针寄存器IP=FF00H,此时,指令的物理地址为多少?
[解]指令的物理地址=12000H+FF00H=21F00H
2.98086的执行部件有什么功能?
由哪几部分组成?
[解]8086的执行部件负责指令的执行。
它主要由算术逻辑单元和标志寄存器及通用寄存器等部分组成。
2.10状态标志和控制标志有何不同?
程序中是怎样利用这两类标志的?
8086的状态标志和控制标志分别有哪些?
[解]状态标志反映算术和逻辑运算的结果,主要用作于各种条件。
控制标态实现一些控制作用。
EFLAGS寄存器有六个状态标志,它们是∶
(1)进位标志C(CarryFlag)
当结果的最高位(字节操作时的D7或字操作时的Dl5、双字操作的D31)产生一个进位或借位,则C=1,否则为0。
这个标志主要用于多字节数的加、减法运算。
移位和循环指令也能够把存储器或寄存器中的最高位(左移时)或最低位(右移时)放人标志C中。
(2)辅助进位标志A(AuxitiaryCarryFlag)
在字节操作时,则由低半字节(一个字节的低4位)向高半字节有进位或借位,则A=1,否则为0。
这个标志用于十进制算术运算指令中。
(3)溢出标志O(OverflowFlag)
在算术运算中,带符号数的运算结果超出了8位、16位或32位带符号数能表达的范围,即在字节运算时>十127或<一128,在字运算时>+32767或<一32768,在双字运算时>
+2**31-1或<
-2**31此标志置位,否则复位。
一个任选的溢出中断指令,在溢出情况下能产生中断。
(4)符号标志S.(SignFlag)
它的值与运算结果的最高位相同。
即结果的最高位(字操作时为D15)为1,则S=1;
否则,S=0。
由于在IA-32结构微处理器中,符号数是用补码表示的,所以S表示了结果的符号,0=正,1=负。
(5)奇偶标志P(ParityFlag)
若操作结果中“1”的个数为偶数,则P=1,否则P=0。
这个标志可用于检查在数据传送过程中是否发生错误。
(6)零标志Z(ZerofLag)
若运算的结果为0,则Z=1,否则Z=0
一个控制标志,即
方向标志D(DirectionFlag)
若用指令置D=1,则引起串操作指令为自动减量指令,也就是从高地址到低地址或是“从右到左”来处理串;
若使D=0,则串操作指令就为自动增量指令。
STD和CLD指令分别地设置和清除DF标志。
第3章
3.1分别指出下列指令中的源操作数和目的操作数的寻址方式。
(1)MOVSI,300
(2)MOVCX,DATA[DI]
(3)ADDAX,[BX][SI]
(4)ANDAX,CX
(5)MOV[BP],AX
(6)PUSHF
⑴源操作数为立即寻址,目的操作数为寄存器寻址。
⑵源操作数为变址寄存器加位移量寻址,目的操作数为寄存器寻址。
⑶源操作数为基址加变址寻址,目的操作数为寄存器寻址。
⑷源操作数和目的操作数都为寄存器寻址。
⑸源操作数为寄存器寻址,目的操作数为寄存器间接寻址。
(6)为堆栈操作。
3.2试述指令MOVAX,2000H和MOVAX,DS:
[2000H]的区别。
[解]前一条指令是立即寻址,即把立即数2000H传送至寄存器AX。
后一条指令是直接寻址,是把数据(DS)段中的地址为2000H单元的内容传送至寄存器AX。
3.3写出以下指令中内存操作数的所在地址。
(1)MOVAL,[BX十10]
(2)MOV[BP十10],AX
(3)INCBYTEPTR[SI十5]
(4)MOVDL,ES:
[BX十SI]
(5)MOVBX,[BP十DI十2]
[解]
(1)数据段中由BX+10单元
(2)堆栈段BP+10单元
(3)数据段SI+5字节单元
(4)附加段(ES段)BX+SI单元
(5)堆栈段BP+DI+2单元。
3.4判断下列指令书写是否正确:
(1)MOVAL,BX
(2)MOVAL,CL
(3)INC[BX]
(4)MOV5,AL
(5)MOV[BX],[SI]
(6)MOVBL,F5H
(7)MOVDX,2000H
(8)POPCS
(9)PUSHCS
(1)不正确,AL与BX数据宽度不同
(2)正确
(3)不明确是增量字节还是字
(4)不正确,立即数不能作为目的操作数
(5)不明确要传送的是字节还是字(应是[SI]而不表[S1])
(6)正确。
但十六进制数F5H应写为0F5H
(7)正确
(8)不正确,CS不能作为POP指令的操作数
(9)不正确,CS不能作为PUSH指令的操作数
3.5设堆栈指针SP的初值为1000H,AX=2000H,BX=3000H,试问:
(1)执行指令PUSHAX后SP=?
(2)再执行PUSHBX及POPAX后SP=?
、AX=?
、BX=?
⑴SP=0FFEH
⑵SP=0FFEH、AX=3000H、BX=3000H
3.6要想完成把[3000H]送[2000H]中,用指令:
MOV[2000H],[3000H]
是否正确?
如果不正确,应用什么方法?
[解]不正确。
正确的方法是:
MOVAL,[3000H]
MOV[2000H],AL
3.7假如想从200中减去AL中的内容,用SUB200,AL是否正确?
正确的方法是:
MOVBL,200
SUBBL,AL
3.8用两种方法写出从80H端口读入信息的指令。
再用两种方法写出从40H口输出100H的指令。
(1)INAL,80H
(2)
MOVDX,80H
INAL,DX
(3)MOVAL,100H
OUT40H,AL
(4)MOVAL,100H
MOVDX,40H
OUTDX,AL
3.9假如:
AL=20H,BL=10H,当执行CMPAL,BL后,问:
(1)AL,BL中内容是两个无符号数,比较结果如何?
影响哪几个标志位?
(2)AL、BL中内容是两个有符号数,结果又如何,影响哪几个标志位?
[解]⑴AL=20H,BL=10H,O=0,S=0,Z=0,A=0,P=0,C=0。
⑵因为两个都是符号正数,其结果同⑴。
3.10若要使AL×
10,有哪几种方法,编出各自的程序段。
(1)使用乘法指令:
MOVBL,10
MULBL
(2)使用移位指令:
SHLAL,1
MOVBL,AL
SHLAL,2
ADDAL,BL
(3)使用加法指令:
ADDAL,AL
3.118086汇编语言指令的寻址方式有哪几类?
用哪一种寻址方式的指令执行速度最快?
[解]寻址方式分为:
立即数寻址方式、寄存器操作数寻址方式和存储器操作数寻址方式。
其中寄存器操作数寻址方式的指令执行速度最快。
3.12直接寻址方式中,一般只指出操作数的偏移地址,那么,段地址如何确定?
如果要用某个段寄存器指出段地址,指令中应如何表示?
[解]默认的数据访问,操作数在DS段;
堆栈操作在SS段;
串操作源操作数(SI)在DS段,目的操作数(DI)在ES段;
用BP作指针在SS段。
如果要显式指定段地址,则在操作数中规定段寄存器。
例如:
MOVAX,ES:
(BX+10H)
3.13在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,那么,段地址如何确定?
[解]在寄存器间接寻址方式中,如果指令中没有具体指明段寄存器,段地址是隐含约定的,也就是隐含的选择段寄存器。
如操作类型为指令,则指定代码段寄存器DS,如操作类型为堆栈操作,则指定堆栈段寄存器SS,……,如表2中所示:
表2段寄存器的约定
操作类型
约定段寄存器
可修改的段寄存器
逻辑地址
CS
无
IP
堆栈操作
SS
SP
源串地址
DS
CS、ES、SS
SI
目的串地址
ES
DI
BP用作基止寄存器
CS、DS、ES
有效地址
通用数据读写
当需要超越约定时,通常用段替代前缀加冒号“:
”来表示段超越,它允许程序设计者偏离任何约定的段。
MOVES:
[EBX],EAX
这时数据将从寄存器EAX传送至附加段中由EBX寻址的存储单元,而不是传送到数据段中。
3.14用寄存器间接寻址方式时,BX、BP、SI、DI分别针对什么情况来使用?
这四个寄存器组合间接寻址时,地址是怎样计算的?
举例进行说明。
[解]在寄存器间接寻址情况下,BX和BP作为间址寄存器使用,而SI、DI作为变址寄存器使用。
除BP间址默认的段为堆栈段,其地的都默认为数据段。
它们都可以单独使用,或加上偏移量或组合使用。
如:
[BX+n]
[BP+n]
[SI+n]
[DI+n]
[BX+SI+n]
[BX+DI+n]
[BP+SI+n]
[BP+DI+n]
3.15设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作:
MOVBYTEPTR[BP],200
MOVWORDPTR[BX],2000
[解]前一条指令是把立即数(应是字节)200,传送至堆栈段(BP的默认段)偏移量由BP规定的字节单元(地址为:
52000H+6200H=58200H)。
第二条指令是把立即数2000,传送至数据段(BX的默认段)偏移量由BX规定的