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

一如先前的預測,回傳值由DPHDPL,即是16進位暫存器DPTR所組成。

最後再來看看由編譯器編成的_inverse_input組合語言程式,作者必須承認,即使以單純的組合語言寫這個函式,可能都無法如C51所編成的簡單,有效率。這也同呼應了作者先前的主張,要學組合語言,但不要寫組合語言程式。

 

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

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

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