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

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
匯編的思維寫(xiě)出簡(jiǎn)潔的C程序
  上學(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
很好的思想
思想體現(xiàn)于點(diǎn)滴間

3樓: >>參與討論
isoar
很多時(shí)候是要用i的尤其是順序使用時(shí)
 
4樓: >>參與討論
stoneymumu
思路不錯(cuò)
善于思考阿,沒(méi)想過(guò)這個(gè)問(wèn)題


5樓: >>參與討論
yuntian
只有熟悉匯編指令的人才能寫(xiě)出精簡(jiǎn)的c程序
 
6樓: >>參與討論
ccelec

應(yīng)該說(shuō)了解編譯過(guò)程,才能寫(xiě)出效率高的C代碼。但還有個(gè)事實(shí)是:不同的編譯器對(duì)同一句代碼的編譯方法是不同的。

7樓: >>參與討論
foxqiu
經(jīng)驗(yàn)啊,多學(xué)習(xí)。
 
8樓: >>參與討論
fccastle
嗯。
可惜沒(méi)怎么學(xué)過(guò)匯編!

9樓: >>參與討論
forbbs21ic
多看看廠商的應(yīng)用指南
這類(lèi)技巧很多的,不過(guò)優(yōu)化程序的關(guān)鍵還是算法,技巧到底只是技巧。

10樓: >>參與討論
yuxing276
是很好的經(jīng)驗(yàn)啊,又學(xué)到了些東西!
是很好的經(jīng)驗(yàn)啊,又學(xué)到了些東西。≈x謝版主。。∫袰寫(xiě)好是要從點(diǎn)滴做起!

11樓: >>參與討論
drq1997
呵呵,又長(zhǎng)知識(shí)了。
 
12樓: >>參與討論
liutianbao
keil c里面i的順序好像沒(méi)什么關(guān)系吧
以前試過(guò)

for(i=100;i>0;i--);

在keil里看反匯編后的程序并不是樓主所寫(xiě)的那樣,,

是不是要什么優(yōu)化設(shè)置?


13樓: >>參與討論
newfree
這個(gè)……是不是向面向?qū)ο蟮木幊烫魬?zhàn)阿哈哈。
我覺(jué)得,如果不是實(shí)時(shí)性能要求非常高的情況下。
寫(xiě)些自己舒服的程序,更加好。。。

實(shí)時(shí)性能要多高才算高?我想100us以下就算高了。
不知道大家怎么認(rèn)為。

14樓: >>參與討論
gipsyer
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
re
在keil C中
如果i為int型, 則i++和i--在效率上沒(méi)什么區(qū)別
如果i為CHAR型, 則i--比i++匯編后簡(jiǎn)潔的多

以前是我弄錯(cuò)了, 剛才再試了一下。。。。。。。



16樓: >>參與討論
bolofeng
遞增和遞減 這個(gè)東西說(shuō)爛說(shuō)透了!
 
17樓: >>參與討論
hotpower
肯定有區(qū)別
 
18樓: >>參與討論
ever820120
只得學(xué)習(xí),我從匯編入門(mén)的
好像大家學(xué)C單片機(jī)都是C-51的多啊

19樓: >>參與討論
northerns
又長(zhǎng)知識(shí)啦
 
20樓: >>參與討論
鑲藍(lán)
學(xué)到了不少東西啊.
 
21樓: >>參與討論
pheavecn
樓主的想法是想當(dāng)然的。
 
22樓: >>參與討論
liht
恩!我也要學(xué)學(xué)C語(yǔ)言
 
23樓: >>參與討論
linwei1234
我也是前兩個(gè)月發(fā)現(xiàn)這問(wèn)題的!真的可以壓縮很多也!
 
24樓: >>參與討論
yo.hawk
個(gè)人認(rèn)為,匯編好用些窩!
個(gè)人認(rèn)為,匯編好用些窩!雖然有時(shí)候比較繁瑣,但用起來(lái)思路比較清晰,可以清楚地知道程序的走向!

