每一次函数调用会创建一个如图所示的堆栈结构
一个调用者函数传递给被调用函数的参数按照从右到左的顺序传递的,换句话说就
是除了最左边的两个参数用寄存器传递外,其余参数用堆栈传递,并按从右到左的顺
序入栈。若最左边的两个参数属于结构或联合类型,那么它们也用堆栈传递。函数的返
回结果根据其类型存放在 R12 或 R13:R12 寄存器对,若返回结果属于结构或联合类型,
那么 R12 中存放的是指向返回结果的指针。
1.3 中断函数
C 语言编译器编译中断函数时会自动保护所有用到的寄存器(包括 R12-R15 在
内),状态寄存器 SR 的保护是中断处理过程自动完成的。中断函数中用到的任何寄存
器都会用 PUSH Rxx 指令保护,中断服务结束用后 POP Rxx 指令恢复;RETI 指令会自
动恢复状态寄存器 SR 和从中断返回。
2 对汇编语言函数的约定
一个能被 C 语言函数调用的汇编语言函数必须做到以下几点:
(1)符合 C 语言编译器的参数传递规则。
(2)具有 PUBLIC 入口标号。
(3)对 C 语言调用者函数声明为外部函数,并且允许参数类型检查和提升(可
选)。
2.1 局部存储分配
如果汇编语言函数需要局部存储空间,有两种分配方法:
(1)分配在硬件堆栈
(2)分配在静态空间,但是函数不能重入。
2.2 中断函数
因为中断可能发生在程序执行的任何期间,所以调用约定并不适用于中断函数。因
除最左边的两个
参数外,其余参
数入栈传递
中断返回地址
被保护的寄存器
高地址
堆栈指针
堆栈
低地址