HC08 C语言程序设计(5)

HCS08返回值:函数返回值总是在寄存器中,根据返回值的类型不同,而采用不同的寄存器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

返回值类型

寄存器

char (signed unsigned)

A

int (signed unsigned)

H:X

pointers/arrays(指针/数组)

H:X

function pointers(函数指针)

H:X

如果返回值的长度超过2字节,则在H:X存放返回值的地址。

例如:写一段C语言源程序,然后把它编译为汇编语言,观察调用规则

#include /* 为了包含中断允许宏定义*/

#include

unsigned char r;

unsigned char f1(unsigned char v1,unsigned char v2,unsigned char v3,unsigned char v4) {

    v1+=1;

    v2+=1;

    v3+=1;

    v4+=1;

    return(v4);

}

void f0(void) {

       r=f1(4,9,6,3);

   }

void main(void) {

  EnableInterrupts; /*中断允许 */

              f0();

  for(;;) {

    __RESET_WATCHDOG(); /* 喂狗 */

  } 

}

C语言源程序中f0函数调用f1函数,传递参数并有返回值

函数f1编译后的汇编语言

PSHA       ; 有参数用XA传递,入栈保存防止破坏

PSHX

    TSX         ; X=SP+1

    INC   5,X  ; v1+=1,参数v1sp+6

    INC   4,X  ; v2+=1; 参数v2sp+5

    INC   1,X  ; v3+=1; 参数v3A中,被本函数入栈

   INC   ,X   ; v4+=1; 参数v4X中,被本函数入栈

    LDA   ,X   ; return(v4);返回值在A

    AIS   #2   ; 调整堆栈指针,指向返回地址

    RTS   ; 返回f0函数

函数f0编译后的汇编语言

    LDA   #4

    PSHA      ; 参数v1入栈

    LDA   #9

    PSHA      ; 参数v2入栈

    LDA   #6  ; 参数v3A传递

    LDX   #3  ; 参数v4X传递

    BSR   f1  ; 调用函数f1

    AIS   #2  ; 清除传递的参数

    STA   r   ; 保存返回值

    RTS       ; 返回main函数

 

Main函数编译后的汇编语言

CLI  

BSR   f0

L3:    

STA   _COPCTL

BRA   L3

只要遵循以上调用规则,就可以实现用C函数和汇编函数的相互调用。调用时使用对方定义的函数名。

16.2.5启动代码

在启动main函数之前HCS08 C 语言会自动运行一段启动代码,进行硬件初始化和建立C语言的运行环境。起动代码一般由编译器自动生成,也可以由用户自写的启动代码替代自动生成的启动代码。启动代码的名字为start08.c,它的主要工作是:

l         禁止中断

l         ROM到RAM复制并初始化数据

l         未初始化的数据区域清零

l         为堆栈分配并初始化堆栈

l         如果用到堆,创建并初始化堆

l         允许中断

l         调用main()函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值