<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è) > 嵌入式系統 > 設計應用 > ARM之---在C語(yǔ)言中內嵌匯編語(yǔ)言

ARM之---在C語(yǔ)言中內嵌匯編語(yǔ)言

作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò ) 收藏
開(kāi)發(fā)Arm程序的時(shí)候,大多數時(shí)候使用C/C++語(yǔ)言就可以了,但匯編語(yǔ)言在某些情況下能夠實(shí)現一些C語(yǔ)言無(wú)法實(shí)現的功能,這時(shí)候就要調用一些匯編語(yǔ)言的程序.我們需要大概了解一下在C語(yǔ)言中如何嵌入匯編語(yǔ)言.

1.內嵌匯編語(yǔ)言的語(yǔ)法:

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

__asm

{

指令[;指令]

......

[指令]

}

2.舉例:使能/禁止IRQ中斷

__inline void enable_IRQ(void)

{

int tmp;

__asm//嵌入匯編代碼

{

MRStmp,CPSR//讀取CPSR的值

BICtmp,tmp,#0x80//將IRQ中斷禁止位I清零,即允許IRQ中斷

MSRCPSR_c,tmp//設置CPSR的值

}

}

__inline void disable_IRQ(void)

{

int tmp;

__asm

{

MRStmp,CPSR

ORRtmp,tmp,#Ox80

MSRCPSR_c,tmp

}

}

3.舉例:字符串復制

void my-strcpy(const char *src,char *dst)

{

int ch;

__asm

{

loop:

#ifndef __thumb

LDRB ch,[src],#1

STRB ch,[dst],#1

#else

LDRB ch,[src]

ADDsrc,#1

STRB ch,[dst]

ADDdst,#1

#endif

CMP ch,#0

BNE loop

}

}

int main(void)

{

const char *a="Hello world!";

char b[20];

__asm

{

MOVR0,a

MOVR1,b

BL my_strcpy,{R0,R1}

}

return(0);

}

4.內嵌匯編的指令用法:

.操作書(shū): 內嵌的匯編指令中作為操作數的寄存器和常量可以是C表達式.這些表達式可以是char,short或int等類(lèi)型,而且這些表達式都是作為無(wú)符號數進(jìn)行操作的.若要有符號數,用戶(hù)需要自己處理與符號有關(guān)的操作.編譯器將會(huì )計算這些表達式的值,并為其分配寄存器.

.物理寄存器:內嵌匯編中使用物理寄存器是有限制的:

_ 不能直接向PC(程序計數器)寄存器中賦值,程序跳轉只能通過(guò)B或BL指令來(lái)實(shí)現.

_ 使用物理寄存器的指令中,不要使用過(guò)于復雜的C表達式

_ 盡可能少的使用物理寄存器

.常量: 在內嵌匯編指令中,常量前面的"#"可以省略

.標號: C程序中的標號可以被內嵌的匯編指令使用.但是只有指令B可以使用C程序中的標號,而指令BL則不能使用.

.內存單元的分配:所有內存分配均由C編譯器完成,分配的內存單元通過(guò)變量供內嵌匯編器使用.內嵌匯編器不支持內嵌匯編程序中用于內存分配的偽指令.

5.內嵌匯編注意事項:

.必須小心使用物理寄存器,如R0~R3,IP,LR,CPSR中的標志位,避免發(fā)生沖突.

例如:

__asm

{

MOVR0,x

ADDy,R0,x/y

}

改成下面代碼會(huì )比較妥當:

__asm

{

MOV var,x

ADD y,var,x/y

}

.不要使用寄存器代替變量.

.使用內嵌匯編無(wú)需保存和恢復寄存器.事實(shí)上,除了CPSR,SPSR寄存器,對物理寄存器先讀后寫(xiě)都會(huì )引起匯編報錯.

.匯編語(yǔ)言中","號作為操作數分隔符.如果有C表達式作為操作數,若表達式中包含有",",則必須使用()將其規約為一個(gè)匯編操作數,例如:

__asm
{

ADD x,y,(f(),z)//"f(),z"為帶有","的C表達式.

}

6.不同數據類(lèi)型對應的匯編指令:

unsigned charLDRB/STRB

unsigned shortLDRH/STRH

unsigned int LDR/STR

char LDRSB/STRSB

short LDRSH/STRSH

7.訪(fǎng)問(wèn)C程序的變量:

AREAglobals,CODE,READONLY

EXPORTasmsubroutine

IMPORTglobalvar;聲明的外部變量

asmsubroutine

LDRR1,=blobalval

LDRR0,[R1]

ADDR0,R0,#1

STRR0,[R1]

MOVPC,LR

END



評論


技術(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>