新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機C語言左移和右移漫談

        單片機C語言左移和右移漫談

        作者: 時間:2016-11-18 來源:網絡 收藏
        #include

        #define uchar unsigned char
        #define uint unsigned int
        void main(void)
        {
        uchar a;
        a=0x01;
        a=a<<1;
        }
        在這段程序中,看起來沒有什么問題,但是編譯后不能生成代碼

        本文引用地址:http://www.104case.com/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_是一樣的。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 三门县| 三亚市| 麻阳| 晋城| 龙陵县| 新余市| 尉犁县| 塔河县| 荆州市| 西峡县| 丽水市| 射阳县| 龙口市| 孝感市| 平阳县| 乌海市| 尼勒克县| 托里县| 洱源县| 宿州市| 家居| 永兴县| 贵溪市| 屯门区| 涡阳县| 泸水县| 太和县| 姚安县| 中牟县| 西和县| 图们市| 台湾省| 周口市| 纳雍县| 温宿县| 阳泉市| 塘沽区| 饶阳县| 柳林县| 中阳县| 鄯善县|