|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
兩條C語句。≌埥蹋 |
| 作者:btiger2000 欄目:ARM技術 |
在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 于 2005/12/22 14:39:00 發(fā)布:
你表達的完全不是一個意思 "//"前的和其后的。 |
|
| 3樓: | >>參與討論 |
| 作者: btiger2000 于 2005/12/22 18:39:00 發(fā)布:
怎么不是一個意思?愿聞其詳! |
|
| 4樓: | >>參與討論 |
| 作者: computer00 于 2005/12/22 18:47:00 發(fā)布:
注意 & 的優(yōu)先級 |
|
| 5樓: | >>參與討論 |
| 作者: xdx 于 2005/12/22 23:29:00 發(fā)布:
查一查變量的類型定義 hour和str應定義為int8 |
|
| 6樓: | >>參與討論 |
| 作者: btiger2000 于 2005/12/27 13:02:00 發(fā)布:
類型定義沒錯,優(yōu)先級也沒錯吧? |
|
| 7樓: | >>參與討論 |
| 作者: computer00 于 2005/12/27 13:44:00 發(fā)布:
明顯是優(yōu)先級錯了嘛,加括號試試, str[12]=((hour>>4)&0xf)+'0'; str[12]=(hour&0xf)+'0'; |
|
| 8樓: | >>參與討論 |
| 作者: zlgmarket 于 2005/12/27 13:50:00 發(fā)布:
請看對比,不知能解你惑否? 做一很小程序,在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 于 2005/12/27 16:24:00 發(fā)布:
真實糊涂!優(yōu)先級錯了!在自己的腦子里,總認為&的優(yōu)先級比+高! 多謝樓上的!但是,我對arm 的匯編還一竅不通呢!看不太懂! |
|
| 10樓: | >>參與討論 |
| 作者: computer00 于 2005/12/27 16:44:00 發(fā)布:
我覺得跟zlgmarket所說的那個無關,僅僅是&優(yōu)先級的問題 沒試過,但感覺怎么優(yōu)化,是不會改變運算結果的。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |