第5章作业答案.docx
《第5章作业答案.docx》由会员分享,可在线阅读,更多相关《第5章作业答案.docx(10页珍藏版)》请在冰豆网上搜索。
第5章作业答案
习题5
1.试说明以下指令中各操作数的寻址方式,如果是存储器寻址,请给出其EA计算公式,并说明所使用的段寄存器。
(1)MOVAL,08H
源操作数:
立即数寻址
目的操作数:
寄存器寻址
(2)MOV[0120H],BL
源操作数:
寄存器寻址
目的操作数:
直接寻址,EA=0120H,使用DS段寄存器
(3)ADD[BX],AL
源操作数:
寄存器寻址
目的操作数:
寄存器间接寻址,EA=(BX),使用DS段寄存器
(4)PUSH[SI]0200H
源操作数:
变址寻址,EA=(SI)+0200H,使用DS段寄存器
目的操作数:
隐含寻址(指令中未直接体现)
(5)SUBAX,[BP]
源操作数:
寄存器间接寻址,EA=(BP),使用SS段寄存器
目的操作数:
寄存器寻址
(6)ANDVAR1+4,DL
源操作数:
寄存器寻址
目的操作数:
直接寻址,EA=VAR1+4,使用DS段寄存器
(7)PUSHF
源操作数、目的操作数均为隐含寻址
(8)MOVES:
[BX]0100H,AL
源操作数:
寄存器寻址
目的操作数:
基址寻址,EA=(BX)+0100H,使用ES段寄存器
(9)ADCBYTEPTR[BP][SI]0210H,45H
源操作数:
立即数寻址
目的操作数:
基址变址寻址,EA=(BP)+(SI)+0210H,使用SS段寄存器
(10)ORARRY[BX][DI],CL
源操作数:
寄存器寻址
目的操作数:
基址变址寻址,EA=(BX)+(DI)+ARRY,使用DS段寄存器
2.试分析下列汇编指令是否存在语法错误,如果有语法错误存在,请说明是怎样的错误。
(1)PUSH8243H
错误,单操作数指令不能使用立即数
(2)POPAL
错误,进栈、出栈指令的操作数应为16位
(3)MOVAL,6543H
错误,源、目的操作数类型不匹配
(4)ADD[0100H],64H
错误,目的操作数应使用PTR运算符指出类型,否则具有二义性
正确的写法:
ADDBYTEPTR[0100H],64H,(或使用WORDPTR)
(5)ADCVAR1,VAR2
错误,8086指令系统的双操作数指令中,必须有一个是寄存器,不能两个操作数同为内存单元
(6)MOVDS,ES
错误,段寄存器间不能使用MOV指令直接传递数据,必须通过通用寄存器作为中转
(7)MOVDS,0620H
错误,使用MOV指令向段寄存器传递数据时,不能使用立即数
(8)LEABX,AX
错误,LEA指令的源操作数必须为内存单元
(9)DECAL,AH
错误,DEC指令为单操作数指令
(10)SHRBL,3
错误,当移位次数大于1时,在移位指令中特定使用CL寄存器给出移位次数
正确的写法:
MOVCL,3
SHRBL,CL
3.试说明分别执行下列各组指令后,CF、OF、AF、ZF、SF、PF这六个状态标志分别是怎样的取值。
(1)MOVAL,08H
ADDAL,0F9H
CF=1;OF=0;AF=1;ZF=0;SF=0;PF=0
(2)MOVAL,0E1H
ADDAL,0F4H
CF=1;OF=0;AF=0;ZF=0;SF=1;PF=0
(3)MOVAL,01H
SUBAL,02H
CF=1;OF=0;AF=1;ZF=0;SF=1;PF=1
(4)MOVAL,02H
INCAL
CF维持MOV指令前的取值(INC指令不影响CF);OF=0;AF=0;ZF=0;SF=0;PF=1
(5)MOVAL,01H
ANDAL,02H
CF=OF=0;AF不确定;ZF=1;SF=0;PF=1
4.按要求分析下面程序片段的执行结果。
MOVAL,0C2H
MOVAH,0E4H
ADDAL,AH
执行该程序片段后,(AL)=?
,(AH)=?
,如果将ADD指令的两个操作数解释为无符号数,运算有没有溢出?
为什么?
如果将ADD指令的两个操作数解释为补码,运算有没有溢出?
为什么?
答:
执行该程序片段后,(AL)=0A6H,(AH)=0E4H,如果操作数解释为无符号数,运算溢出,因为加法运算后最高位产生了进位,CF=1,需使用9个二进制位才能表达完整运算结果;如果将操作数解释为补码,则运算没有溢出,因为从操作数与运算结果的符号位观察,两个操作数均为负数补码,相加后所得结果仍然为负数补码,符号位正确,表明加法结果未超出补码表示范围(这里是8位补码的表示范围),加法运算后OF=0。
5.按要求分析下面程序片段的执行结果。
MOVAL,98H
MOVBL,42H
XCHGAL,BL
SUBAL,BL
执行该程序片段后,(AL)=?
,(BL)=?
,如果将SUB指令的两个操作数解释为无符号数,运算有没有溢出?
为什么?
如果将SUB指令的两个操作数解释为补码,运算有没有溢出?
为什么?
如果将SUB指令的两个操作数解释为补码,其减法运算对应的十进制真值表达式应如何书写?
答:
执行该程序片段后,(AL)=0AAH,(BL)=98H,如果将操作数解释为无符号数,则运算溢出,从操作数判断,此运算属于被减数小于减数的情况,这在无符号数运算中是不允许的(如果当前操作数仅为长数据的一部分,则另当别论),减法运算后最高位必然产生借位,CF=1;如果操作数解释为补码,运算也溢出,从操作数判断,此运算属于“正-负”类型,等价于“正+正”类型,正确的运算结果应为正数或零的补码,而运算结果的符号位却为“负”,表明运算结果超出补码表示范围(这里为8位补码表示范围),减法运算后OF=1。
SUB指令所使用的被减数补码为42H=01000010B,减数补码为98H=10011000B,由于被减数为正数补码,它等于真值本身,而减数补码为负数补码,将其取反加1后,添上负号,得到其二进制真值为-01101000B。
将被减数、减数的二进制真值转换为十进制后,得到真值运算表达式:
66-(-104)=170,很明显运算结果超出8位补码的最大值+127。
6.按要求分析下面程序片段的执行结果。
STC
MOVAL,03H
ANDAL,02H
ADCAL,00H
执行该程序片段后,(AL)=?
答:
(AL)=02H,此题应注意AND指令会强置CF为0。
7.假设(DS)=1000H,(SS)=2000H,字内存单元(10200H)=0870H,(10202H)=2000H,(20870H)=0203H,(20872H)=0405H,括号内所给为内存单元物理地址,括号表示该地址所指示单元中保存的数据,分别执行下列程序片段后,按要求分析各程序片段的执行结果。
(1)MOVAL,[0200H]
执行该程序片段后,(AL)=?
答:
源操作数地址为(DS)*16+0200H=10000H+0200H=10200H,因此执行该程序片段后,(AL)=70H(逆序存放,低地址对应低数据位)
(2)MOVBP,0871H
MOVBL,[BP]
执行该程序片段后,(BL)=?
答:
第二条指令的源操作数地址为(SS)*16+(BP)=20871H,执行该程序片段后,(BL)=02H(逆序存放,高地址对应高数据位)
(3)LEASI,[0200H]
执行该程序片段后,(SI)=?
答:
LEA指令将源操作数的EA传送到目的操作数保存,(SI)=0200H
(4)MOVSI,[0200H]
LEASI,[SI]
执行该程序片段后,(SI)=?
答:
MOV指令中源操作数地址为(DS)*16+0200H=10200H,执行后(SI)=0870H,第二条指令源操作数的EA直接为(SI)=0870H,执行后仍有(SI)=0870H。
(5)LDSBX,[0200H]
MOVAL,[BX]0002H
执行该程序片段后,(AL)=?
答:
LDS指令中源操作数地址为(DS)*16+0200H=10200H,将(10200H)字单元内容传递到BX保存,将(10202H)字单元内容传递到DS保存,执行后(BX)=0870H,(DS)=2000H;MOV指令中源操作数地址为(DS)*16+(BX)+0002H=20872H,执行后(AL)=05H。
8.按要求分析下面程序片段的执行结果。
MOVAX,651CH
SHLAL,1
RCLAH,1
执行该程序片段后,(AX)=?
,该程序片段的功能是什么?
如果将(AX)解释为无符号数,那么运算是否溢出?
为什么?
如果将(AX)解释为补码,运算是否溢出?
为什么?
SHL与SAL指令间有什么关联和区别?
答:
执行该程序片段后,(AX)=0CA38H,该程序片段的功能为将AX中的16位编码左移1位,等价于乘以2(也可理解为自加一次)。
如果将(AX)解释为无符号数,那么运算没有溢出,因为最后一次移位操作后,最高移出位为0,即CF=0(自加完成后最高位无进位);如果将(AX)解释为补码,运算溢出,因为移位前后(AX)的最高位发生了变化(由0变为1),符号位在运算中丢失,可以理解为自加运算结果超出了16位补码表示范围。
SHL与SAL指令本质上对应同一条机器指令,在功能上并无区别,因为无符号数与补码的左移操作是完全相同的,但为了指令系统设计的规整性,在汇编指令中将它们区分开,SHL针对无符号数左移,SAL针对补码左移。
9.按要求分析下面程序片段的执行结果。
MOVAL,35H
ANDAL,0FH
执行该程序片段后,(AL)=?
CF、OF、AF、ZF、SF、PF标志取值是什么?
该程序片段的功能是什么?
答:
执行该程序片段后,(AL)=05H,CF=0;OF=0;AF不确定;ZF=0;SF=0;PF=1;该程序片段的功能是将(AL)中的低4位数据分离出来,屏蔽高4位。
10.假设一个48位的补码按照由低位到高位的顺序保存在字类型的内存单元VA1、VA1+2、VA1+4中,试按下列要求完成程序片段设计。
(红字部分请在教材中纠正)
(1)设计程序片段,实现将该48位补码除以4的功能,运算结果仍然保存在原内存单元中。
解:
SARVA1+4,1
RCRVA1+2,1
RCRVA1,1
SARVA1+4,1
RCRVA1+2,1
RCRVA1,1
(2)设计程序片段,求该48位补码的相反数补码,运算结果仍然保存在原内存单元中。
解:
NOTVA1
NOTVA1+2
NOTVA1+4
ADDVA1,1
ADCVA1+2,0
ADCVA1+4,0
11.试说明如何使用CMP指令提供的标志位判断两个补码操作数大小关系的原理。
答:
请参考本章关于比较指令(CMP)中的详细介绍加以说明。
12.假设(SP)=0060H,执行两次PUSH指令后,(SP)=?
假设(SP)=0038H,执行三次POP指令后,(SP)=?
答:
执行两次PUSH指令后,(SP)=005CH;执行三次POP指令后(SP)=0038H+0002H*3=0038H+0006H=003EH
13.按要求分析下面程序片段的执行结果。
MOVAL,01H
NEGAL
INCAL
执行该程序片段后(AL)=?
,CF、OF标志的状态是什么?
答:
执行该程序片段后(AL)=0,CF=1,注意,这是受NEG指令影响的结果,INC指令不影响CF标志;OF=0,加法运算并无溢出,因为0FFH为-1的补码,加1后等于0是正确的。
14.按要求分析下面程序片段的执行结果。
MOVBL,51H
ANDBL,0FEH
XORBL,50H
DECBL
执行该程序片段后(BL)=?
,CF、OF标志的状态是什么?
答:
执行该程序片段后(BL)=0FFH,CF=0,注意,这是受XOR指令的影响,XOR指令将CF强置为0,而DEC指令不影响CF;OF=0,此标志是受DEC指令影响的结果。
此题中应注意,逻辑运算指令会将CF、OF强置为0,而DEC指令不影响CF标志。
15.按照各小题的要求分别设计程序片段。
(因存在多种设计方式,程序设计题目的答案仅作为参考)
(1)将AL寄存器的高4位与低4位交换
MOVCL,4
ROLAL,CL
(2)将TF标志位置1
PUSHF
POPAX
ORAX,0100H
PUSHAX
POPF
(3)将AL寄存器的第7位清0,但不影响其它数据位
ANDAL,7FH
(4)分离AL寄存器的最低两位,其它数据位清0。
ANDAL,03H
(5)分离AL寄存器的高4位与低4位,并分别保存在BL、BH的低4位
PUSHAX
ANDAL,0FH
MOVBL,AL
POPAX
ANDAL,0F0H
MOVCL,4
ROLAL,CL
MOVBH,AL