gpp0603
静水无为
级别: 略有小成
精华主题: 0
发帖数量: 253 个
工控威望: 334 点
下载积分: 10445 分
在线时间: 220(小时)
注册时间: 2009-11-12
最后登录: 2025-01-07
查看gpp0603的 主题 / 回贴
楼主  发表于: 2013-03-28 07:13
MOV  K8192 D0
MOV  K4         D1
MUL D0    D1    D2
SUB  D2   K1    D10
DIV    D10  K4   D12

监视发现到D2值是—32768  D12的值是0,是否运算错误,还是值超出范围
请高手帮忙解释一下,期待你的回复。
dongguansae
级别: 探索解密
精华主题: 0
发帖数量: 25 个
工控威望: 146 点
下载积分: 2218 分
在线时间: 25(小时)
注册时间: 2012-12-11
最后登录: 2020-07-14
查看dongguansae的 主题 / 回贴
1楼  发表于: 2013-03-29 11:59
这样改就对了:
MOV K8192 D0
MOV K1 D1
MUL D0 D1 D2
DSUB D2 K1 D10
DDIV D10 K4 D12

MUL后的值是32位的,保存在D2和D3中,所以想用这个值去代入运算,必须加D,DSUB D2 K1 D10 等于(D3,D2)--1 =D10
这样才对,另外D10也是32位的,所以下面应该是DDIV 才能计算正确。这个比较特殊,一个带符号的16位显示的范围是+/-32767,所以32768在D3,D2中是这样的:
00000000 00000000 100000000 00000000 (0为正,1为负),如果没有加D,那只是D2代入,D3被忽略,默认为1,所以此时D2会显示 -32768,再减个1,为-32769,超出了范围,所以,D10的值此时为0。说了这么多,总之加D就对啦!
[ 此帖被dongguansae在2013-03-29 12:09重新编辑 ]