SDCC 函式的輸入參數

目前已可以在一個專案中,同時包括C和組合語言兩個源碼,還想進一步,希望能將C語言的輸入參數,可以用組合語言的方式來表現或傳遞,或者倒過來,可以利用組合語言,來呼叫C函式,必且將必要的參數,傳到C函式之中。

 #include "at89x52.h"

__sfr __at (0x91) P1M1;
__sfr __at (0x92) P1M0;
__sfr __at (0x90) LED;

 //*********************************************************

// delay program
//*********************************************************
void DelaySub(unsigned int delayno)
{
    while (delayno!=0) delayno--;
}

//*********************************************************

// main program
//*********************************************************
void main (void)
{
    P1M1=0; P1M0=0xFF; /* P1 set as Output */
    while (1) { LED=1; DelaySub(0xffff); LED=0; DelaySub(0xffff); }
}

這個程式一樣可以用來讓LED閃動,但閃動的頻率是可以調整的,呼叫DelaySub時,同時傳入常數0XFFFF,傳入不同的常數,(如0X8000)將改變LED的閃動頻率。

現在比較好奇的是,C編譯後的DelaySub組合語言,將呈現什麼面貌,是否有可供我們參考之處。

; -----------------------------------------

; function DelaySub
; -----------------------------------------
_DelaySub:
ar7 = 0x07
ar6 = 0x06
ar5 = 0x05
ar4 = 0x04
ar3 = 0x03
ar2 = 0x02
ar1 = 0x01
ar0 = 0x00
     mov     r6,dpl
     mov     r7,dph
; main.c:12: while (delayno!=0) delayno--;
00101$:
     mov     a,r6
     orl       a,r7
     jz        00104$
     dec     r6
     cjne    r6,#0xFF,00114$
     dec     r7
00114$:
     sjmp  00101$
00104$:
     ret

像作者這類玩組合語言的科技宅男,一眼就可以看出來,輸入的資料放在DPLDPH這兩個暫存器中,而這兩個暫存器合而為一,正好就是8051唯一一個16位元的暫存器DPTR,所以可以很高興的宣佈,SDCC C51,以DPTR當作16位元的輸入參數暫存器使用。並且如果沒有猜錯,8位元的參數數輸入,應該是使用DPL這個暫存器。

寫程式看似很難,其實像C51這類的編譯器,其編譯手法,自有其一定的邏輯性,了解這一點,寫程式就可以觸類旁通,而且會變得比較有趣。

 

文章標籤
全站熱搜
創作者介紹
創作者 單晶片玩人 的頭像
單晶片玩人

單晶片玩人(uPplayer)的部落格

單晶片玩人 發表在 痞客邦 留言(0) 人氣(61)