SDCC C51函式的輸入參數
目前已可以在一個專案中,同時包括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
像作者這類玩組合語言的科技宅男,一眼就可以看出來,輸入的資料放在DPL和DPH這兩個暫存器中,而這兩個暫存器合而為一,正好就是8051唯一一個16位元的暫存器DPTR,所以可以很高興的宣佈,SDCC C51,以DPTR當作16位元的輸入參數暫存器使用。並且如果沒有猜錯,8位元的參數數輸入,應該是使用DPL這個暫存器。
寫程式看似很難,其實像C51這類的編譯器,其編譯手法,自有其一定的邏輯性,了解這一點,寫程式就可以觸類旁通,而且會變得比較有趣。
