<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

本文引用地址:http://dyxdggzs.com/article/257034.htm

12.1的使用

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

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

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

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

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

12.1.1內聯(lián)匯編

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

內聯(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

...

}

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

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

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

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

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

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

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

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

錯誤的內聯(lián)匯編函數如下所示。

intf(intx)

{

__asm

{

STMFDsp!,{r0} //保存r0不合法,因為在讀之前沒(méi)有對寄存器寫(xiě)操作

ADDr0,x,1

EORx,r0,x

LDMFDsp!,{r0} //不需要恢復寄存器

}

returnx;

}

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

intf(intx)

{

intr0;

__asm

{

ADDr0,x,1

EORx,r0,x

}

returnx;

}

下面通過(guò)幾個(gè)例子進(jìn)一步了解內聯(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è)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>