嵌入式中C和匯編的一些技巧
發(fā)布時(shí)間:2008/8/18 0:00:00 訪問(wèn)次數(shù):749
a. 條件執(zhí)行
cmp r0,#5
beq bypass
add r1,r1,r0
sub r1,r1,r2
bypass ......
可以替代為:
cmp r0,#5
addne r1,r1,r0
subne r1,r1,r2
......
如果被跳過(guò)的指令序列并不進(jìn)行復(fù)雜的操作,使用條件執(zhí)行都要比使用轉(zhuǎn)移好,因?yàn)閍rm轉(zhuǎn)義指令一般要用3個(gè)周期來(lái)執(zhí)行。
對(duì)于以下的條件執(zhí)行可以這樣來(lái)寫匯編:
; if ( (a = = b) && (c = = d) ) e++
cmp r0,r1
cmpeq r2,r3
addeq r4,r4,#1
c語(yǔ)言部分:
a. 很多人認(rèn)為以下兩種變量定義空間效率一樣的:
① char a;
short b;
char c;
int d;
② char a;
char b;
short c;
int d;
其實(shí)不然,定義次序的不同導(dǎo)致最終映像中不同的數(shù)據(jù)布局,實(shí)際中第二種定義方式能夠節(jié)約更多的存儲(chǔ)空間,所以在變量聲名時(shí),最好把所有相同類型的變量放在一起定義,這樣可以優(yōu)化存儲(chǔ)器布局。
b. 我們總是設(shè)法使用short或者char來(lái)定義變量,認(rèn)為這樣能夠節(jié)省存儲(chǔ)空間,但也有例外,我們先來(lái)看下這幾段c代碼及其相應(yīng)的匯編:
① c代碼:
int addition(int a)
{ return a+1; }
匯編:
add a1,a1,#1
② c代碼:
short addition(short a)
{ return a+1; }
匯編:
add a1,a1,#1
mov a1,a1,lsl #16
mov a1,a1,asr #16
mov pc,lr
、 c代碼:
char addition(char a)
{ return a+1; }
匯編:
add a1,a1,#1
and a1,a1,# &ff
mov pc,lr
因?yàn)閏har 類型、short類型分別是8位、16位,完成加法操作后,需要在32位的寄存器中進(jìn)行符號(hào)擴(kuò)展,所以使用32位的int以及unsinged int做加法效率最高。
c.冗余變量要消耗空間,許多人都不贊同使用它,但是下面這種情況就不同了。
int m ( void );
int n ( void );
int fg;
、 void func_1 ( void )
{
fg += m ( );
fg += n ( );
}
② void func_2 ( void )
{
int tmp = fg;
tmp += m ( );
tmp += n ( );
fg = tmp;
}
在func_1 ( ) 中每次對(duì)全局變量fg的加法操作都需要從存儲(chǔ)器load到寄存器里,加完數(shù)據(jù)后還要store回原來(lái)的存儲(chǔ)器,所以這個(gè)函數(shù)就進(jìn)行了兩次load和兩次store操作。在func_2 ( ) 中,tmp作為局部變量,系統(tǒng)為其分配一寄存器,首先執(zhí)行一次load操作后,由tmp進(jìn)行加法,最后只需一次store操作把結(jié)果送給fg,節(jié)省了很多時(shí)間,畢竟讀/寫存儲(chǔ)器的時(shí)間耗費(fèi)要比讀/寫寄存器高得多。
d.關(guān)于計(jì)數(shù)循環(huán)的問(wèn)題,一般我們都會(huì)使用累加計(jì)數(shù)的方式,遞減計(jì)數(shù)用得比較少,雖然從c代碼上看累加和遞減兩種方式時(shí)間復(fù)雜度相同,但是在對(duì)時(shí)間要求嚴(yán)格的嵌入式領(lǐng)域,這兩者執(zhí)行時(shí)間還是有差別的。
、 累加計(jì)數(shù)方式:
for ( i = 1; i < times; i ++ )
{
tmp = tmp * i ;
}
匯編:
……
0x06: mul r2,r1,r2
0x10: add r1,r1,#1
0x14: cmp r2,r0
0x18: ble 0x06
……
② 遞減計(jì)數(shù)方式:
for ( i = times; i > 1; i -- )
{
tmp = tmp * i ;
}
匯編:
……
0x06: mul r0,r1,r0
0x10: sub r1,r1,#1
0x14: bne 0x06
……
從上面的匯編可以看出,累加計(jì)數(shù)需要用到專門的cmp指令來(lái)判斷條件,而遞減計(jì)數(shù)只需要利用條件執(zhí)行的ne進(jìn)行判別,當(dāng)循環(huán)次數(shù)的量很大的話時(shí)間效率就有差別了。
歡迎轉(zhuǎn)載,信息來(lái)自維庫(kù)電子市場(chǎng)網(wǎng)(www.dzsc.com)
a. 條件執(zhí)行
cmp r0,#5
beq bypass
add r1,r1,r0
sub r1,r1,r2
bypass ......
可以替代為:
cmp r0,#5
addne r1,r1,r0
subne r1,r1,r2
......
如果被跳過(guò)的指令序列并不進(jìn)行復(fù)雜的操作,使用條件執(zhí)行都要比使用轉(zhuǎn)移好,因?yàn)閍rm轉(zhuǎn)義指令一般要用3個(gè)周期來(lái)執(zhí)行。
對(duì)于以下的條件執(zhí)行可以這樣來(lái)寫匯編:
; if ( (a = = b) && (c = = d) ) e++
cmp r0,r1
cmpeq r2,r3
addeq r4,r4,#1
c語(yǔ)言部分:
a. 很多人認(rèn)為以下兩種變量定義空間效率一樣的:
① char a;
short b;
char c;
int d;
② char a;
char b;
short c;
int d;
其實(shí)不然,定義次序的不同導(dǎo)致最終映像中不同的數(shù)據(jù)布局,實(shí)際中第二種定義方式能夠節(jié)約更多的存儲(chǔ)空間,所以在變量聲名時(shí),最好把所有相同類型的變量放在一起定義,這樣可以優(yōu)化存儲(chǔ)器布局。
b. 我們總是設(shè)法使用short或者char來(lái)定義變量,認(rèn)為這樣能夠節(jié)省存儲(chǔ)空間,但也有例外,我們先來(lái)看下這幾段c代碼及其相應(yīng)的匯編:
① c代碼:
int addition(int a)
{ return a+1; }
匯編:
add a1,a1,#1
、 c代碼:
short addition(short a)
{ return a+1; }
匯編:
add a1,a1,#1
mov a1,a1,lsl #16
mov a1,a1,asr #16
mov pc,lr
③ c代碼:
char addition(char a)
{ return a+1; }
匯編:
add a1,a1,#1
and a1,a1,# &ff
mov pc,lr
因?yàn)閏har 類型、short類型分別是8位、16位,完成加法操作后,需要在32位的寄存器中進(jìn)行符號(hào)擴(kuò)展,所以使用32位的int以及unsinged int做加法效率最高。
c.冗余變量要消耗空間,許多人都不贊同使用它,但是下面這種情況就不同了。
int m ( void );
int n ( void );
int fg;
、 void func_1 ( void )
{
fg += m ( );
fg += n ( );
}
、 void func_2 ( void )
{
int tmp = fg;
tmp += m ( );
tmp += n ( );
fg = tmp;
}
在func_1 ( ) 中每次對(duì)全局變量fg的加法操作都需要從存儲(chǔ)器load到寄存器里,加完數(shù)據(jù)后還要store回原來(lái)的存儲(chǔ)器,所以這個(gè)函數(shù)就進(jìn)行了兩次load和兩次store操作。在func_2 ( ) 中,tmp作為局部變量,系統(tǒng)為其分配一寄存器,首先執(zhí)行一次load操作后,由tmp進(jìn)行加法,最后只需一次store操作把結(jié)果送給fg,節(jié)省了很多時(shí)間,畢竟讀/寫存儲(chǔ)器的時(shí)間耗費(fèi)要比讀/寫寄存器高得多。
d.關(guān)于計(jì)數(shù)循環(huán)的問(wèn)題,一般我們都會(huì)使用累加計(jì)數(shù)的方式,遞減計(jì)數(shù)用得比較少,雖然從c代碼上看累加和遞減兩種方式時(shí)間復(fù)雜度相同,但是在對(duì)時(shí)間要求嚴(yán)格的嵌入式領(lǐng)域,這兩者執(zhí)行時(shí)間還是有差別的。
① 累加計(jì)數(shù)方式:
for ( i = 1; i < times; i ++ )
{
tmp = tmp * i ;
}
匯編:
……
0x06: mul r2,r1,r2
0x10: add r1,r1,#1
0x14: cmp r2,r0
0x18: ble 0x06
……
、 遞減計(jì)數(shù)方式:
for ( i = times; i > 1; i -- )
{
tmp = tmp * i ;
}
匯編:
……
0x06: mul r0,r1,r0
0x10: sub r1,r1,#1
0x14: bne 0x06
……
從上面的匯編可以看出,累加計(jì)數(shù)需要用到專門的cmp指令來(lái)判斷條件,而遞減計(jì)數(shù)只需要利用條件執(zhí)行的ne進(jìn)行判別,當(dāng)循環(huán)次數(shù)的量很大的話時(shí)間效率就有差別了。
歡迎轉(zhuǎn)載,信息來(lái)自維庫(kù)電子市場(chǎng)網(wǎng)(www.dzsc.com)
熱門點(diǎn)擊
- CPU學(xué)習(xí) (Cache Coherence
- 瑞薩推出具有1Mbyte片內(nèi)SRAM的32位
- MAP譯碼器嵌入式狀態(tài)信息存儲(chǔ)機(jī)制設(shè)計(jì)
- 嵌入式uClinux下的CAN總線設(shè)備驅(qū)動(dòng)程
- Atmel 在AT91SAM3中使用ARM3
- 統(tǒng)一建模語(yǔ)言UML在嵌入式系統(tǒng)設(shè)計(jì)中的應(yīng)用
- 全路由器掃描
- 嵌入式中C和匯編的一些技巧
- 基于ARM平臺(tái)的GPRS CQT測(cè)試系統(tǒng)的設(shè)
- 嵌入式系統(tǒng)軟件及編程語(yǔ)言
推薦技術(shù)資料
- DFRobot—玩的就是
- 如果說(shuō)新車間的特點(diǎn)是“靈動(dòng)”,F(xiàn)QPF12N60C那么... [詳細(xì)]
- MOSFET 電感單片降壓開關(guān)模式變換器優(yōu)勢(shì)
- SiC MOSFET 和 IG
- 新型 電隔離無(wú)芯線性霍爾效應(yīng)電
- 業(yè)界超小絕對(duì)位置編碼器技術(shù)參數(shù)設(shè)計(jì)
- 高帶寬、更高分辨率磁角度傳感技術(shù)應(yīng)用探究
- MagAlpha 角度位置傳感
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究