PIC汇编转C时 发现C编译器不给力
本帖最后由 woshigeshuai 于 2019-4-24 09:45 编辑C程序
ram20^=4;
if((RB0==1) && (ram20&BIT(3)==0))
{
if(ram29<0X9A)
ram29++;
if(ram29>=0x9c)
ram29--; // need test
ram20|=BIT(3);
}
实际运行的,第二个判断条件居然没有
movlw 4
xorwf byte_DATA_24, f
btfss PORTB, RB0
bcf byte_DATA_24, 3
movfw byte_DATA_29
xorlw 9D
bnz loc_CODE_23F
; ---------------------------------------------------------------------------------------
测试使用下面的方法可以
ram20^=4;
if(RB0==1 && ram203==0)
{
if(ram29<0X9A)
ram29++;
if(ram29>=0x9c)
ram29--; // need test
ram20|=BIT(3);
} == 优先级高于 &
所以,编译器给优化掉了 ram20&BIT(3)要加括号
否则变成
ram20 & (BIT(3)==0) 能加括号就不要省:if ((RB0 == 1) && ((ram20 & BIT(3)) == 0)) 哈哈,除非到大师级自信,先不要怀疑编译器和CPU有bug 差评,
省了许多 () {} 优先级记不好,如果不想查,就加括号! rqiang 发表于 2019-4-24 10:21
能加括号就不要省:if ((RB0 == 1) && ((ram20 & BIT(3)) == 0))
测试有效,看来是自己技术没到家。以后括号要多加 我想知道楼主怎么将汇编转C的?
难道是人工智能转换 {:tongue:} techbaby 发表于 2019-4-24 09:38
== 优先级高于 &
所以,编译器给优化掉了
感谢回复,刚看的时候没明白你的意思。后来明白了 lcw_swust 发表于 2019-4-24 09:54
ram20&BIT(3)要加括号
否则变成
ram20 & (BIT(3)==0)
谢谢,通过这次更加深了对括号的认知 z7001 发表于 2019-4-24 11:39
我想知道楼主怎么将汇编转C的?
难道是人工智能转换
转的不多,人工处理。很多就搞不了 抨击C有问题的人,都发现是菜鸟。 mon51 发表于 2019-4-29 11:36
抨击C有问题的人,都发现是菜鸟。
是的,被括号坑过好多次,这一次还是被坑了 PIC的汇编写的多吗?
最近接触,发现很难写,指令有点奇扒
如查表等等,还是用C方便,但有些MCU的ROM空间又非常小, nanfang2000 发表于 2019-4-24 10:25
哈哈,除非到大师级自信,先不要怀疑编译器和CPU有bug
有大师级的自信不够,还要有一点真正的水平。
哎,吐槽下:遇到太多人,一有问题,就说C编译器和CPU有bug,赶紧给他解决和赔偿...被指正出来,嘴巴比金刚石还硬死不承认. ycheng2004 发表于 2019-7-10 11:13
PIC的汇编写的多吗?
最近接触,发现很难写,指令有点奇扒
如查表等等,还是用C方便,但有些MCU的ROM空间又非常 ...
PIC低端MCU系列是我见过汇编指令集最少的MCU(35条指令),程序存储长度还不是按8位来的。 wildcat7261 发表于 2019-8-26 16:39
PIC低端MCU系列是我见过汇编指令集最少的MCU(35条指令),程序存储长度还不是按8位来的。 ...
最少的只有33条指令,没有中断功能。
页:
[1]