PICC 16 v9.70 pro发现BUG,郁闷

2020-02-09 11:25发布

有个习惯,新的C环境我都会测一下对于数据运算的支持,最怕的是类型隐式转换,这次第一个测试就出了问题,
PIC16F887, PICC16 v9.70(用的是坛里的破解)
void main(void)
{
        unsigned int a,b;
        a=258;
        a -=256;
        b=a>>1;
        while(b);
}

仿真结果如下:

(原文件名:test.JPG)

a -= 256, 结果应当是2,但窗口中出现了0xff02!
有几点都不妥当:
1. clrf 0x3. 这条指令应该不妥吧? 据说操作status得不到预期结果
2.a-=256汇编出来的结果 btfss 0x3,0 这是有什么根据呢? 就是前面clrf 0x3结果正确, 但我只减256,没要求减C啊?

另外, a-=257是不会有错的,因为它编译出来如下:
;a -= 257;
  07EF    3001     MOVLW 0x1
  07F0    02F2     SUBWF 0x72, F
  07F1    1C03     BTFSS 0x3, 0
  07F2    03F3     DECF 0x73, F
  07F3    02F3     SUBWF 0x73, F

好像这个问题是编译器太聪明了,但是也没优化成直接赋值
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
caochunhua
1楼-- · 2020-02-09 19:29
同意楼上。
jsjjccc
2楼-- · 2020-02-09 23:26
一个都不放心莫名其妙的优化,只有用安装时不用破解的(Lite Mode)的才算能用
tomhe666
3楼-- · 2020-02-10 05:08
 精彩回答 2  元偷偷看……
micropower
4楼-- · 2020-02-10 05:40
因为对C编译器的不放心,所以我现在基本上用汇编写。
micropower
5楼-- · 2020-02-10 07:37
“clrf 0x3. 这条指令应该不妥吧? 据说操作status得不到预期结果”
什么叫得不到预期的效果??我一直习惯就用CLRF STATUS来指向BANK0,没有什么不妥的啊~~而且datasheet上也是推荐这样写。

对于你说的“据说操作status得不到预期结果”,我看了一下datasheet,里面确实提到了“如果一条影响Z、DC或C位的指令以STAUS作为目标寄存器,则不能写这三个状态位……将STATUS作为目标寄存器的指令可能无法得到预期的效果”,请注意,不是操作STATUS得不到预期结果,而是其作为目标寄存器并且希望改变DC/C/Z这三个位的时候,这三个位不会变。
而且后面有个例子也说明了“CLRF STATUS会清零高3位,并将Z位置1。这样STATUS的值将为000uu1uu(其中u=不变)”。所以,一般在程序的最开始加上一句CLRF STATUS是为了确保当前使用内存指向BANK0。
micropower
6楼-- · 2020-02-10 09:25
"但我只减256,没要求减C啊?"
————你声明的a是无符号整型变量,就是两个字节的,在涉及两个字节操作的时候,都为了使两个字节不发生错误,当然需要用到借位标志位了。

并且不建议使用破解版的,我用MPLAB 8.50自带的for PIC10/12/16 MCUs (Lite Mode)V9.70,就没有你的问题。但BTFSS 0x3, 0这个是必须有的,因为你是两个字节的操作。而你用的单片机是8位的。


(原文件名:QQ截图未命名.gif)

一周热门 更多>