您的位置 首页 硬件

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

#includereg52.h>#defineucharunsignedchar#defineuintunsignedintvoidmain(void){uchara;a=0x01;a=a1;}

#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_是相同的。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/266712.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部