找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 32620|回复: 0
收起左侧

单片机C语言左移和右移的方法

[复制链接]
ID:104835 发表于 2016-2-3 23:05 | 显示全部楼层 |阅读模式

#include<reg52.h>
#define uchar unsigned char     
#define uint unsigned int
void main(void)
{
    uchar a;
    a=0x01;
    a=a<<1;
}
在这段程序中,看起来没有什么问题,但是编译后不能生成代码

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void main(void)
{
    volatile uchar a;
    a=0x01;
    a=a<<1;
}
改成这样后就能生成代码,但是生成的代码为
MOV      08H,#01H
MOV      A,08H
ADD      A,A
MOV      08H,A
这里我本来想象中应该有RL A这条指令的,但是没有。

当程序改成下面的时
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void main(void)
{
    volatile uchar a;
    a=0x01;
    a=a<<2;
}
生成的代码是
MOV      08H,#01H
MOV      A,08H
ADD      A,A
ADD      A,A
MOV      08H,A
改成a=a<<3;时
MOV      08H,#01H
MOV      A,08H
RLC      A
RLC      A
RLC      A
ANL      A,#0F8
MOV      08H,A
这里有点搞不懂了,“<<”和“>>”,到底是否带进位移动。

再来看看这个
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void main(void)
{
    volatile uchar a;
    a=0x01;
    CY=1;
    a=a>>1;
}
生成的代码是
MOV      08H,#01H
MOV      A,08H
CLR      C
RRC      A
MOV      08H,A
从这里看来,“<<”和“>>”应该是带进位的。但是不能把C里原来的值移进去。而且移到C里的数会丢掉,这里千万小心,例如a=0x80; a=a<<1;现在这里a=0x00了,1被移到C里丢掉。

再来看看_crol_和_cror_,这里要程序开头要包含#include<intrins.h>
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
void main(void)
{
    volatile uchar a;
    a=0x01;
    a=_crol_(a,1);
}
生成的代码为
     MOV      08H,#01H
     MOV      R7,08H
     MOV      R0,#01H
     MOV      A,R7
     INC      R0
     SJMP     L1
L1:RL       A
     DJMZ     R0,L1
     MOV      08H,A
这里可以看出_crol_和_cror_是不带C移动的,_iror_和_irol_是一样的。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表