C51中对ACC直接操作被编译优化掉

[复制链接]
4508|12
 楼主| can88can88 发表于 2008-5-8 12:22 | 显示全部楼层 |阅读模式
在实现带奇校验的串口通许时,TB8的设置需要软件参与,而我以下的写法发现,ACC=0x55;直接被编译器优化掉了。
#include <reg52.h>

main()
{
  ACC=0x55;    //待发送0x55,放入ACC以得到奇偶位P
  TB8=PSW^0;
  SBUF=ACC;
  while(TI==0);
  TI=0;
 }

后来把TB8=PSW^0改为TB8=P,就不会被优化掉。我想问一下,P与PSW^0在编译器的角度来看是不一样的吗?
HWM 发表于 2008-5-8 12:25 | 显示全部楼层

本来就不是一个东西。

 楼主| can88can88 发表于 2008-5-8 12:29 | 显示全部楼层

更正

谢谢PWM,我笔误了,我想问
P与PSW^0在编译器的角度来看是不一样的吗
HWM 发表于 2008-5-8 12:35 | 显示全部楼层

一样,编译帮你算好了,你应感谢它才对。

 楼主| can88can88 发表于 2008-5-8 12:38 | 显示全部楼层

可是用psw^0,直接就优化掉了。这样不确定P是我想要的。

lenglx 发表于 2008-5-8 12:41 | 显示全部楼层

呵呵

P <=> PSW.0

PSW^0 这里不是PSW.0的意思, 是PSW 异或 0.

sbit P = PSW^0; 是C51的扩展语法,不是C标准语法.也只有这样写才是PSW.0的意思, 你不能在程序中直接写成PSW^0.
HWM 发表于 2008-5-8 12:44 | 显示全部楼层

最终结果对吗?TB8是否为0,SBUF是否是0x55?

若对就没啥问题。
computer00 发表于 2008-5-8 13:05 | 显示全部楼层

6楼正解。直接在程序里使用^表示异或。只有sbit时才表示什

 楼主| can88can88 发表于 2008-5-8 13:21 | 显示全部楼层

谢谢lenglx,HWM等。

TO HWM:不在乎结果,想弄明白PSW^0,P 与 PSW.0关系。
TO lenglx:你解释得太好了,谢!
ayb_ice 发表于 2008-5-8 16:11 | 显示全部楼层

TB8=PSW^0;根本就不是指PSW的0位

yiuyang 发表于 2008-5-8 21:58 | 显示全部楼层

编译器

请教各位:我在89C51系统中用的编译器各为VD5026-4;VD5027-4。工作一直不稳定而且货源不足,请各位能给以引荐。首先谢谢了。
hotpower 发表于 2008-5-8 22:07 | 显示全部楼层
程序猿 发表于 2014-3-17 15:04 | 显示全部楼层
谢谢楼主分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部