习题5
1.试说明以下指令中各操作数的寻址方式,如果是存储器寻址,请给出其EA计算公式,并说明所使用的段寄存器。 (1)MOV AL,08H 源操作数:立即数寻址 目的操作数:寄存器寻址
(2)MOV [0120H],BL 源操作数:寄存器寻址
目的操作数:直接寻址,EA=0120H,使用DS段寄存器
(3)ADD [BX],AL 源操作数:寄存器寻址
目的操作数:寄存器间接寻址,EA=(BX),使用DS段寄存器
(4)PUSH [SI]0200H
源操作数:变址寻址,EA=(SI)+0200H,使用DS段寄存器 目的操作数:隐含寻址(指令中未直接体现)
(5)SUB AX,[BP]
源操作数:寄存器间接寻址,EA=(BP),使用SS段寄存器 目的操作数:寄存器寻址
(6)AND VAR1+4,DL 源操作数:寄存器寻址
目的操作数:直接寻址,EA=VAR1+4,使用DS段寄存器
(7)PUSHF
源操作数、目的操作数均为隐含寻址
(8)MOV ES:[BX]0100H,AL 源操作数:寄存器寻址
目的操作数:基址寻址,EA=(BX)+0100H,使用ES段寄存器
(9)ADC BYTE PTR [BP][SI]0210H,45H 源操作数:立即数寻址
目的操作数:基址变址寻址,EA=(BP)+(SI)+0210H,使用SS段寄存器
(10)OR ARRY[BX][DI],CL 源操作数:寄存器寻址
目的操作数:基址变址寻址,EA=(BX)+(DI)+ARRY,使用DS段寄存器
2.试分析下列汇编指令是否存在语法错误,如果有语法错误存在,请说明是怎样的错误。 (1)PUSH 8243H
错误,单操作数指令不能使用立即数
(2)POP AL
错误,进栈、出栈指令的操作数应为16位
(3)MOV AL,6543H
错误,源、目的操作数类型不匹配
(4)ADD [0100H],64H
错误,目的操作数应使用PTR运算符指出类型,否则具有二义性 正确的写法:ADD BYTE PTR [0100H],64H,(或使用WORD PTR)
(5)ADC VAR1,VAR2
错误,8086指令系统的双操作数指令中,必须有一个是寄存器,不能两个操作数同为内存单元
(6)MOV DS,ES
错误,段寄存器间不能使用MOV指令直接传递数据,必须通过通用寄存器作为中转
(7)MOV DS,0620H
错误,使用MOV指令向段寄存器传递数据时,不能使用立即数
(8)LEA BX,AX
错误,LEA指令的源操作数必须为内存单元
(9)DEC AL,AH
错误,DEC指令为单操作数指令
(10)SHR BL,3
错误,当移位次数大于1时,在移位指令中特定使用CL寄存器给出移位次数 正确的写法:MOV CL, 3 SHR BL, CL
3.试说明分别执行下列各组指令后,CF、OF、AF、ZF、SF、PF这六个状态标志分别是怎样的取值。
(1)MOV AL,08H ADD AL,0F9H
CF=1; OF=0; AF=1; ZF=0; SF=0; PF=0
(2)MOV AL,0E1H ADD AL,0F4H
CF=1; OF=0; AF=0; ZF=0; SF=1; PF=0
(3)MOV AL,01H SUB AL,02H
CF=1; OF=0; AF=1; ZF=0; SF=1; PF=1
(4)MOV AL,02H INC AL
CF维持MOV指令前的取值 (INC指令不影响CF);OF=0; AF=0; ZF=0; SF=0; PF=1
(5)MOV AL,01H AND AL,02H
CF=OF=0; AF不确定; ZF=1; SF=0; PF=1
4.按要求分析下面程序片段的执行结果。 MOV AL,0C2H MOV AH,0E4H ADD AL,AH
执行该程序片段后,(AL)=?,(AH)=?,如果将ADD指令的两个操作数解释为无符号数,运算有没有溢出?为什么?如果将ADD指令的两个操作数解释为补码,运算有没有溢出?为什么?
答:执行该程序片段后,(AL)=0A6H,(AH)=0E4H,如果操作数解释为无符号数,运算溢出,因为加法运算后最高位产生了进位,CF=1,需使用9个二进制位才能表达完整运算结果;如果将操作数解释为补码,则运算没有溢出,因为从操作数与运算结果的符号位观察,两个操作数均为负数补码,相加后所得结果仍然为负数补码,符号位正确,表明加法结果未超出补码表示范围(这里是8位补码的表示范围),加法运算后OF=0。
5.按要求分析下面程序片段的执行结果。 MOV AL,98H MOV BL,42H XCHG AL,BL
SUB AL,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
MOV AL,03H AND AL,02H ADC AL,00H
执行该程序片段后,(AL)=?
答:(AL)=02H,此题应注意AND指令会强置CF为0。
7.假设(DS)=1000H,(SS)=2000H,字内存单元(10200H)=0870H,(10202H)=2000H,(20870H)=0203H,(20872H)=0405H,括号内所给为内存单元物理地址,括号表示该地址所指示单元中保存的数据,分别执行下列程序片段后,按要求分析各程序片段的执行结果。