习题51.试说明以下指令中各操作数的寻址方式,如果是存储器寻址,请给出其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,3SHRBL,CL3.试说明分别执行下列各组指令后,CF、OF、AF、ZF、SF、PF这六个状态标志分别是怎样的取值。(1)MOVAL,08HADDAL,0F9HCF=1;OF=0;AF=1;ZF=0;SF=0;PF=0(2)MOVAL,0E1HADDAL,0F4HCF=1;OF=0;AF=0;ZF=0;SF=1;PF=0(3)MOVAL,01HSUBAL,02HCF=1;OF=0;AF=1;ZF=0;SF=1;PF=1(4)MOVAL,02HINCALCF维持MOV指令前的取值(INC指令不影响CF);OF=0;AF=0;ZF=0;SF=0;PF=1(5)MOVAL,01HANDAL,02HCF=OF=0;AF不确定;ZF=1;SF=0;PF=14.按要求分析下面程序片段的执行结果。MOVAL,0C2HMOVAH,0E4HADDAL,AH执行该程序片段后,(AL)=?,(AH)=?,如果将ADD指令的两个操作数解释为无符号数,运算有没有溢出?为什么?如果将ADD指令的两个操作数解释为补码,运算有没有溢出?为什么?答:执行该程序片段后,(AL)=0A6H,(AH)=0E4H,如果操作数解释为无符号数,运算溢出,因为加法运算后最高位产生了进位,CF=1,需使用9个二进制位才能表达完整运算结果;如果将操作数解释为补码,则运算没有溢出,因为从操作数与运算结果的符号位观察,两个操作数均为负数补码,相加后所得结果仍然为负数补码,符号位正确,表明加法结果未超出补码表示范围(这里是8位补码的表示范围),加法运算后OF=0。5.按要求分析下面程序片段的执行结果。MOVAL,98HMOVBL,42HXCHGAL,BLSUBAL,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.按要求分析下面程序片段的执行结果。STCMOVAL,03HANDAL,02HADCAL,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,0871HMOVBL,[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,651CHSHLAL,1RCLAH,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,35HANDAL,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,1RCRVA1+2,1RCRVA1,1SARVA1+4,1RCRVA1+2,1RCRVA1,1(2)设计程序片段,求该48位补码的相反数补码,运算结果仍然保存在原内存单元中。解:NOTVA1NOTVA1+2NOTVA1+4ADDVA1,1ADCVA1+2,0ADCVA1+4,011.试说明如何使用CMP指令提供的标志位判断两个补码操作数大小关系的原理。答:请参考本章关于比较指令(CMP)中的详细介绍加以说明。12.假设(SP)=0060H,执行两次PUSH指令后,(SP)=?假设(SP)=0038H,执行三次POP指令后,(SP)=?答:执行两次PUSH指令后,(SP)=005CH;执行三次POP指令后(SP)=0038H+0002H*3=0038H+0006H=003EH13.按要求分析下面程序片段的执行结果。MOVAL,01HNEGALINCAL执行该程序片段后(AL)=?,CF、OF标志的状态是什么?答:执行该程序片段后(AL)=0,CF=1,注意,这是受NEG指令影响的结果,INC指令不影响CF标志;OF=0,加法运算并无溢出,因为0FFH为-1的补码,加1后等于0是正确的。14.按要求分析下面程序片段的执行结果。MOVBL,51HANDBL,0FEHXORBL,50HDECBL执行该程序片段后(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,4ROLAL,CL(2)将TF标志位置1PUSHFPOPAXORAX,0100HPUSHAXPOPF(3)将AL寄存器的第7位清0,但不影响其它数据位ANDAL,7FH(4)分离AL寄存器的最低两位,其它数据位清0。ANDAL,03H(5)分离AL寄存器的高4位与低4位,并分别保存在BL、BH的低4位PUSHAXANDAL,0FHMOVBL,ALPOPAXANDAL,0F0HMOVCL,4ROLAL,CLMOVBH,AL