|
我的C51版本是 8.12
现在有点问题,如下的程序
- ACC=Data;
- for(i=8;i;i--)
- {
- ACC<<=1;
- SDA=CY;
- SCL=1;
- _nop_();
- SCL=0;
- }
复制代码
为了加快速度,我准备使用ACC累加器的左移功能,
但是编译出来的代码却是这样的,
- 640: ACC=Data;
- C:0x1B00 EF MOV A,R7
- 641: for(i=8;i;i--)
- C:0x1B01 7F08 MOV R7,#0x08
- 642: {
- [color=#FF0000] 643: ACC<<=1;
- C:0x1B03 25E0 ADD A,ACC(0xE0)[/color]
- 644: SDA=CY;
- C:0x1B05 9280 MOV SDA(0x80.0),C
- 645: SCL=1;
- C:0x1B07 D281 SETB SCL(0x80.1)
- 646: _nop_();
- C:0x1B09 00 NOP
- 647: SCL=0;
- C:0x1B0A C281 CLR SCL(0x80.1)
- 648: }
复制代码
奇怪的是,使用ACC的右移功能,却能生成正确的代码,如下所示,
- ACC=Data;
- for(i=8;i;i--)
- {
- ACC>>=1;
- SDA=CY;
- SCL=1;
- _nop_();
- SCL=0;
- }
复制代码
生成的代码如下
- 640: ACC=Data;
- C:0x1B00 EF MOV A,R7
- 641: for(i=8;i;i--)
- C:0x1B01 7F08 MOV R7,#0x08
- 642: {
- [color=#FF6600] 643: ACC>>=1;
- C:0x1B03 C3 CLR C
- C:0x1B04 13 RRC A[/color]
- 644: SDA=CY;
- C:0x1B05 9280 MOV SDA(0x80.0),C
- 645: SCL=1;
- C:0x1B07 D281 SETB SCL(0x80.1)
- 646: _nop_();
- C:0x1B09 00 NOP
- 647: SCL=0;
- C:0x1B0A C281 CLR SCL(0x80.1)
- 648: }
复制代码
请问哪位知道怎么解决吗,我用最新的C51 9.0 版编译也是一样的。
感觉非常郁闷,为什么右移可以,左移不行呢?
|
|