运算符 |= 什么时候右移(RRC)??

[复制链接]
4203|7
 楼主| allround 发表于 2010-9-18 21:55 | 显示全部楼层 |阅读模式
//I/O定义
sbit AD_DOUT  P1^5;
...
...
//语句
signed int AD_Value;
...
AD_Value |= AD_DOUT;
...

//反汇编结果如下:
    74:         AD_Value |= AD_DOUT;
    75:  
C:0x09AC    A295     MOV      C,AD_DOUT(0x90.5)
C:0x09AE    E4       CLR      A
C:0x09AF    33       RLC      A  //左移,什么情况下是右移??
C:0x09B0    4207     ORL      0x07,A

请问语句 AD_Value |= AD_DOUT; 什么情况下会是右移呢?
李冬发 发表于 2010-9-19 02:32 | 显示全部楼层
干吗要右移?这个RLC的目的是把AD_OUT移到A中。
冷漠 发表于 2010-9-19 09:44 | 显示全部楼层
好办:  CY=AD_DOUT;
        CY=ACC&0X01;  //产生右移指令
        AD_Value=ACC;       
        ……

编译结果:
        MOV          C,AD_DOUT
        RRC          A     ;右移
        MOV          R7,A
        MOV          R6,#00H
;---- Variable 'AD_Value?041' assigned to Register 'R6/R7' ----
 楼主| allround 发表于 2010-9-19 15:30 | 显示全部楼层
AD是串口接收的,16位,低位在前,我想右移进 AD_Value

谢谢楼上的
冷漠 发表于 2010-9-20 09:16 | 显示全部楼层
简单:
AD_Value >>=1;
john_light 发表于 2010-9-20 11:30 | 显示全部楼层

  1. unsigned char i;


  2. AD_Value = 0x0000;

  3. for (i = 0; i < 16; i++)
  4. {    //16位循环操作
  5.     clock();  //时钟脉冲让器件输出
  6.     AD_Value >>= 1;  //在这里右移
  7.     if (AD_DOUT)
  8.     {  //输出为高电平时令最高位为高
  9.         AD_Value |= 0x8000
  10.     }  //低电平不用理
  11. }
ejack 发表于 2010-9-20 12:33 | 显示全部楼层
编译器会根据位变量在字节中的位置进行相应方向的移动。
很多时候这只是为了让愚蠢的编译器产生你所需要的汇编而已。

需要标准移位操作的话建议像上面的例程,否则过个一年半载你可能就要破口大骂“这是哪个SB写的BS”:D
 楼主| allround 发表于 2010-9-23 00:59 | 显示全部楼层
6楼方法不错,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

267

帖子

1

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