<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)C語言左移和右移漫談

          單片機(jī)C語言左移和右移漫談

          作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
          #include

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

          本文引用地址:http://www.ex-cimer.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
          這里我本來想象中應(yīng)該有RL A這條指令的,但是沒有。

          當(dāng)程序改成下面的時(shí)
          #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;時(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)。

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



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();