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

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

你可能感兴趣的:(单片机c语言右移指令)