微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机C语言左移和右移漫谈

单片机C语言左移和右移漫谈

时间:11-18 来源:互联网 点击:
#include

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

#include
#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
#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
#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
#include
#include
#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_是一样的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top