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

#define uchar unsigned char

#define uint unsigned int

void main(void)

{

uchar a;

a=0x01;

a=a<<1;

}

在这段程序中,看起来没有什么问题,但是编译后不能生成代码本文引用地址:http://www.eepw.com.cn/article/201611/315811.htm

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值