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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 混合使用C、C++和匯編語(yǔ)之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

          混合使用C、C++和匯編語(yǔ)之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

          作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257034.htm

          12.1的使用

          是包含在/++編譯器中的匯編器。使用它可以在/程序中實(shí)現(xiàn)C/語(yǔ)言不能完成的一些工作。例如,在下面幾種情況中必須使用

          ·程序中使用飽和算術(shù)運(yùn)算(Saturatingarithmetic),如SSAT16和USAT16指令。

          ·程序中需要對(duì)協(xié)處理器進(jìn)行操作。

          ·在C或程序中完成對(duì)程序狀態(tài)寄存器的操作。

          使用內(nèi)聯(lián)匯編編寫的程序代碼效率也比較高。

          12.1.1內(nèi)聯(lián)匯編

          1.內(nèi)聯(lián)匯編語(yǔ)法

          內(nèi)聯(lián)匯編使用“_asm”(C++)和“asm”(C和C++)關(guān)鍵字聲明,語(yǔ)法格式如下所示。

          ·__asm(instruction[;instruction]); //必須為單條指令

          __asm{instruction[;instruction]}

          ·__asm{

          ...

          instruction

          ...

          }

          ·asm(instruction[;instruction]); //必須為單條指令

          asm{instruction[;instruction]}

          ·asm{

          ...

          instruction

          ...

          }

          內(nèi)聯(lián)匯編支持大部分的指令,但不支持帶狀態(tài)轉(zhuǎn)移的跳轉(zhuǎn)指令,如BX和BLX指令,詳見(jiàn)相關(guān)文檔。

          由于內(nèi)聯(lián)匯編嵌入在C或C++程序中,所有在用法上有其自身的一些特點(diǎn)。

          ①如果同一行中包含多條指令,則用分號(hào)隔開(kāi)。

          ②如果一條指令不能在一行中完成,使用反斜杠“/”將其連接。

          ③內(nèi)聯(lián)匯編中的注釋語(yǔ)句可以使用C或C++風(fēng)格的。

          中使用逗號(hào)“,”作為指令操作數(shù)的分隔符,所以如果在C語(yǔ)言中使用逗號(hào)必須用圓括號(hào)括起來(lái)。如,__asm{ADDx,y,(f(),z)}。

          ⑤內(nèi)聯(lián)中的寄存器名被編譯器視為C或C++語(yǔ)言中的變量,所以內(nèi)聯(lián)匯編中出現(xiàn)的寄存器名不一定和同名的物理寄存器相對(duì)應(yīng)。這些寄存器名在使用前必須聲明,否則編譯器將提示警告信息。

          ⑥內(nèi)聯(lián)匯編中的寄存器(除程序狀態(tài)寄存器CPSR和SPSR外)在讀取前必須先賦值,否則編譯器將產(chǎn)生錯(cuò)誤信息。下面的例子顯示了內(nèi)聯(lián)匯編和真正匯編的區(qū)別。

          錯(cuò)誤的內(nèi)聯(lián)匯編函數(shù)如下所示。

          intf(intx)

          {

          __asm

          {

          STMFDsp!,{r0} //保存r0不合法,因?yàn)樵谧x之前沒(méi)有對(duì)寄存器寫操作

          ADDr0,x,1

          EORx,r0,x

          LDMFDsp!,{r0} //不需要恢復(fù)寄存器

          }

          returnx;

          }

          將其進(jìn)行改寫,使它符合內(nèi)聯(lián)匯編的語(yǔ)法規(guī)則。

          intf(intx)

          {

          intr0;

          __asm

          {

          ADDr0,x,1

          EORx,r0,x

          }

          returnx;

          }

          下面通過(guò)幾個(gè)例子進(jìn)一步了解內(nèi)聯(lián)匯編的語(yǔ)法。

          ①字符串拷貝

          下面的例子使用一個(gè)循環(huán)完成了字符串的拷貝工作。

          #includestdio.h>

          voidmy_strcpy(constchar*src,char*dst)

          {

          intch;

          __asm

          {

          loop:

          LDRBch,[src],#1

          STRBch,[dst],#1

          CMPch,#0

          BNEloop

          }

          }

          intmain(void)

          {

          constchar*a=Helloworld!;

          charb[20];

          my_strcpy(a,b);

          printf(Originalstring:'%s'n,a);

          printf(Copiedstring:'%s'n,b);

          return0;

          }

          c語(yǔ)言相關(guān)文章:c語(yǔ)言教程


          c++相關(guān)文章:c++教程



          上一頁(yè) 1 2 3 4 5 6 7 8 9 10 11 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(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); })();