ARM引數傳遞規則

2021-06-13 05:00:32 字數 1869 閱讀 3725

原文出處:作者celerychen2009 1.

r0,r1,r2,r3,

在呼叫函式時,用來存放前

4個函式引數和返回值,

r4-r11,r14,

在呼叫函式時必須儲存這些暫存器到堆疊當中。如果函式的引數多於

4個,則多餘引數存放在堆疊當中,即

sp,sp+4,sp+8,…

依次類推。 2.

函式內部通用的入棧出棧**可以為:

stmfd sp!,

// body of asm code

ldmfd sp!,

如果函式並沒有用到那麼多的暫存器,則沒有必要把所有的暫存器入棧。如果函式要呼叫子函式,則

r0,r1,r2,r3,r12,r14

這些暫存器裡面值將被改變,必須小心處理這些暫存器,一種可行的方法是,修改被呼叫子函式的入棧出棧**為:

stmfd sp!,

// body of asm code

ldmfd sp!,

3.如果函式內部變數太多,這時候要考慮使用堆疊,這是入棧出棧**可以為:

stmfd sp!,

sub sp, sp, #stacksize

// body of asm code

add sp, sp, #stacksize

ldmfd sp!,

4.如果函式的引數多於

4個,則函式內部的引數在堆疊中的位置依入棧出棧**而定:

stmfd sp!,

ldr r4,[sp,#36]            //第5

個引數在堆疊中的位置

ldr r5,[sp,#40]            //第6

個引數在堆疊中的位置

// ……

// body of asm code

ldmfd sp!,

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

stacksize equ      var_ix+4

stmfd sp!,

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

add sp, sp, #stacksize

ldmfd sp!,

ARM函式呼叫時引數傳遞規則

之前在學習如何在c語言中嵌入彙編時有了解到c語言之前的引數呼叫是使用暫存器 r0傳遞第乙個引數,r1傳遞到第二個.一直到r3傳遞第四個引數.但是 實際上有時可能傳遞的引數非常多,超過8個,或是引數中有浮點數之類,引數也會超過4個暫存器,對於超出的部份並不使用r4,而是使用堆疊的方式.對於arm體系來...

Mybatis傳遞引數規則

public user selectuser string name,string area 其中 代表第乙個引數,代表第二個引數,依次類推 或者public user selectuser param name string name,param area string area 引數為list型...

Mybatis引數傳遞規則

1.單值傳參 void deleteobject string name mybatis的原始碼中要求單值傳參,取值時通過下標的方式取值 取值的引數名可以隨意 2.多值傳參 void deleteobject string name,string mybatis高版本的原始碼中做了規定,自動將多值轉...