有所追求
分类:
2009-01-11 19:29:15
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 ; 有参数用X、A传递,入栈保存防止破坏
PSHX
TSX ; X=SP+1
INC 5,X ; v1+=1,参数v1在sp+6处
INC 4,X ; v2+=1; 参数v2在sp+5处
INC 1,X ; v3+=1; 参数v3在A中,被本函数入栈
INC ,X ; v4+=1; 参数v4在X中,被本函数入栈
LDA ,X ; return(v4);返回值在A中
AIS #2 ; 调整堆栈指针,指向返回地址
RTS ; 返回f0函数
函数f0编译后的汇编语言
LDA #4
PSHA ; 参数v1入栈
LDA #9
PSHA ; 参数v2入栈
LDA #6 ; 参数v3用A传递
LDX #3 ; 参数v4用X传递
BSR f1 ; 调用函数f1
AIS #2 ; 清除传递的参数
STA r ; 保存返回值
RTS ; 返回main函数
Main函数编译后的汇编语言
CLI
BSR f0
L3:
STA _COPCTL
BRA L3
只要遵循以上调用规则,就可以实现用C函数和汇编函数的相互调用。调用时使用对方定义的函数名。
在启动main函数之前HCS08 C 语言会自动运行一段启动代码,进行硬件初始化和建立C语言的运行环境。起动代码一般由编译器自动生成,也可以由用户自写的启动代码替代自动生成的启动代码。启动代码的名字为start08.c,它的主要工作是:
l 禁止中断
l 从ROM到RAM复制并初始化数据
l 未初始化的数据区域清零
l 为堆栈分配并初始化堆栈
l 如果用到堆,创建并初始化堆
l 允许中断
l 调用main()函数