2016-05-16 89 views
1

寄存器作爲參數的函數,我有以下的ARM彙編代碼:ARM彙編調用帶有用C

mov r0, SP 
mov r1, LR 
bl func 

是否有使用調用C代碼的函數func的一種方式?像func(SP, LR)

謝謝!

+0

不確定;使用C.如果你想使用C語法,如果在編寫彙編代碼時沒有真正看到這一點。我想你可以編寫一個類似於你在MASM中獲得的invoke宏的宏,然後你可以編寫諸如'invoke func,sp,lr' – Michael

回答

2

取決於你想要做什麼和你使用的編譯器。 隨着gcc這樣的事情可以工作:

extern void func(void*, void*); 
void foo() 
{ 
    int dummy[4]; 
    func(&dummy, __builtin_return_address(0)); 
} 

這可能並不總是給你確切的堆棧指針,雖然。按照godbolt它產生以下組件的代碼:

foo(): 
    push {lr} 
    sub  sp, sp, #20 
    mov  r1, lr 
    mov  r0, sp 
    bl  func(void*, void*) 
    add  sp, sp, #20 
    ldr  pc, [sp], #4 
0

使用輸出寄存器放置LRSP在變量:

void *lr, *sp; 

asm ("mov %0, sp" : "=r" (sp)); 
asm ("mov %0, lr" : "=r" (lr)); 
func(lr, sp);