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

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | 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

Keil c函數(shù)參數(shù)傳遞的討論

作者:yanfengzhu 欄目:單片機(jī)
Keil c函數(shù)參數(shù)傳遞的討論
引起我注意Keil c函數(shù)參數(shù)傳遞的是在一個(gè)偶然的機(jī)會(huì),我在寫一個(gè)函數(shù)的時(shí)候:如下

write_byte(uLONG addr, uCHAR dat)

{

      …

}

我原本以為addr會(huì)通過R4—R7來傳遞,而dat則通過R3傳遞的,在調(diào)試的時(shí)候卻發(fā)現(xiàn)dat是通過固定地址儲(chǔ)存區(qū)傳遞的。因此引發(fā)了我想知道它到底是怎樣傳遞參數(shù)的。

因?yàn)榇蠹叶贾,keil c的參數(shù)傳遞規(guī)則

參數(shù)    CHAR,            int,             LONG,     generic

數(shù)目  1-byte pointer     2-byte pointer      float      pointer

1       R7             R6 & R7         R4-R7     R1-R3

2       R5             R4 & R5

3       R3             R2 & R3



我原本以為三個(gè)int參數(shù)都通過寄存器能傳遞,一個(gè)uLONG和一個(gè)uCHAR應(yīng)該也可以吧,真是有點(diǎn)不明白。如果寫為如下

write_byte(uLONG addr, uCHAR * dat)

{

      …

}

即一個(gè)uLONG參數(shù)和一個(gè)指針參數(shù)則都能通過寄存器傳遞。

導(dǎo)致上面第二個(gè)uCHAR參數(shù)不通過寄存器傳遞的原因大概是因?yàn)榈诙䝼(gè)uCHAR型參數(shù)一定要通過R5來傳遞吧,而第一個(gè)uLONG型參數(shù)正好用了R5,所以dat就只能通過固定地址的存儲(chǔ)區(qū)來傳遞了。

為此我就想測試一下如果不通過寄存器來傳遞參數(shù)或通過模擬棧來傳遞參數(shù)時(shí)參數(shù)的傳遞情況會(huì)是怎樣的。



第一個(gè)例子如下,通過寄存器傳遞參數(shù),代碼共101字節(jié)。

void delay(uLONG dlyh, uint dlyl)

{

        while(dlyh--);

       while(dlyl--);

}



void main(void)

{

        delay(0x100, 0x50);

       while(1);

}

匯編代碼如下,

       RSEG  ?PR?_delay?TEST_PARA

_delay:

       USING  0

                     ; SOURCE LINE # 6

       MOV         dlyh?040+03H,R7            ;把從寄存器R4—R7傳來的第一個(gè)參數(shù)

       MOV         dlyh?040+02H,R6         ;存入固定地址。

       MOV         dlyh?040+01H,R5         ;(有時(shí)真覺得這動(dòng)作啥冒)

       MOV         dlyh?040,R4

; {

                     ; SOURCE LINE # 7

?C0001:

;         while(dlyh--);

                     ; SOURCE LINE # 8

       MOV         R0,#LOW (dlyh?040)

       MOV         A,#0FFH

       LCALL       ?C?LLDIIDATA8

       MOV         A,R4

       ORL         A,R5

       ORL         A,R6

       ORL         A,R7

       JNZ         ?C0001

?C0003:

;        while(dlyl--);

                     ; SOURCE LINE # 9

       MOV         A,dlyl?041+01H

       DEC         dlyl?041+01H

       MOV         R6,dlyl?041

       JNZ         ?C0009

       DEC         dlyl?041

?C0009:

       ORL         A,R6

       JNZ         ?C0003

; }

                     ; SOURCE LINE # 10

?C0005:

       RET     

; END OF _delay



;

; void main(void)



       RSEG  ?PR?main?TEST_PARA

main:

       USING  0

                     ; SOURCE LINE # 12

