ARM参数传递规则

摘要:
1.当调用函数时,r0、r1、r2、r3用于存储前四个函数参数和返回值r4-r11、r14。调用函数时,这些寄存器必须保存到堆栈中。如果函数有4个以上的参数,则冗余参数将存储在堆栈中,即sp、sp+4、sp+8…等等。2.函数内部的常见堆栈输入/输出代码可以是:STMFDsp!,{r4-r11,lr}//ASMCodeLDMFDsp!体!,{r4-r11,个人电脑

1.       r0,r1,r2,r3,在调用函数时,用来存放前4个函数参数和返回值,r4-r11,r14,在调用函数时必须保存这些寄存器到堆栈当中。如果函数的参数多于4个,则多余参数存放在堆栈当中,即sp,sp+4,sp+8,…依次类推。

 

2.       函数内部通用的入栈出栈代码可以为:

STMFD sp!,{r4-r11,lr}

// body of ASM code

LDMFD sp!,{r4-r11,pc}

如果函数并没有用到那么多的寄存器,则没有必要把所有的寄存器入栈。如果函数要调用子函数,则r0,r1,r2,r3,r12,r14这些寄存器里面值将被改变,必须小心处理这些寄存器,一种可行的方法是,修改被调用子函数的入栈出栈代码为:

STMFD sp!,{r0-r12,lr}

// body of ASM code

LDMFD sp!,{r0-r12,pc}

 

3.       如果函数内部变量太多,这时候要考虑使用堆栈,这是入栈出栈代码可以为:

STMFD sp!,{r4-r11,lr}

SUB sp, sp, #stacksize

// body of ASM code

ADDsp, sp, #stacksize

LDMFD sp!,{r4-r11,pc}

 

4.       如果函数的参数多于4个,则函数内部的参数在堆栈中的位置依入栈出栈代码而定:

STMFD sp!,{r4-r11,lr}

LDR r4,[sp,#36]            //5个参数在堆栈中的位置

LDRr5,[sp,#40]            //6个参数在堆栈中的位置

// ……

// body of ASM code

LDMFD sp!,{r4-r11,pc}

 

5.       如果第5个参数是要传递地址,函数调用完以后要使用之前传进去的第5个参数,则要预留更多的堆栈空间。可参考下面代码:

//other C code

     butterfly32a_16(x2m[0], x2m[1], *ptr1--, tmpSineTable8m, &rx, &ix);

    //other C code

     这个C函数总共有6个参数,在调用之前要预留4个堆栈单元。代码如下:

sp_0      EQU      0

sp_1      EQU      sp_0+ 4

var_rx    EQU      sp_1 + 4

var_ix    EQU      var_rx+4

stacksizeEQU      var_ix+4

STMFD sp!,{r4-r11,lr}

SUB sp, sp, #stacksize

// other ASM code

 

ADD        r4, sp, #var_rx             

ADD        r5, sp,# var_ix

STR         r4, [sp,#sp_0]

STR         r5, [sp,#sp_1]

// assume the r0,r1,r2,r3 are prepared well

BL           butterfly32a_16

 

LDR        r4, [sp, #var_rx]            //r4 is the value of rx

LDR        r5, [sp, #var_ix]            //r5 is the value of ix

 

// other ASM code

ADDsp, sp, #stacksize

LDMFD sp!,{r4-r11,pc}

免责声明:文章转载自《ARM参数传递规则》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)使用DUPLICATE 方式创建ORACLE 11G DG备库环境下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VC终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解

VC-终止线程,ExitThread函数,Te r m i n a t e T h r e a d函数,撤消线程,详解 6.5 终止线程的运行 若要终止线程的运行,可以使用下面的方法: •  线程函数返回(最好使用这种方法)。 •  通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。 •  同一个进程或另一个进程中的...

打印堆栈信息

#ifdef OS_IBM sprintf(szCmd,"%s %d >>%s", "procstack", getpid(),abnTraceFileName); system(szCmd);#else sprintf(szCmd,"%s %d >>%s", "pstack", getpid(),abnTraceFileName)...

堆栈信息分析

一、堆栈信息解读 2013-01-13 11:02:31 Full thread dump Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing): "[ThreadPool Manager] - Idle Thread" daemon prio=6 tid=0x069a3400 nid=0x84...

到底是什么原因导致我的进程崩溃?

当你你有1000个w3wp.exe文件在eventviewer中意外停止,或者您的进程以某种奇怪的未定义方式退出,您不知道原因。当一个进程崩溃或退出时,将触发一个称为EPR(Exit process)的特殊事件,因此使用类似于windbg.exe文件我们可以附加到进程中,等待epr被抛出,然后进行内存转储。安装windows调试工具时,会得到一个名为adp...

ucosiii任务管理相关知识

只要学习和理解:任务状态 任务堆栈 任务控制块 任务就绪表 任务调度和切换 关于任务状态: 任务堆栈是任务的重要部分,堆栈是在RAM中按照“先进先出(FIFO)”的原则组织的一块连续的内存空间。为了满足任务切换和相应中断时保存CPU寄存器中的内容及任务调用其他函数时的需要,每个任务都应该有自己的堆栈。 1、任务堆栈的创建: UCOSIII中任务堆栈的创建...

dump解析入门-用VS解析dump文件进行排障

突然有一天部署在服务器的一个应用挂掉了,没办法只能进入服务器打开 【事件查看器】查看下,好不容易找到了打开后一脸懵逼 事件查看器查到的内容根本对我们排障没有任何作用。 在这个时候如果有对应的dump文件就能派上用场了, 只要有dump文件就能查到应用挂掉那刻的一手情报,可能有人认为分析dump文件是非常难的事情, 但是最近不断有新的dump分析工具出来...