音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

兩條C語句。≌埥蹋

作者:btiger2000 欄目:ARM技術
兩條C語句!請教!
在ads中
假設hour=0x14, 現(xiàn)在要實現(xiàn)str[12]=0x31,str[13]=0x34
斜杠后的語句為何實現(xiàn)不了?!

str[12]=hour/16+'0';//str[12]=(hour>>4)&0xf+'0';
str[13]=hour%16+'0';//str[12]=hour&0xf+'0';


還有memcmp()函數(shù),由于疏忽,未包含頭文件,但編譯沒問題,也能執(zhí)行,就是接過不對!

真是奇怪啊。

2樓: >>參與討論
treul
你表達的完全不是一個意思
"//"前的和其后的。

3樓: >>參與討論
btiger2000
怎么不是一個意思?愿聞其詳!
 
4樓: >>參與討論
computer00
注意 & 的優(yōu)先級
 
5樓: >>參與討論
xdx
查一查變量的類型定義
hour和str應定義為int8

6樓: >>參與討論
btiger2000
類型定義沒錯,優(yōu)先級也沒錯吧?
 
7樓: >>參與討論
computer00
明顯是優(yōu)先級錯了嘛,加括號試試,
str[12]=((hour>>4)&0xf)+'0';
str[12]=(hour&0xf)+'0';

8樓: >>參與討論
zlgmarket
請看對比,不知能解你惑否?
做一很小程序,在ADS的ARM模擬器中實現(xiàn)。

1.hour當一變量時,程序如下:
   #define  uint8      unsigned CHAR
#define  uint32     unsigned int

extern uint32  Add(uint32 x, uint32 y);

uint32  sum;
// 調(diào)用匯編程序Add實現(xiàn)加法運算
void  Main(void)
{  uint8 hour;
   uint8 st[15];
   
   
   


   sum = Add(555, 168);        
   hour=sum/10;  //僅僅為了讓編譯器將hour當作變量,故hour用一運算結果
   st[12]=hour/16+'0';
   st[13]=hour%16+'0';
   
   while(1);
}

進入AXD后在該文件窗口點擊右鍵,選擇右鍵菜單的“interleave disassambly”功能,同時顯示C與反匯編,結果如下:
   sum = Add(555, 168);     
[0xe3a010a8]   mov      r1,#0xa8
[0xe59f002c]   ldr      r0,0x40000094 ; = #0x0000022b
[0xeb000017]   bl       Add
[0xe59f1028]   ldr      r1,0x40000098 ; = #0x40003000
[0xe5810000]   str      r0,[r1,#0]
   hour=sum/10;
[0xeb000009]   bl       __rt_udiv10
[0xe20000ff]   and      r0,r0,#0xff
   st[12]=hour/16+'0';
[0xe3a01030]   mov      r1,#0x30
[0xe0811220]   add      r1,r1,r0,lsr #4
[0xe5cd1010]   strb     r1,[r13,#0x10]
   st[13]=hour%16+'0';
[0xe200000f]   and      r0,r0,#0xf
[0xe2800030]   add      r0,r0,#0x30
[0xe5cd0011]   strb     r0,[r13,#0x11]

其中前面hour就是存放r0,是否是你要看的結果呢?

2,再對比一下,你就應該明白了,這次將hour的值0x14直接賦值.源程序:
#define  uint8      unsigned CHAR
#define  uint32     unsigned int

extern uint32  Add(uint32 x, uint32 y);

uint32  sum;
// 調(diào)用匯編程序Add實現(xiàn)加法運算
void  Main(void)
{  uint8 hour;
   uint8 st[15];
   
   
   


   sum = Add(555, 168);        
   
   hour=0x14;
   st[12]=hour/16+'0';
   st[13]=hour%16+'0';
   
   while(1);
}

AXD中的反匯編如下:
   sum = Add(555, 168);     
[0xe3a010a8]   mov      r1,#0xa8
[0xe59f001c]   ldr      r0,0x40000084 ; = #0x0000022b
[0xeb000008]   bl       Add
[0xe59f1018]   ldr      r1,0x40000088 ; = #0x40003000
[0xe5810000]   str      r0,[r1,#0]
   
   hour=0x14;
   st[12]=hour/16+'0';
[0xe3a00031]   mov      r0,#0x31
[0xe5cd0010]   strb     r0,[r13,#0x10]
   st[13]=hour%16+'0';
[0xe3a00034]   mov      r0,#0x34
[0xe5cd0011]   strb     r0,[r13,#0x11]

顯然,這是編譯器作了優(yōu)化,將hour當作常量來處理了,就不出現(xiàn)前面看到的運算過程,而是直接的運算結果了。

在你編程C過程中,多看看反匯編能幫你很大忙的。



9樓: >>參與討論
btiger2000
真實糊涂!優(yōu)先級錯了!在自己的腦子里,總認為&的優(yōu)先級比+高!
多謝樓上的!但是,我對arm 的匯編還一竅不通呢!看不太懂!

10樓: >>參與討論
computer00
我覺得跟zlgmarket所說的那個無關,僅僅是&優(yōu)先級的問題
沒試過,但感覺怎么優(yōu)化,是不會改變運算結果的。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關帖子
關于串口驅(qū)動及中間件的使用--影舞者
求助周工:LPC2119
誰能告訴我,適于LPC2210的片外RAM和FLASH有哪幾款
俺寫的lpc2132的串口驅(qū)動(中斷方式)
我的程序老是停在;取數(shù)據(jù)中止處,該怎么解決?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號