ARM汇编子程序参数传递

ATPCS规则体现了一种模块化设计的思想,其基本内容是C模块(函数)
和汇编模块(函数)相互调用的一套规则(C51中也有类似的一套规则)。
我感觉比在线汇编功能强大(不用有很多忌讳),条理更清楚(很简单的几条
规则)。

规则内容

一.被调用模块的寄存器使用
     1.调用模块和被调用模块通过R0-R3传递参数,因此参数少于四个时可以随意
         使用剩余的而不必保存和恢复
     2.使用R4-R11之前一定要先在堆栈中保存起来,退出时再恢复
     3.可以使用堆栈,但一定要保证堆栈指针(R13)在进入时和退出时相等
     4.R14用于保存返回地址,使用前一定要备份
二.被调用模块的堆栈使用
     ATPCS规则规定堆栈是满递减(fD)型的,因此使用STMFD/LDMFD指令操作,
     注意保证进入和退出时堆栈指针相等
三.参数传递
     当少于四个时,按从左到右的顺序依次放在r0,r1,r2,r3中;
     当多于四个时,前四个放在r0,r1,r2,r3中,剩余的放在堆栈中,最后一个
     参数先入栈,第五个参数最后入栈,即从右到左入栈
四.返回值
     结果为32位时,通过R0返回
     结果为64位时,r0放低32位,r1放高32位

如果不涉及Thumb指令集,全部规则就这几条,
比较有条理,很清楚,我举两个例子:

1.C主程序调用汇编子程序

C主程序:

#define UINT unsigned int
extern UINT add_six(UINT a,UINT b,UINT c,UINT d,UINT e,UINT f);
int main(void)
{
       add(1,2,3,4,5,6);
       return 0;
}

汇编子程序:

       area cdo,code,readonly   ;段名cdo,代码段
       code32                   ;ARM指令
add_six
       global add_six           ;add_six是全局标号
       stmfd r13,{r4,r5}             ;将r4,r5压入堆栈,但R13不变
       ldr r4,[r13]               ;将第五个参数从堆栈中提出
       ldr r5,[r13,#4]         ;将第六个参数从堆栈中提出
       add r0,r0,r1
       add r0,r0,r2
       add r0,r0,r3
       add r0,r0,r4
       add r0,r0,r5               ;32位结果保存在R0中
       sub r3,r13,#8
       ldmfd r3,{r4,r5}               ;从堆栈中恢复r4,r5
       mov r15,r14                 ;返回主程序
       end

2.汇编主程序调用C子程序

汇编主程序

       area main,code,readonly ;代码段
       entry                     ;声明程序入口
       code32                   ;32位ARM指令
       extern add_six           ;声明标号add_six
start
       mov r13,#0xa000          ;初始化堆栈指针
       mov r0,#1
       mov r1,#2
       mov r2,#3
       mov r3,#4                      ;前四个参数通过寄存器传递
       mov r4,$5
       mov r5,#6
       stmfd r13!,[r4,r5]           ;后两个参数通过堆栈传递
       bl add_six                 
       mov r1,r0                      ;调用后结果将放在r0中
       end


C子程序:
#define UINT unsigned int
UINT add_six(UINT  a,UINT b,UINT c,UINT d,UINT e,UINT f)
{
       return a+b+c+d+e+f;
}

以上代码均在ARM ADS 1.2中调试通过。

       总结一下,在线汇编比较简洁,但功能有限,而且规则有点零碎;
ATPCS功能强大而且条理清楚,但需要单独在开一个模块;

写代码时可以根据需要自由选择.


from: http://blog.sina.com.cn/s/blog_4b61ebcd010005rd.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值