SDCC C51函式的回傳值
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--;
}
//*********************************************************
// pass input program
//*********************************************************
unsigned int inverse_input(unsigned int delayno)
{
return 0-delayno;
}
//*********************************************************
// main program
//*********************************************************
void main (void)
{
P1M1=0; P1M0=0xFF; /* P1 set as Output */
while (1) { LED=1; DelaySub(inverse_input(1)); LED=0; DelaySub(inverse_input(1)); }
}
此處加了一個新的函式,這個函式以0減去輸入參數,然後以return回傳一個16進位的數值。
unsigned int , void
C語言是一個以由各種函式組成的程式,而每個函式都有其資料型態。像是main函式之前的void,就是一種資料型態,代表不回值任何資料,所以在void型態的函式,在函式結束時,不須以return 回傳數值。相對的inverse_input()這個函式,其資料型態為unsigned int,在函式結束時,就必須回傳一個型態為unsigned int的數值,否則編譯器會發出錯誤訊息。
現在來看看inverse_input()這個函式,編過SDCC C51編譯之後,呈現什麼樣的狀況,其回傳值是由什麼暫存器組成?
; function inverse_input
; -----------------------------------------
_inverse_input:
mov r6,dpl
mov r7,dph
; main.c:20: return 0-delayno;
clr c
clr a
subb a,r6
mov dpl,a
clr a
subb a,r7
mov dph,a
ret
一如先前的預測,回傳值由DPH及DPL,即是16進位暫存器DPTR所組成。
最後再來看看由編譯器編成的_inverse_input組合語言程式,作者必須承認,即使以單純的組合語言寫這個函式,可能都無法如C51所編成的簡單,有效率。這也同呼應了作者先前的主張,要學組合語言,但不要寫組合語言程式。
