displayRegistersValue(int registers[number_of_registers])
这是一个数组而不是结构,它作为指向某个东西的指针传递,而不是作为一长串项目。顺便说一句,结构也是如此。
通常最简单的方法是在 asm 中构造一个 C 函数来执行您想要的操作,然后查看编译器生成的内容,然后从那里开始(使用 ABI 文档进行确认等)。
#define NUMREGS 13
void displayRegistersValue(unsigned int registers[NUMREGS]);
void outer ( void )
{
unsigned int regs[NUMREGS];
displayRegistersValue(regs);
}
> arm-none-linux-gnueabi-gcc -O2 -c fun.c -o fun.o
> arm-none-linux-gnueabi-objdump -D fun.o
fun.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <outer>:
0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
4: e24dd03c sub sp, sp, #60 ; 0x3c
8: e28d0004 add r0, sp, #4
c: ebfffffe bl 0 <displayRegistersValue>
10: e28dd03c add sp, sp, #60 ; 0x3c
14: e49df004 pop {pc} ; (ldr pc, [sp], #4)
您将需要做类似的事情,通过添加堆栈指针在堆栈上腾出空间,保存 lr 这样您就不会使用分支链接将其丢弃,将寄存器复制到该内存(堆栈)点 r0 到开头要传递的内存/数组,然后调用函数(r0 是传递给函数的第一个也是唯一的参数)。
push {lr}
mov lr,sp
stmdb sp!,{r0-r12}
mov r0,lr
bl displayRegistersValue
add sp,sp,#52
pop {lr}