关于检测点11.1 mul al不能理解啊
sub al,al zf=1 pf=1 sf=0运算结果为0
—————————————————————
mov al,1 zf=1 pf=1 sf=0
不影响标志位
—————————————————————
push ax zf=1 pf=1 sf=0
不影响标志位
—————————————————————
pop bx zf=1 pf=1 sf=0
不影响标志位
—————————————————————
add al,bl zf=0 pf=0 sf=0
结果为2,(al)=0000 0010B
—————————————————————
add al,10 zf=0 pf=1 sf=0
结果为12,(al)=0000 1100B
—————————————————————
mul al
MUL指令执行后,乘积高位无有效数据则CF=OF=0;乘积高位含有效数据则CF=OF=1,对其它标志位无定义
结果为144,(ax)=0000 0000 1001 0000B结果在ax中是144ax=0000 0001 0100 0100 为什么说是溢出呢?pf为什么就为1呢
本帖最后由 ytrfamli 于 2011-9-18 14:56 编辑
>>ax中是144
>>ax=0000 0001 0100 0100
LZ,把BCD跟2进制混淆了,
144用0001 0100 0100那是BCD才如此表示
ax是144时,内部应该是
ah al
0000 0000 1001 0000
这是在第7,第4bit为1,也就是2^7+2^4=128+16=144
>>为什么说是溢出呢?"
恩...感觉前後接不太上来,你的意思好像是
" 为什么不说是溢出呢?"
吧?
溢出是在乘法结果超过所能存的容量才发生*,
这里mul al 是 12*12=144,结果存在ax中
没有超过ax的容量(ax有16bit,对於正整数能存0~65535)
*:第一次读该帖的注意!显然这是我理解错误,溢出不是这麽回事.
>>pf为什么就为1呢?
读到这里应该你也了解了,
0000 0000 1001 0000
两个1,所以PF为1
http://www.pgpop.com/image/face1.gif我只是路过,不发表意见
http://bbs.hangzhou.com.cn/images/default/sigline.gif
防辐射服品牌排名 本帖最后由 sslas 于 2011-9-18 13:59 编辑
yt**mli 发表于 2011-9-18 01:30 http://bbs.fishc.com/static/image/common/back.gif
>>ax中是144
>>ax=0000 0001 0100 0100
LZ,把BCD跟2进制混淆了,
感谢您的回答,还有个问题在debug中执行到最后mul al 时sub al,al
mov al,1
push ax
pop bx
add al,bl
add al,10
mul al
在debug 中执行到最后mul al 时
AX=0002 BX=0001 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1381 ES=1381 SS=1381 CS=1381 IP=0108 NV UP EI PL NZ NA PO NC
1381:0108 0410 ADD AL,10
-t
AX=0012 BX=0001 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1381 ES=1381 SS=1381 CS=1381 IP=010A NV UP EI PL NZ NA PE NC
1381:010A F6E0 MUL AL
-t
AX=0144 BX=0001 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1381 ES=1381 SS=1381 CS=1381 IP=010C OV UP EI PL NZ NA PE CY
1381:010C 0000 ADD ,AL DS:0001=20
我又没借位或溢出为什么程序状态字 cf和of的值会变化呢?NV UP EI PL NZ NA PE NC变成OV UP EI PL NZ NA PE CY
问题补充:
结果为144,(ax)=0000 0000 1001 0000B
怎么会变成
ov和cy呢?
本帖最后由 ytrfamli 于 2011-9-18 14:27 编辑
AX=0002 BX=0001 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1381 ES=1381 SS=1381 CS=1381 IP=0108 NV UP EI PL NZ NA PO NC
1381:0108 0410 ADD AL,10
-t
AX=0012 BX=0001 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=1381 ES=1381 SS=1381 CS=1381 IP=010A NV UP EI PL NZ NA PE NC
1381:010A F6E0 MUL AL
-t
恩...这里不太对阿...LZ确定代码里面是
add al,10
而不是
add al,10h
吗?
注意看一下ax值的改变,在debug中,寄存器的值都是以16进制表示的,
在add执行前ax为16进制0002h,就是10进制的2,
但add执行後ax为16进制0012h,那是10进制的18了,
这里肯定有问题,如果是add al,10在ax中的值应该是16进制的000CH,那才是10进制的12
>>怎么会变成ov和cy呢?
汗...看来我理解有错,本来以为结果存的下就不会有CY,
但是就算你的运算是18*18=324,也在ax的范围,仍然有CY.
而且还有OV...OV估计是跟补码有关,而CY...
唉其实我这边也不是顶熟,还是先好好研究下,免得又说错.
确定代码里面是
add al,10
我debug试过了啊 debug中-a
sub al,al
mov al,1
push ax
pop bx
add al,bl
add al,10
mul al一步步T试了啊困惑 本帖最后由 ytrfamli 于 2011-9-18 17:40 编辑
debug中
-a
喔,原来你是在debug中直接输入指令,在debug中输入指令的时候,像是add al,10
机器是解释成add al,10h的,如果你要在debug中输入10进制的10你要用A,
也就是 add al,0A
关於CY,看起来好像是针对mul提供的乘数大小而定(被乘数一律在al或是dx,ax中)
如果结果的位數比乘數大,例如提供了8bit乘数,但結果超過8bit,那麽就会有CY,
以下为实机测试的具体证明
(想在debug中直接测试记得是mov al, 10,如果写mov al,16那麽读进al的其实是10进制22)
mov al,1
mov bl,16
mul bl
16*1=16,16进制是10h,依然是8bit,CY=0
mov al,16
mov bl,16
mul bl
16*16=256,在16进制是写作100h,超过了原本的8bit,CY=1
mov al,16
mov bl,16
mul bx
bx原本就是16bit,100h没有超过16bit,CY=0
关於OV嘛...纠结中.有請潛水中的高手們跟帖发表一下高见吧.
页:
[1]