鱼C论坛

 找回密码
 立即注册
查看: 6835|回复: 6

关于检测点11.1 mul al不能理解啊

[复制链接]
发表于 2011-9-18 00:32:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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中是144  ax=0000 0001 0100 0100 为什么说是溢出呢?pf为什么就为1呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-18 01:30:34 | 显示全部楼层

回帖奖励 +3 鱼币

本帖最后由 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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-18 06:47:04 | 显示全部楼层

                               
登录/注册后可看大图
我只是路过,不发表意见





















                               
登录/注册后可看大图

防辐射服品牌排名
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-18 13:58:02 | 显示全部楼层
本帖最后由 sslas 于 2011-9-18 13:59 编辑
yt**mli 发表于 2011-9-18 01:30
>>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 [BX+SI],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呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-18 14:25:55 | 显示全部楼层
本帖最后由 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...
唉其实我这边也不是顶熟,还是先好好研究下,免得又说错.


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-18 15:02:51 | 显示全部楼层
确定代码里面是
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试了啊  困惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-18 16:18:10 | 显示全部楼层
本帖最后由 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嘛...纠结中.有請潛水中的高手們跟帖发表一下高见吧.


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 06:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表