什么情况下会是右移呢

[复制链接]
1589|13
 楼主| 栩栩如生 发表于 2012-9-8 17:54 | 显示全部楼层 |阅读模式
//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; 什么情况下会是右移呢?
ousj 发表于 2012-9-8 17:55 | 显示全部楼层
干吗要右移?这个RLC的目的是把AD_OUT移到A中。
ousj 发表于 2012-9-8 17:57 | 显示全部楼层
好办:  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' ----
 楼主| 栩栩如生 发表于 2012-9-8 17:58 | 显示全部楼层
AD是串口接收的,16位,低位在前,我想右移进 AD_Value

谢谢楼上的
 楼主| 栩栩如生 发表于 2012-9-8 18:21 | 显示全部楼层
简单:
AD_Value >>=1;
houcs 发表于 2012-9-8 18:21 | 显示全部楼层
unsigned char i;





AD_Value = 0x0000;



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

{    //16位循环操作

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

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

    if (AD_DOUT)

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

        AD_Value |= 0x8000

    }  //低电平不用理

}
juventus9554 发表于 2012-9-8 18:26 | 显示全部楼层
编译器会根据位变量在字节中的位置进行相应方向的移动。
juventus9554 发表于 2012-9-8 18:26 | 显示全部楼层
很多时候这只是为了让愚蠢的编译器产生你所需要的汇编而已。
ousj 发表于 2012-9-8 18:28 | 显示全部楼层
需要标准移位操作的话我发的例程可以啊
 楼主| 栩栩如生 发表于 2012-9-8 18:28 | 显示全部楼层
嗯,呵呵,多谢
gygp 发表于 2012-9-8 21:41 | 显示全部楼层
高位在前
51xlf 发表于 2012-9-9 10:39 | 显示全部楼层
收到的数据的最高位最先收到
gaochy1126 发表于 2012-9-9 14:54 | 显示全部楼层
要根据数据的先后顺序
GG_GG 发表于 2012-9-9 15:14 | 显示全部楼层
高位在先 右移位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

310

主题

2657

帖子

0

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