没有合适的资源?快使用搜索试试~ 我知道了~
首页arm汇编语言调用含参数的C函数及有关实例
资源详情
资源评论
资源推荐

arm汇编语言调用含参数的汇编语言调用含参数的C函数及有关实例函数及有关实例
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb
Procedure CallStandard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回
不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存
器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。
我们先讨论一下形参个数为4的情况.
实例1:
test_asm_args.asm
//--------------------------------------------------------------------------------
IMPORT test_c_args;声明test_c_args函数
AREA TEST_ASM, CODE, READONLY
EXPORT test_asm_args
test_asm_args
STR lr, [sp, #-4]!;保存当前lr
ldr r0,=0x10 ;参数 1
ldr r1,=0x20 ;参数 2
ldr r2,=0x30 ;参数 3
ldr r3,=0x40 ;参数 4
bl test_c_args ;调用C函数
LDR pc, [sp], #4 ;将lr装进pc(返回main函数)
END
test_c_args.c
//--------------------------------------------------------------------------------
void test_c_args(int a,int b,int c,int d)
{
printk("test_c_args:");
printk("%0x %0x %0x %0x",a,b,c,d);
}
main.c
//--------------------------------------------------------------------------------
int main()
{
test_asm_args();
for(;;);
}
程序从main函数开始执行,main调用了test_asm_args,test_asm_args调用了test_c_args,最后从test_asm_args返回main。代
码分别使用了汇编和C定义了两个函数,test_asm_args 和
test_c_args,test_asm_args调用了test_c_args,其参数的传递方式就是向R0~R3分别写入参数值,之后使用bl语句














安全验证
文档复制为VIP权益,开通VIP直接复制

评论0