標(biāo)題: 單片機(jī)C語(yǔ)言左移和右移的方法 [打印本頁(yè)]

作者: 51黑科技    時(shí)間: 2016-2-3 23:05
標(biāo)題: 單片機(jī)C語(yǔ)言左移和右移的方法

#include<reg52.h>
#define uchar unsigned char     
#define uint unsigned int
void main(void)
{
    uchar a;
    a=0x01;
    a=a<<1;
}
在這段程序中,看起來(lái)沒(méi)有什么問(wèn)題,但是編譯后不能生成代碼

#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
這里我本來(lái)想象中應(yīng)該有RL A這條指令的,但是沒(méi)有。

當(dāng)程序改成下面的時(shí)
#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;時(shí)
MOV      08H,#01H
MOV      A,08H
RLC      A
RLC      A
RLC      A
ANL      A,#0F8
MOV      08H,A
這里有點(diǎn)搞不懂了,“<<”和“>>”,到底是否帶進(jìn)位移動(dòng)。

再來(lái)看看這個(gè)
#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
從這里看來(lái),“<<”和“>>”應(yīng)該是帶進(jìn)位的。但是不能把C里原來(lái)的值移進(jìn)去。而且移到C里的數(shù)會(huì)丟掉,這里千萬(wàn)小心,例如a=0x80; a=a<<1;現(xiàn)在這里a=0x00了,1被移到C里丟掉。

再來(lái)看看_crol_和_cror_,這里要程序開(kāi)頭要包含#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移動(dòng)的,_iror_和_irol_是一樣的。









歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1