2.13选取字长n为8位,已知数的原码表示如下,求出其补码。
(1)[X]原=01010101
(2)[Y]原=
(3)[Z]原=(4)[W]原=
答:
正数的补码与原码相同,负数的补码是原码的符号位不变,其余位按位取反后末位加1。
(1)[X]补=01010101B
(2)[Y]补=B
(3)[Z]补=B(4)[W]补=B
2.15阐述微型计算机在算术运算时,所产生的“进位”与“溢出”二者之间的区别。
答:
溢出是指带符号数的补码运算溢出,溢出及其判断方法:
OF=D7C⊕D6C。
进位是指运算结果的最高位向更高位的进位D7C。
进位和溢出是两个不同性质的概念,不能混淆,两者没有必然的联系。
2.16选字长n为8位,用补码列出竖式计算下列各式,并且回答是否有溢出。
若有溢出,则是正溢出还是负溢出?
(1)01111001+01110000
(2)—01111001—01110001
(3)01111100—01111111(4)—01010001+01110001
答:
(1)正溢出
(2)负溢出(3)无溢出(4)无溢出
第3章8086/8088微处理器及其系统
3.28086CPU有多少根数据线和地址线?
它能寻址多少内存地址单元和I/O端口?
8088CPU有多少根数据线和地址线?
为什么要设计8088CPU?
答:
8086CPU有16根数据线和20根地址线,可以寻址1MB的内存地址单元和64KB的I/O端口。
8088CPU有16根数据线和20根地址线,但是8088的BIU通过总线控制电路与外部交换数据的总线宽度是8位,总线控制电路与专用寄存器之间的数据总线宽度也是8位。
设计8088CPU的目的是为了与Intel原有的8位外围接口芯片直接兼容。
3.6逻辑地址和物理地址有何区别?
为什么8086微处理器要引入“段加偏移”的技术思想?
段加偏移的基本含义又是什么?
试举例说明。
答:
逻辑地址是指未定位之前在程序和指令中表示的一种地址,它包括两部分:
段地址和偏移地址;物理地址又称为实际地址,它是指CPU对存储器进行访问时实际寻址所使用的地址。
对8086CPU而言,逻辑地址为16位,物理地址为20位,一个物理地址可对应多个逻辑地址。
“段加偏移”寻址机制允许重定位,极大地保证了系统兼容性。
CPU在处理数据时寻址的是20位的物理地址,限于8086/8088微处理器内部寄存器都是16位的,所以微处理器的地址加法器会自动地把16位段寄存器中的16位段地址左移4位,形成20位的段基址(段起始地址),然后同16位的偏移地址相加,才能形成20位的物理地址。
这种方法称为段加偏移。
例如,若段地址为1123H,偏移地址为15H,将1123H左移4位,即11230H,则物理地址为PA=11230H+15H=11245H。
3.14IP寄存器的用途是什么?
它提供的是什么信息?
答:
IP是指令指针寄存器,在程序正常运行过程中,它用来存放BIU要取的下一条指令的偏移地址。
IP在程序运行中能自动进行加1修正,使之总是指向要执行的下一条指令(字节)。
IP与代码段寄存器CS组合构成指令的物理地址,以实现对代码段指令的自动跟踪。
有些指令(调用子程序、中断等)能改变IP值或把IP值压入堆栈暂时保存,或者由堆栈弹出到IP以恢复指令指针的原值。
3.20微处理器在什么情况下才执行总线周期?
一个基本的总线周期由几个状态组成?
在什么情况下需要插入等待状态?
答:
当微处理器需要对存储器或I/O端口进行取指令或传送数据时,都需要它的总线接口单元BIU执行一个总线周期。
一个基本的总线周期由4个状态组成:
T1~T4。
当存储器或外设的速度较慢,不能及时地跟上CPU的速度时,存储器或外设就会通过“READY”信号线在T3状态启动之前向CPU发一“数据未准备好”信号,这样,CPU会在T3之后自动插入一个或多个等待状态TW,以等待存储器或外设准备好要传送的数据。
3.30什么是寻址方式?
8086/8088微处理器有哪几种主要的寻址方式?
答:
寻址方式是指CPU根据指令功能所规定的操作码如何自动寻找相应的操作数或操作数所在地址的方式。
8086/8088的操作数可位于寄存器、存储器或I/O端口中,CPU对其进行操作时就会涉及操作数的寻址方式。
8086/8088微处理器的主要寻址方式有:
固定寻址、立即数寻址、寄存器寻址、存储器寻址等,其中存储器寻址又可分为:
直接寻址和间接寻址,间接寻址又可分为:
(相对)基址寻址、(相对)变址寻址、(相对)基址加变址寻址。
3.31试写出寻址存储器操作数时计算有效地址EA的通式。
3.32指出8086/8088下列指令源操作数的寻址方式。
(1)MOVAX,1200H;立即数寻址
(2)MOVBX,[1200H];直接寻址
(3)MOVBX,[SI];变址寻址
(4)MOVBX,[SI+1200H];相对变址寻址
(5)MOV[BX+SI],AL;寄存器寻址
(6)ADDAX,[BX+DI+20H];相对基址加变址寻址
(7)MULBL;寄存器寻址
(8)JMPBX;基址寻址(寄存器间接寻址)
(9)INAL,DX;间接端口寻址
(10)INCWORDPTR[BP+50H];相对基址寻址
3.33指出8086/8088下列指令中存储器操作数物理地址的计算表达式。
(1)MOVAL,[DI];PA=DS×10H+DI
(2)MOVAX,[BX+SI];PA=DS×10H+BX+SI
(3)MOVAL,8[BX+DI];PA=DS×10H+BX+DI+8
(4)ADDAL,ES:
[BX];PA=ES×10H+BX
(5)SUBAX,[2400H];PA=DS×10H+2400H
(6)ADCAX,[BX+DI+1200H];PA=DS×10H+BX+DI+1200H
(7)MOVCX,[BP+SI];PA=SS×10H+BP+SI
(8)INCBYTEPTR[DI];PA=DS×10H+DI
3.34指出8086/8088下列指令的错误何在?
(1)MOV[SI],IP
(2)MOVCS,AX
(3)MOVBL,SI+2(4)MOV60H,AL
(5)PUSH2400H(6)INC[BX]
(7)MUL-60H(8)ADD[2400H],2AH
(9)MOV[BX],[DI](10)MOVSI,AL
(1)指令指针IP不能传送。
(2)CS段寄存器不能做操作数。
(3)传送类型不匹配,BL为8位,SI+2为16位。
(4)目的操作数不能为立即数。
(5)PUSH指令中操作数不能为立即数。
(6)应在指令前加伪指令BYTEPTR或WORDPTR表明是对字节进行加1操作还是对字进行加1操作。
(7)乘数不能为立即数。
(8)[2400H]前应加伪指令BYTEPTR或WORDPTR进行类型说明。
(9)两个操作数不能同为存储器操作数。
(10)类型不匹配,SI为16位寄存器,而AL为8位寄存器。
3.36阅读下列程序段,指出每条指令执行后有关寄存器的内容是多少?
MOVAX,0ABCH;AX←0ABCH
DECAX;AX←0ABBH
ANDAX,00FFH;AX←00BBH(高8位屏蔽)
MOVCL,4;CL←4
SALAL,1;AL←76H
MOVCL,AL;CL←76H
ADDCL,78H;CL←0EEH
PUSHAX;AX←0076H
POPBX;BX←0076H
3.37指出RET和IRET两条指令的区别,并说明各用在什么场合?
(1)RET和IRET是两条返回主程序的指令,但RET是与过程(子程序)调用指令CALL对应使用的过程返回指令,而IRET是与中断指令INTn对应使用的中断返回指令。
(2)RET指令应安排在子程序的出口,即子程序的最后一条指令处,它的功能是从堆栈顶部弹出由CALL指令压入的断点地址值IP或CS、IP,迫使CPU返回到调用程序的断点去继续执行。
(3)IRET指令总是安排在中断服务程序的出口处,由它控制从堆栈中弹出程序断点送回CS和IP中,弹出标志寄存器内容送回F中,迫使CPU返回到断点继续执行后续程序。
3.38说明MOVBX,DATA和MOVBX,OFFSTEDATA指令之间的区别。
答:
MOVBX,DATA是直接将DATA的值赋给BX寄存器;
MOVBX,OFFSTEDATA是将DATA在段内的偏移量赋给BX寄存器。
(注:
DATA为变量名,它指内存中的一个数据区的名字,它可以作为指令中的存储器操作数来使用。
变量仅对应于数据区中的第一个数据项,若需对数据区中其它数据项进行操作,必须用地址表达式指出哪个数据项是指令中的操作数。
)
3.39给定DS=1100H,BX=0200H,LIST=0250H,SI=0500H。
试确定下面各条指令寻址存储器的地址。
(1)MOVLIST[SI],DX;相对变址寻址
(2)MOVCL,LIST[BX+SI];相对基址加变址寻址
(3)MOVCH,[BX+SI];基址加变址寻址
(4)MOVDL,[BX+100H];相对基址寻址
答:
(1)PA=DS×10H+SI+LIST=11000H+0500H+0250H=11750H
(2)PA=DS×10H+BX+SI+LIST
=11000H+0200+0500H+0250H=11950H
(3)PA=DS×10H+BX+SI=11000H+0200H+0500H=11700H
(4)PA=DS×10H+BX+100H=11000H+0200H+100H=11300H
3.40假定PC机存储器低地址区有关单元的内容如下:
(20H)=3CH,(21H)=00H,(22H)=86H,(23H)=0EH且CS=2000H,IP=0010H,SS=1000H,SP=0100H,FLAGS=0240H,这时若执行INT8指令,试问:
(1)程序转向从何处执行(用物理地址回答)?
(2)栈顶6个存储单元的地址(用逻辑地址回答)及内容分别是什么?
答:
(1)CS=0E86H,IP=003CH
PA=CS×10H+IP=0E860H+003CH=0E89CH
(2)1000H:
00FAH10H(12H)
1000H:
00FBH00H
1000H:
00FCH00H
1000H:
00FDH20H
1000H:
00FEH40H
1000H:
00FFH02H
3.41设SP=2000H,AX=3000H,BX=5000H,执行下列片段程序后,问SP=?
AX=?
BX=?
PUSHAX;SP←SP-2=1FFEH,AX=3000H
PUSHBX;SP←SP-2=1FFCH,BX=5000H
POPAX;SP←SP+2=1FFEH,AX=5000H
答:
SP=1FFEH,AX=5000H,BX=5000H
3.43若AX=5555H,BX=FF00H,试问在下列程序段执行后,AX=?
BX=?
CF=?
ANDAX,BX;AX=5500,BX=FF00H
XORAX,AX;AX=0000H
NOTBX;BX=00FFH
答:
AX=0000H,BX=00FFH
由于AND、OR、XOR指令的运算结果使CF=0,NOT指令的运算结果不影响CF位,所以CF=0。
3.44若CS=E000H,说明代码段可寻址物理存储地址空间的范围。
答:
首地址为:
CS×10H+0000H=E0000H
末地址为:
CS×10H+FFFFH=EFFFFH
故代码段可寻址物理存储地址空间的范围为E0000H~EFFFFH,共64KB。
3.45若DS=3000H,BX=2000H,SI=0100H,ES=4000H,计算出下述各条指令中存储器操作数的物理地址。
(1)MOV[BX],AH
(2)ADDAL,[BX+SI+1000H]
(3)MOVAL,[BX+SI](4)SUBAL,ES:
[BX]
答:
(1)PA=DS×10H+BX=30000H+2000H=32000H
(2)PA=DS×10H+BX+SI+1000H
=30000H+2000H+0100H+1000H=33100H
(3)PA=DS×10H+BX+SI=30000H+2000H+0100H=32100H
(4)PA=ES×10H+BX=40000H+2000H=42000H
3.46试比较SUBAL,09H与CMPAL,09H这两条指令的异同,若AL=08H,分别执行上述两条指令后,SF=?
CF=?
OF=?
ZF=?
答:
SUBAL,09H;AL←AL-09H
结果返回AL寄存器,且根据结果置标志位。
CMPAL,09H;AL-09H
只根据结果置标志位,结果不返回AL寄存器。
执行SUBAL,09H指令后,AL=FFH,SF=1,CF=1,OF=0,ZF=0;
执行CMPAL,09H指令后,AL=08H,SF=1,CF=1,OF=0,ZF=0。
3.47选用最少的指令,实现下述要求的功能。
(1)AH的高4位清零;
(2)AL的高4位取反;
(3)AL的高4位移到低4位,高4位清零。
(4)AH的低4位移到高4位,低4位清零。
答:
(1)ANDAH,0FH
(2)XORAL,0F0H
(3)MO