【发布时间】:2013-02-12 16:16:25
【问题描述】:
我在这个论坛上阅读了很多主题,并找到了很多关于这个主题的答案。我实现了从我的汇编代码中将 5 个参数传递给 C 函数。为此,我使用了以下说明:
mov r0, #0
mov r1, #1
mov r2, #2
mov r3, #3
mov r4, #4
STR r4, [sp, #-4]!
BL displayRegistersValue
但今天我试图将整个寄存器传递给 C 函数以将它们保存在 C 结构中。我试过这个指令:
STMDB sp!, {registers that i want to save}
我的 C 函数:
displayRegistersValue(int registers[number_of_registers])
char printable = registers[0] + (int)'0'; // Convert in a printable character
print_uart0(&printable);
但是我的显示器不好。那么,如何访问 C 代码中的寄存器呢?
【问题讨论】:
-
在
STMDB之前/之后,您需要mov r0, sp。这会将指向您的“C”例程的指针作为第一个参数传递。那么你的代码应该可以工作了。 -
我不会指望它。您永远不知道编译器想要保存到堆栈中的内容。这个,其他垃圾等等。更安全的是给它自己的地址。不过,我认为 OP 不理解指针,这会妨碍您。
-
编译器会在栈上保留它需要的空间;它不应该覆盖以前的堆栈帧。
sp!表示保存后更新堆栈指针。他似乎为 EABI 使用了正确的堆栈方向。