Caesar 发表于 2012-9-4 09:34:09

关于检测点11.1和小甲鱼的不同意见

原题:检测点11.1

写出下面每条指令执行后,ZF、PF、SF、等标志位的值。

sub al,al   
mov al,1   
push ax   
pop bx      
add al,bl   
add al,10   
mul al   
首先,我不知道pop bx出来了个啥值(这个感觉是本题的BUG,因为这个值谁都不知道,而且会影响后面的结果。。。我们就按小甲鱼给的答案1来算)
下面是小甲鱼的答案:
sub al,al   al=0h      ZF=1      PF=1      SF=0
mov al,1      al=1h      ZF=1      PF=1      SF=0
push ax       ax=1h      ZF=1      PF=1      SF=0
pop bx      bx=1h      ZF=1      PF=1      SF=0
add al,bl   al=2h      ZF=0      PF=0      SF=0
add al,10   al=12h       ZF=0      PF=1      SF=0
mul al      ax=144h      ZF=0      PF=1      SF=0
前面都没问题,对于最后一行,我提出一点不同意见。add al,10,是给al+10,不是10h!也就是说,倒数第二句执行完,al应该等于0ch,也就是12.而mul al执行后,应该为144,也就是90h。所以,最后一句的sf=1.
小甲鱼在这里直接将指令在debug中输入,大家都知道debug默认是16位的,从而造成了这个问题。


GeV20 发表于 2012-9-4 18:20:51

建议楼主查指令集手册,弄错了方向白忙活了哦

一个人 发表于 2012-9-5 20:21:04

你看下pop 寄存器的意思 是出栈 用一个寄存器接受出栈数据 前面push ax 是把ax入栈 再pop给bx 此时 bx和ax相等

GeV20 发表于 2012-9-5 21:22:04

......
AX=000CBX=0001CX=0011DX=0000SP=0000BP=0000SI=0000DI=0000
DS=0B3FES=0B3FSS=0B4FCS=0B4FIP=000A   NV UP EI PL NZ NA PE NC
0B4F:000A F6E0          MUL   AL
-t
AX=0090BX=0001CX=0011DX=0000SP=0000BP=0000SI=0000DI=0000
DS=0B3FES=0B3FSS=0B4FCS=0B4FIP=000C   NV UP EI PL NZ NA PE NC
0B4F:000C B8004C      MOV   AX,4C00
......
ax=0090h=10010000b, SF位为PL,是0,为什么?

zhuwei1 发表于 2014-6-10 01:54:46

支持楼主,最后一行sf=1

vkevke_3437 发表于 2014-6-10 08:19:54

MUL为无符号数乘法指令 不影响SF位 所以SF=0
IMUL是有符号乘法指令 影响SF位
页: [1]
查看完整版本: 关于检测点11.1和小甲鱼的不同意见