gpt4 book ai didi

c - 在 ARM 上将参数从 asm 传递到 C in

转载 作者:行者123 更新时间:2023-12-01 08:59:43 29 4
gpt4 key购买 nike

我在这个论坛上阅读了很多主题,并找到了很多关于这个主题的答案。我实现了从汇编代码向 C 函数传递 5 个参数。为此,我使用了以下说明:

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 代码中访问寄存器?

最佳答案

很确定 ARM 标准只允许 R0-R3 按值传递,因此最多 4 个。如果您需要更多值,则将它们压入堆栈并以这种方式访问​​它们——就像编译器一样。或者创建一个结构并传递它的地址。

好吧,双重检查,我是对的here是指向 ARM 调用约定的链接 - 在页面下方一点。

要执行您想要的操作,请将某个内存位置(数组)的地址传递到您的汇编例程中。一旦你有了那个地址,可能在 r0 内,你就可以 stmdb 了!进入该位置,您的所有寄存器值和该内存将在 C 级别可见。

请注意,这可能不会按照您的预期进行。根据上面的调用约定链接,这些值可以有很大的改变。如果这是为了调试,您最好使用调试器并以这种方式观察寄存器。

好吧,你还是没看懂:


{
int registerValues[14];

myAsmRoutine(registerValues);

print_uart0(& registerValues);
}

myAsmRoutine:
stmia r0!, {r1-r14}
blx lr

我跳过了 R0 和 PC,但你明白了。此外,您需要做一些稍微复杂的事情才能将值更改为可打印格式 - sprintf 或 itoa os 之类的东西。

关于c - 在 ARM 上将参数从 asm 传递到 C in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836874/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com