Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2305071
  • 博文数量: 318
  • 博客积分: 8752
  • 博客等级: 中将
  • 技术积分: 4944
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 07:56
文章分类

全部博文(318)

文章存档

2019年(1)

2017年(2)

2016年(12)

2015年(2)

2014年(1)

2013年(17)

2012年(22)

2011年(9)

2010年(37)

2009年(33)

2008年(44)

2007年(43)

2006年(95)

分类: C/C++

2006-09-11 18:30:54

HCS08返回值:函数返回值总是在寄存器中,根据返回值的类型不同,而采用不同的寄存器

返回值类型

寄存器

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()函数

阅读(1281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~