|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
匯編的思維寫(xiě)出簡(jiǎn)潔的C程序 |
| 作者:gipsyer 欄目:單片機(jī) |
上學(xué)的時(shí)候?qū)W過(guò)單片機(jī),后來(lái)幾乎全還給了學(xué)校。前段時(shí)間由于工作需要重新拾起來(lái),用匯編寫(xiě)了個(gè)程序,但由于維護(hù)起來(lái)太麻煩,決定用C重寫(xiě)一遍。在重寫(xiě)的過(guò)程中有一點(diǎn)點(diǎn)心得,希望與其他C51的初學(xué)者共享! 如果要寫(xiě)個(gè)延時(shí)程序,是用 { for(i=0;i<100;i++); } 還是用 { for(i=100;i>0;i--); } 呢?似乎沒(méi)什么區(qū)別,但在匯編里面 用加一的思想,程序必然這么寫(xiě), mov r0,#00H ;2字節(jié) loop: inc r0 ;1字節(jié) cjen r0,#64H,loop ;3字節(jié) 如果用減一的思想,程序可以這么寫(xiě) mov r0,#64H ;2字節(jié) loopL: djnz r0,loop ;2字節(jié) 其實(shí)這也是keil c對(duì)C處理后的匯編情況。 由此可見(jiàn),C的語(yǔ)法稍微變一點(diǎn),就可以節(jié)約2個(gè)byte,定時(shí)可以更精確。 程序更簡(jiǎn)潔! |
| 2樓: | >>參與討論 |
| 作者: javie 于 2005/12/21 11:29:00 發(fā)布:
很好的思想 思想體現(xiàn)于點(diǎn)滴間 |
|
| 3樓: | >>參與討論 |
| 作者: isoar 于 2005/12/21 12:31:00 發(fā)布:
很多時(shí)候是要用i的尤其是順序使用時(shí) |
|
| 4樓: | >>參與討論 |
| 作者: stoneymumu 于 2005/12/21 13:29:00 發(fā)布:
思路不錯(cuò) 善于思考阿,沒(méi)想過(guò)這個(gè)問(wèn)題 |
|
| 5樓: | >>參與討論 |
| 作者: yuntian 于 2005/12/21 16:08:00 發(fā)布:
只有熟悉匯編指令的人才能寫(xiě)出精簡(jiǎn)的c程序 |
|
| 6樓: | >>參與討論 |
| 作者: ccelec 于 2005/12/21 16:13:00 發(fā)布:
: 應(yīng)該說(shuō)了解編譯過(guò)程,才能寫(xiě)出效率高的C代碼。但還有個(gè)事實(shí)是:不同的編譯器對(duì)同一句代碼的編譯方法是不同的。 |
|
| 7樓: | >>參與討論 |
| 作者: foxqiu 于 2005/12/21 19:05:00 發(fā)布:
經(jīng)驗(yàn)啊,多學(xué)習(xí)。 |
|
| 8樓: | >>參與討論 |
| 作者: fccastle 于 2005/12/21 19:08:00 發(fā)布:
嗯。 可惜沒(méi)怎么學(xué)過(guò)匯編! |
|
| 9樓: | >>參與討論 |
| 作者: forbbs21ic 于 2005/12/21 19:23:00 發(fā)布:
多看看廠商的應(yīng)用指南 這類(lèi)技巧很多的,不過(guò)優(yōu)化程序的關(guān)鍵還是算法,技巧到底只是技巧。 |
|
| 10樓: | >>參與討論 |
| 作者: yuxing276 于 2005/12/21 20:40:00 發(fā)布:
是很好的經(jīng)驗(yàn)啊,又學(xué)到了些東西! 是很好的經(jīng)驗(yàn)啊,又學(xué)到了些東西。≈x謝版主。。∫袰寫(xiě)好是要從點(diǎn)滴做起! |
|
| 11樓: | >>參與討論 |
| 作者: drq1997 于 2005/12/21 21:36:00 發(fā)布:
呵呵,又長(zhǎng)知識(shí)了。 |
|
| 12樓: | >>參與討論 |
| 作者: liutianbao 于 2005/12/21 22:30:00 發(fā)布:
keil c里面i的順序好像沒(méi)什么關(guān)系吧 以前試過(guò) for(i=100;i>0;i--); 在keil里看反匯編后的程序并不是樓主所寫(xiě)的那樣,, 是不是要什么優(yōu)化設(shè)置? |
|
| 13樓: | >>參與討論 |
| 作者: newfree 于 2005/12/22 9:21:00 發(fā)布:
這個(gè)……是不是向面向?qū)ο蟮木幊烫魬?zhàn)阿哈哈。 我覺(jué)得,如果不是實(shí)時(shí)性能要求非常高的情況下。 寫(xiě)些自己舒服的程序,更加好。。。 實(shí)時(shí)性能要多高才算高?我想100us以下就算高了。 不知道大家怎么認(rèn)為。 |
|
| 14樓: | >>參與討論 |
| 作者: gipsyer 于 2005/12/22 9:55:00 發(fā)布:
re 同意ccelec的說(shuō)法,要熟悉編譯器的編譯過(guò)程,工欲善其事,必先利其器。 to liutianbao, keil c不是用mov r0,#00H 而是用 clr a mov r0, a 總共還是2字節(jié) to newfree, 我只是寫(xiě)出個(gè)人的一點(diǎn)心得,并沒(méi)有挑戰(zhàn)誰(shuí)。我之所以重寫(xiě)代碼,本身就說(shuō)明高級(jí)語(yǔ)言(C,C++)與匯編相比,自有它的優(yōu)勢(shì),這點(diǎn)無(wú)須爭(zhēng)論。100us以下就算高?我看未必。PHILIPS有句話說(shuō)得好,let's make things better,只是舉手之勞的事情,為什么我們不做的更好呢! |
|
| 15樓: | >>參與討論 |
| 作者: liutianbao 于 2005/12/22 10:26:00 發(fā)布:
re 在keil C中 如果i為int型, 則i++和i--在效率上沒(méi)什么區(qū)別 如果i為CHAR型, 則i--比i++匯編后簡(jiǎn)潔的多 以前是我弄錯(cuò)了, 剛才再試了一下。。。。。。。 |
|
| 16樓: | >>參與討論 |
| 作者: bolofeng 于 2005/12/22 12:49:00 發(fā)布:
遞增和遞減 這個(gè)東西說(shuō)爛說(shuō)透了! |
|
| 17樓: | >>參與討論 |
| 作者: hotpower 于 2005/12/22 12:59:00 發(fā)布:
肯定有區(qū)別 |
|
| 18樓: | >>參與討論 |
| 作者: ever820120 于 2005/12/22 22:12:00 發(fā)布:
只得學(xué)習(xí),我從匯編入門(mén)的 好像大家學(xué)C單片機(jī)都是C-51的多啊 |
|
| 19樓: | >>參與討論 |
| 作者: northerns 于 2005/12/23 9:21:00 發(fā)布:
又長(zhǎng)知識(shí)啦 |
|
| 20樓: | >>參與討論 |
| 作者: 鑲藍(lán) 于 2005/12/23 15:41:00 發(fā)布:
學(xué)到了不少東西啊. |
|
| 21樓: | >>參與討論 |
| 作者: pheavecn 于 2005/12/23 22:15:00 發(fā)布:
樓主的想法是想當(dāng)然的。 |
|
| 22樓: | >>參與討論 |
| 作者: liht 于 2005/12/24 13:03:00 發(fā)布:
恩!我也要學(xué)學(xué)C語(yǔ)言 |
|
| 23樓: | >>參與討論 |
| 作者: linwei1234 于 2005/12/24 14:56:00 發(fā)布:
我也是前兩個(gè)月發(fā)現(xiàn)這問(wèn)題的!真的可以壓縮很多也! |
|
| 24樓: | >>參與討論 |
| 作者: yo.hawk 于 2005/12/24 15:37:00 發(fā)布:
個(gè)人認(rèn)為,匯編好用些窩! 個(gè)人認(rèn)為,匯編好用些窩!雖然有時(shí)候比較繁瑣,但用起來(lái)思路比較清晰,可以清楚地知道程序的走向! 不過(guò),要做好注釋,不然可能過(guò)一段時(shí)間后,自己寫(xiě)的也有可能忘記怎么來(lái)的了! (無(wú)知之言,有不對(duì)的地方請(qǐng)各位多多指點(diǎn)啊!) |
|
| 25樓: | >>參與討論 |
| 作者: z_no1 于 2005/12/24 21:51:00 發(fā)布:
一個(gè)小問(wèn)題 樓主這個(gè)程序是用來(lái)做延時(shí)的吧,一個(gè)浪費(fèi)時(shí)間的子程序就沒(méi)必要優(yōu)化了吧。違反了優(yōu)化的原則第一條:不用優(yōu)化的程序就不要優(yōu)化。呵呵! 當(dāng)然在要優(yōu)化的地方這個(gè)技巧很有用,我也常用。深入低層編程要麻煩,但這是有收益的。 |
|
| 26樓: | >>參與討論 |
| 作者: 32768Hz 于 2005/12/24 23:42:00 發(fā)布:
我覺(jué)得這樣更接近匯編思維 do{ }while(--i); |
|
| 27樓: | >>參與討論 |
| 作者: cf100 于 2005/12/25 16:29:00 發(fā)布:
簡(jiǎn)單或簡(jiǎn)化也不見(jiàn)得都好 最簡(jiǎn)單是這樣: while(--i) ; 但我們寫(xiě)程序也要注意可維護(hù)性,如果一味強(qiáng)求效率,也不會(huì)寫(xiě)出什么好程序來(lái)。 |
|
| 28樓: | >>參與討論 |
| 作者: 啊哈 于 2005/12/25 19:07:00 發(fā)布:
老貼長(zhǎng)談了,去看看hotpower的貼吧 |
|
| 29樓: | >>參與討論 |
| 作者: high 于 2005/12/26 19:10:00 發(fā)布:
不是很值得鼓勵(lì). 對(duì)效率的考慮不應(yīng)該到這種程度. 程序?qū)懙亩嗔?更關(guān)心擴(kuò)展和移植.而這往往就是以犧牲效率為代價(jià)的. 有時(shí)候也會(huì)有要到摳到字節(jié)的時(shí)候,但一般都是摳ram,絕對(duì)不去摳rom size. --一家之言 更正:在做時(shí)序時(shí)候例外,這時(shí)候的確值得摳. * - 本貼最后修改時(shí)間:2005-12-28 21:56:53 修改者:high |
|
| 30樓: | >>參與討論 |
| 作者: yzqok 于 2005/12/27 13:27:00 發(fā)布:
很好的思路 |
|
| 31樓: | >>參與討論 |
| 作者: water2005 于 2005/12/27 21:39:00 發(fā)布:
hehe 有意思 |
|
| 32樓: | >>參與討論 |
| 作者: eeproom 于 2005/12/28 8:04:00 發(fā)布:
值得商酌 在下以為,程序的代碼是否高效,簡(jiǎn)潔,很大程度上取決于你構(gòu)建的整體結(jié)構(gòu),而不必?fù)搁T(mén)到細(xì)小的一兩個(gè)byte實(shí)現(xiàn)方法。不止一次的經(jīng)驗(yàn),一個(gè)好的結(jié)構(gòu)和算法可以省掉甚至80%的代碼空間,執(zhí)行時(shí)間也大弧度提升。當(dāng)然技巧性的設(shè)計(jì)也有益,不過(guò)那是針對(duì)編譯器在設(shè)計(jì)而不是面向?qū)ο罅恕?br> |
|
| 33樓: | >>參與討論 |
| 作者: 小馬 于 2005/12/28 10:00:00 發(fā)布:
說(shuō)到底就是指令集支持的問(wèn)題 判斷0比判斷一個(gè)非零數(shù)容易,很多指令集都有直接自減并判斷(非)零跳轉(zhuǎn)的指令,就是為了優(yōu)化循環(huán)。 |
|
| 34樓: | >>參與討論 |
| 作者: qin000000 于 2005/12/28 15:34:00 發(fā)布:
MPU發(fā)展得太快了 以現(xiàn)在的MPU發(fā)展速度,這些細(xì)節(jié)問(wèn)題不在需要多花心思了!速度慢了用1T的單片機(jī),code,data不夠的用大容量單片機(jī)就OK了。當(dāng)然能寫(xiě)出高效代碼最好,也是一種好習(xí)慣 |
|
| 35樓: | >>參與討論 |
| 作者: yzy1102 于 2006/1/1 18:48:00 發(fā)布:
很好,只是課本上沒(méi)這么做過(guò)示范 看來(lái),出書(shū)的人應(yīng)該好好想想,不能總拿陳舊單一的東西糊弄我們. |
|
| 36樓: | >>參與討論 |
| 作者: cgha 于 2006/1/1 21:40:00 發(fā)布:
c里面也有好多講究啊,呵呵,例舉幾個(gè) //1、參數(shù)位置 #ifdef FOO static int foo(CHAR a, int b, int *c) { return (int)a + b + *c; } #else static int bar(int *c, int b, CHAR a) { return (int)a + b + *c; } #endif void main(void) { CHAR a = 'a'; int b = 236; int res; #ifdef FOO res = foo(a, b, &b); _nop_(); #else res = bar(&b, b, a); #endif _nop_(); } #endif //2、指針 #ifdef FOO LONG foo(int *a, int *b) { return *(int xdata *)a * *(int xdata *)b; } #else LONG bar(int xdata *a, int xdata *b) { return *a * *b; } #endif void main(void) { int xdata a = 233; int xdata b = 687; LONG res; _nop_(); #ifdef FOO res = foo(&a, &b); #else res = bar(&a, &b); #endif _nop_(); } #endif //3、傳遞位參數(shù) #ifdef FOO int foo(CHAR a, int b, int *c, bit d) { return d ? (int)a + b + *c : 0; } #else int bar(bit d, CHAR a, int b, int *c) { return d ? (int)a + b + *c : 0; } #endif void main(void) { CHAR a = 'a'; int b = 236; int res; #ifdef FOO res = foo(a, b, &b, 0); #else res = bar(0, a, b, &b); #endif _nop_(); } #endif //4、傳遞結(jié)構(gòu)的壞處 typedef struct { CHAR e; CHAR f; } STYPE; #ifdef FOO int foo(STYPE a, int b) { return a.e + a.f + b; } #else int bar(CHAR e, CHAR f, int b) { return e + f +b; } #endif void main(void) { int res; STYPE s; s.e = 6; s.f = 23; #ifdef FOO res = foo(s, 436); #else res = bar(s.e, s.f, 436); #endif _nop_(); } #endif //5、返回結(jié)構(gòu)?指針 typedef struct { CHAR e; CHAR f; } STYPE; #ifdef FOO STYPE foo(CHAR a, CHAR b) { STYPE s; s.e = a; s.f = b; return s; } #else STYPE data * bar(CHAR a, CHAR b) { static STYPE s; s.e = a; s.f = b; return &s; } #endif void main(void) { STYPE s; #ifdef FOO s = foo(1,2); #else s = *bar(1,2); #endif _nop_(); } #endif //6、?表達(dá)式和IF ELSE表達(dá)式也有區(qū)別哦。 測(cè)試環(huán)境 KEIL 6.02 。 可以看看生成的CODE&DATA。看來(lái)KEIL對(duì)于我來(lái)說(shuō)還是很陌生啊。 |
|
| 37樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/1/1 21:49:00 發(fā)布:
樓上的C代碼到處都存在陷阱 KEIL里面就非常容易出問(wèn)題。 |
|
| 38樓: | >>參與討論 |
| 作者: satellitew 于 2006/1/2 21:09:00 發(fā)布:
郁悶死我啦 我就對(duì)C51很熟悉呀!到了單位叫我用其他的單片機(jī),其實(shí)用什么單片機(jī)都沒(méi)有什么關(guān)系呀!只要我們的思路正確什么都可以解決呀!但是單位不讓我上網(wǎng),那他就該給我相對(duì)齊全的資料呀!可惜就只給我一個(gè)編譯器,還沒(méi)有使用說(shuō)明,里面的for exsample就兩個(gè)功能不全的程序。一個(gè)星期還要我給他用兩種單片機(jī)。真讓人生氣,要不是春節(jié)將至,早都給飛了。 |
|
| 39樓: | >>參與討論 |
| 作者: fabtai 于 2006/1/3 9:09:00 發(fā)布:
幫助很大 人多力量大 人多力量 忠心感謝大家 |
|
| 40樓: | >>參與討論 |
| 作者: tyw 于 2006/1/3 11:51:00 發(fā)布:
做民品很少用c 匯編效率高多了.84年剛開(kāi)始玩單片機(jī),同事之間相互交流的就是大家討論的東東,現(xiàn)在單片機(jī)便宜了,好象沒(méi)有必要再為省幾個(gè)字節(jié)去攪腦筋了,一般程序兜通算數(shù),簡(jiǎn)化硬件,降低成本才是真正需要攪腦筋的了,這直接關(guān)系到產(chǎn)品的市場(chǎng)競(jìng)爭(zhēng)力. |
|
| 41樓: | >>參與討論 |
| 作者: piter_tan 于 2006/1/3 14:18:00 發(fā)布:
又可以學(xué)到新的東東啦 |
|
| 42樓: | >>參與討論 |
| 作者: jackf125 于 2006/1/4 21:28:00 發(fā)布:
---結(jié)構(gòu)化編程思維寫(xiě)出嚴(yán)謹(jǐn)?shù)膮R編程序 匯編的思維寫(xiě)出簡(jiǎn)潔的C程序 ----不贊同 ----結(jié)構(gòu)化編程思維寫(xiě)出嚴(yán)謹(jǐn)?shù)膮R編程序 |
|
| 43樓: | >>參與討論 |
| 作者: fang8_2 于 2006/1/9 20:00:00 發(fā)布:
我的看法 再現(xiàn)如今硬件如此發(fā)達(dá),也許在通常的應(yīng)用場(chǎng)合,這點(diǎn)區(qū)別可以忽略,真正應(yīng)該在意的是軟件整體的設(shè)計(jì)思路。 |
|
| 44樓: | >>參與討論 |
| 作者: yth0 于 2006/1/18 13:36:00 發(fā)布:
學(xué)習(xí)! |
|
| 45樓: | >>參與討論 |
| 作者: 圣域天子 于 2006/1/23 12:23:00 發(fā)布:
看到這里我想請(qǐng)教一下liutianbao i++ / i-- 應(yīng)該是不一樣的效率吧 可以匯編出的代碼是一樣的, 但是我好象記得計(jì)算機(jī)實(shí)際上是沒(méi)有減法的, 所謂的減法乘法除法其實(shí)都是由加法實(shí)現(xiàn)的. 所以我想i--的效率應(yīng)該比i++差一點(diǎn)吧. 我不了解匯編, 隨便問(wèn)問(wèn). |
|
| 46樓: | >>參與討論 |
| 作者: 艾森豪威爾 于 2006/1/23 15:59:00 發(fā)布:
呵呵,樓上的又給轉(zhuǎn)回來(lái)了 不過(guò)有道理啊 |
|
| 47樓: | >>參與討論 |
| 作者: craig 于 2006/4/22 9:47:00 發(fā)布:
Great! 不錯(cuò)的思想 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |