2016-05-16 22 views
1

ich den folgenden ARM-Assembler-Code hat:Armbaugruppe eine Funktion mit Registern als Parameter Aufruf C mit

mov r0, SP 
mov r1, LR 
bl func 

Gibt es eine Möglichkeit, die Funktion func von Aufrufen von C-Code verwendet? etwas wie func(SP, LR)

Danke!

+0

Sure; Verwenden Sie C. Wenn Sie den Assembler-Code nicht wirklich sehen, wenn Sie die C-Syntax verwenden wollen. Ich nehme an, du könntest ein Makro schreiben, das dem 'invoke'-Makro ähnlich ist, das du in MASM bekommst, was dir dann erlauben würde, Dinge wie' invoke func, sp, lr' zu schreiben – Michael

Antwort

2

Hängt davon ab, was genau Sie tun möchten und welchen Compiler Sie verwenden. Mit gcc so etwas wie dies funktionieren könnte:

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

Dies könnte nicht immer geben Sie den genauen Stapelzeiger, though. Wie pro godbolt es die folgende Assemblercode erzeugt:

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

Verwenden Ausgangsregister LR und SP in Variablen zu setzen:

void *lr, *sp; 

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