; {

                     ; SOURCE LINE # 13

;         delay(0x100, 0x50);

                     ; SOURCE LINE # 14

       MOV         ?_delay?BYTE+04H,#00H                  ;傳遞第二個(gè)參數(shù)

       MOV         ?_delay?BYTE+05H,#050H

       MOV         R7,#00H                                                 ;傳遞第一個(gè)參數(shù)

       MOV         R6,#01H

       MOV         R5,#00H

       MOV         R4,#00H

2樓: >>參與討論
hotpower
好帖...
鉆研的不錯(cuò),我總感覺LONG類型等最好用指針傳遞.

MCU最好少用LONG類型.

3樓: >>參與討論
brekai
好想法.
強(qiáng)頂

4樓: >>參與討論
yanfengzhu
謝謝兩位!這幾天沒什么時(shí)間上網(wǎng)。
 
5樓: >>參與討論
aoshi
建議看下c51的相關(guān)文檔,也許能知道為什么
  

6樓: >>參與討論
chunk
研究的不錯(cuò),但還是不夠精。至少還有兩個(gè)點(diǎn):
(1)通過“指向函數(shù)的指針”調(diào)用該函數(shù)

(2)從“中斷服務(wù)程序”中調(diào)用其它函數(shù)

7樓: >>參與討論
binbinkx
跪求幫助,keilC51
extern unsigned int SumXY(unsigned int X,Y);
extern void Delay(unsigned CHAR T);
void main(void)
{unsigned int a,b,c;
    a=0x5500;
    b=0x00aa;
    while (1)
    {
        Delay(100);
        c=SumXY(a,b);
    }
}
#pragma ASM
        PUBLIC  _SumXY
?PR?_SumXY?FUNCASM    SEGMENT CODE
        RSEG     ?PR?_SumXY?FUNCASM
_SumXY:       
       MOV      A,R7        
       ADD      A,R5      
       MOV      A,R6
       ADDC     A,R4        
       MOV      R6,A       
       RET
#pragma ENDASM

void Delay(unsigned CHAR T)
{unsigned CHAR i;
    for (i=0;i<T;i++)
    {
        for (i=0;i<T;i++) {}
    }
}
編譯后的錯(cuò)誤:
compiling ic.c...
assembling ic.src...
ic.src(64): error A33: CONFLICTING ATTRIBUTES
ic.src(67): error A8: ATTEMPT TO DEFINE AN ALREADY DEFINED LABEL
Target not created

8樓: >>參與討論
chenhu
在程序的開頭加上 #pragma SRC
 
9樓: >>參與討論
ypli
KEIL也要進(jìn)行相應(yīng)的設(shè)置吧!
 
10樓: >>參與討論
liudewei
最保險(xiǎn)就是看看編譯后的匯編代碼
 
11樓: >>參與討論
taoest
各位大哥,都C了,還研究里面的實(shí)現(xiàn)細(xì)節(jié)做什么
各位大哥,都C了,還研究里面的實(shí)現(xiàn)細(xì)節(jié)做什么。
研究有用嗎?
就算研究出來了,某天KEIL換了一個(gè)更高效率的傳法,你又要重新研究過嗎?
還不如老老實(shí)實(shí)地寫C,用C能做好你要做的事情了。

12樓: >>參與討論
narcissa
樓上兄弟趕的慢點(diǎn),咱追不上了
 
13樓: >>參與討論
Denorth00
謝謝,有收獲!
 
14樓: >>參與討論
foxfree520
疑問
不好意思,我每看懂,你能否解釋一下呀?
謝謝

15樓: >>參與討論
yanfengzhu
to foxfree520,不知是哪不明白?
 
16樓: >>參與討論
SHUNQIAO
好貼!
 
17樓: >>參與討論
ketp
-
參數(shù)的順序也是很重要的,象第一個(gè)例子,就可以調(diào)換一下參數(shù)的順序。
還有,用寄存器傳遞參數(shù)才有可能重入,你要是用過small RTOS 就知道這有多重要了。

18樓: >>參與討論
leisureok
頂 以后還要學(xué)習(xí)。。
 
19樓: >>參與討論
zzm503
學(xué)習(xí)緊。。!11111
 
20樓: >>參與討論
qwrrt
行,有價(jià)值
多多努力

21樓: >>參與討論
QWRRT
很有想法
我喜歡

22樓: >>參與討論
wuweikang
通過固定存儲(chǔ)區(qū)傳遞參數(shù)
我比較喜歡通過固定存儲(chǔ)區(qū)傳遞參數(shù),就是定義全局變量。不夠這樣以來代碼不夠靈活。在全局變量比較少的小程序里可以用用。

23樓: >>參與討論
國保
不是很理解,自己先試試看.
 
24樓: >>參與討論
zxpkongjun
希望大家高手幫助
大家好  我是一名研一的學(xué)生,學(xué)的是信號(hào)處理.我現(xiàn)在想接觸單片機(jī),應(yīng)該怎么開始.匯編和C語言我都會(huì),當(dāng)傾向于用C語言,還有Keil C編譯器.我應(yīng)如何下手,是不是可以通過做一個(gè)具體的電路,應(yīng)該選擇那一種單片機(jī).

25樓: >>參與討論
Jaddycui
看看這些也許能找到問題的所在!
參數(shù)傳遞規(guī)則例子:

fun1(int a)                   //a是第一個(gè)參數(shù),在R6,R7中傳遞.

fun2(int b ,int c , int *d)   //b在R6,R7中傳遞;C在R4,R5中傳遞;d在

                              //R1,R2,R3中傳遞.

fun3(LONG e ,LONG f)          //e在R4-R7中傳遞;f不能在寄存器中傳遞,只

                              //能在參數(shù)傳遞段中傳遞.

fun3(float g ,CHAR h)         //g在R4-R7中傳遞;h不能在寄存器中傳遞,只

                              //能在參數(shù)傳遞段中傳遞.



26樓: >>參與討論
martial
有點(diǎn)沒看明白???
第一和第二個(gè)例子都是同一個(gè)C函數(shù),內(nèi)部由什么決定用哪種方式傳遞??

27樓: >>參與討論
ihoooo118
re:Jaddycui
你好!我以前沒用過KEIL C
fun3(LONG e ,LONG f)          //e在R4-R7中傳遞;f不能在寄存器中傳遞,只

                              //能在參數(shù)傳遞段中傳遞
是不是這樣調(diào)就要出錯(cuò)?
參數(shù)傳遞段?是指什么,固定存儲(chǔ)區(qū)嗎?

28樓: >>參與討論
旋風(fēng)羊
收了
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
關(guān)于中文顯示的問題?
問一個(gè)簡單的C51問題
請(qǐng)教單片機(jī)的音樂播放程序該怎么編寫
請(qǐng)教80C196KC的T2溢出中斷!!!
請(qǐng)幫忙推薦一個(gè)雙通道串行10位模數(shù)轉(zhuǎn)換器
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)