打印

请问语句 AD_Value |= AD_DOUT; 什么情况下会是右移呢?

[复制链接]
586|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangpe|  楼主 | 2017-5-6 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//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; 什么情况下会是右移呢?
沙发
langgq| | 2017-5-6 22:26 | 只看该作者

干吗要右移?这个RLC的目的是把AD_OUT移到A中。

使用特权

评论回复
板凳
wangzsa| | 2017-5-6 22:29 | 只看该作者
好办:  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' ----

使用特权

评论回复
地板
wangpe|  楼主 | 2017-5-6 22:31 | 只看该作者
AD是串口接收的,16位,低位在前,我想右移进 AD_Value

谢谢楼上的

使用特权

评论回复
5
zhuww| | 2017-5-6 22:38 | 只看该作者
简单:
AD_Value >>=1;

使用特权

评论回复
6
zhanglli| | 2017-5-6 22:41 | 只看该作者
unsigned char i;





AD_Value = 0x0000;



for (i = 0; i < 16; i++)

{    //16位循环操作

     clock();  //时钟脉冲让器件输出

     AD_Value >>= 1;  //在这里右移

     if (AD_DOUT)

     {  //输出为高电平时令最高位为高

         AD_Value |= 0x8000

     }  //低电平不用理

}

使用特权

评论回复
7
lium| | 2017-5-6 22:44 | 只看该作者
编译器会根据位变量在字节中的位置进行相应方向的移动。

使用特权

评论回复
8
lium| | 2017-5-6 22:48 | 只看该作者
很多时候这只是为了让愚蠢的编译器产生你所需要的汇编而已。

使用特权

评论回复
9
guoyt| | 2017-5-6 22:50 | 只看该作者
需要标准移位操作的话我发的例程可以啊

使用特权

评论回复
10
wangpe|  楼主 | 2017-5-6 22:54 | 只看该作者
哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

评论回复
11
kk5004| | 2017-5-15 10:53 | 只看该作者
你好,我這邊是 希特電子(深圳)有限公司, 是中國大陸笙泉MCU的代理商  有需要解決的技術問題可以 加我 QQ 328626444 詳細聊聊,   潘,R

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

938

主题

9837

帖子

2

粉丝