发布于 2012-10-29 11:17:35
4楼
1、首先有个小疑问,楼主程序里的276是怎么来的?
因为DBW30最大也就是255了(DBX31.7),如果是276最终指向DBX34.4了。
如此的话,楼主的程序是把DBX22.0~DBX34.4取反后放到DBX2.0~DBX14.4了。
2、楼主的程序问题不少,主要是shine版说的,目标地址MD1104的赋值问题,是既没有赋初值也没有在循环体内赋值。
所以第一次执行时目标地址其实是DB13.DBX0.0(前提是MD1104在程序中没有别的地方赋值)而且由于没有在循环体内赋值,因此整个循环都不变,一共被写了100次。
循环结束后MD1104终于被赋值了,于是目标地址变成了DB13.DBX14.5(277-16#A0),所以DBX14.5在其后的循环中一直被置位着,直到永远。。。
顺着楼主的想法,改写了一下程序,就能正常工作了
OPN DB 13 //原谅偶把OPN放循环体外了,减少循环的长度
L DW#16#B0
T MD 1100
M1: L MD 1100
T #ZHI
L DW#16#A0
-D
T MD 1104 //MD1104在循环体内赋值,按照楼主的思路,利用MD1100来赋初值
A DBX [MD 1100]
NOT
= DBX [MD 1104]
L #ZHI
L 1
+D
T MD 1100
L 255 //这里我改成255了,这样最大到DBX31.7
<=D
JC M1
3、最后提一下,是我的话,会用异或指令来做。方法和N侠给出的类似,点数不多,用枚举法就可以了。
如果点数多,也可以写循环来做,不过那样无非是循环次数少些而已,循环程序还是一样的。
例如:
OPN DB 13
L DBD22
XOD DW#16#FFFFFFFF
T DBD2