不過(guò),要做好注釋,不然可能過(guò)一段時(shí)間后,自己寫(xiě)的也有可能忘記怎么來(lái)的了!
(無(wú)知之言,有不對(duì)的地方請(qǐng)各位多多指點(diǎn)啊!)

25樓: >>參與討論
z_no1
一個(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
我覺(jué)得這樣更接近匯編思維
do{

}while(--i);

27樓: >>參與討論
cf100
簡(jiǎn)單或簡(jiǎn)化也不見(jiàn)得都好
最簡(jiǎn)單是這樣:

while(--i)
  ;

但我們寫(xiě)程序也要注意可維護(hù)性,如果一味強(qiáng)求效率,也不會(huì)寫(xiě)出什么好程序來(lái)。

28樓: >>參與討論
啊哈
老貼長(zhǎng)談了,去看看hotpower的貼吧
 
29樓: >>參與討論
high
不是很值得鼓勵(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
很好的思路
 
31樓: >>參與討論
water2005
hehe
有意思

32樓: >>參與討論
eeproom
值得商酌
   在下以為,程序的代碼是否高效,簡(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樓: >>參與討論
小馬
說(shuō)到底就是指令集支持的問(wèn)題
判斷0比判斷一個(gè)非零數(shù)容易,很多指令集都有直接自減并判斷(非)零跳轉(zhuǎn)的指令,就是為了優(yōu)化循環(huán)。

34樓: >>參與討論
qin000000
MPU發(fā)展得太快了
以現(xiàn)在的MPU發(fā)展速度,這些細(xì)節(jié)問(wèn)題不在需要多花心思了!速度慢了用1T的單片機(jī),code,data不夠的用大容量單片機(jī)就OK了。當(dāng)然能寫(xiě)出高效代碼最好,也是一種好習(xí)慣

35樓: >>參與討論
yzy1102
很好,只是課本上沒(méi)這么做過(guò)示范
看來(lái),出書(shū)的人應(yīng)該好好想想,不能總拿陳舊單一的東西糊弄我們.

36樓: >>參與討論
cgha
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í)所
樓上的C代碼到處都存在陷阱
KEIL里面就非常容易出問(wèn)題。

38樓: >>參與討論
satellitew
郁悶死我啦
     我就對(duì)C51很熟悉呀!到了單位叫我用其他的單片機(jī),其實(shí)用什么單片機(jī)都沒(méi)有什么關(guān)系呀!只要我們的思路正確什么都可以解決呀!但是單位不讓我上網(wǎng),那他就該給我相對(duì)齊全的資料呀!可惜就只給我一個(gè)編譯器,還沒(méi)有使用說(shuō)明,里面的for exsample就兩個(gè)功能不全的程序。一個(gè)星期還要我給他用兩種單片機(jī)。真讓人生氣,要不是春節(jié)將至,早都給飛了。 

39樓: >>參與討論
fabtai
幫助很大 人多力量大
人多力量  忠心感謝大家

40樓: >>參與討論
tyw
做民品很少用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
又可以學(xué)到新的東東啦
 
42樓: >>參與討論
jackf125
---結(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
我的看法
再現(xiàn)如今硬件如此發(fā)達(dá),也許在通常的應(yīng)用場(chǎng)合,這點(diǎn)區(qū)別可以忽略,真正應(yīng)該在意的是軟件整體的設(shè)計(jì)思路。

44樓: >>參與討論
yth0
學(xué)習(xí)!
 
45樓: >>參與討論
圣域天子
看到這里我想請(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樓: >>參與討論
艾森豪威爾
呵呵,樓上的又給轉(zhuǎn)回來(lái)了
不過(guò)有道理啊

47樓: >>參與討論
craig
Great!
不錯(cuò)的思想

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
單片機(jī)課程設(shè)計(jì)
如何避免數(shù)碼管發(fā)白?動(dòng)態(tài)掃描方式電流要多大合適?
LCD液顯求助
求51單片機(jī)開(kāi)發(fā)板原理圖和PCB文件
哪位大哥有MOTOROLA單片機(jī)的C語(yǔ)言資料嗎?小弟急用!
免費(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)