gpt4 book ai didi

c - 在 Arm 程序集中使用 C 中声明的全局变量

转载 作者:太空狗 更新时间:2023-10-29 15:01:01 26 4
gpt4 key购买 nike

我有一个声明全局变量的 C 文件。该文件将与一些 ARM 汇编文件一起编译。

int foo;

void call_asm(void);

int main(void) {
call_asm();
return foo;
}
call_asm:
...

我尝试使用 link from the arm infocenter但是编译器 (arm-linux-gnueabi-gcc) 告诉我“导入”是未定义的指令。

我可以简单地做一些事情吗:

LDR    r0, =GLOBAL_VAR

如何在汇编中使用C文件中定义的全局变量?

最佳答案

一旦您询问 gcc 如何做,这就变得非常简单。例如,使用 gcc -S -O3 编译以下函数:

extern int foo;
void useFoo()
{
foo=7;
}

您将看到 gcc 如何实现它。

基于此,我设计了一个从 C 调用汇编函数来设置全局 C 变量的工作示例:

// test.c
#include <stdio.h>

void setupFoo();
int foo;

int main()
{
setupFoo();
printf("foo=%d\n", foo);
}
# test.s
.text
.global foo
.fooAddr:
.word foo

.global setupFoo
setupFoo:
ldr r0, .fooAddr
mov r1, #123
str r1, [r0]
bx lr

编译运行:

$ gcc test.c test.s -o test && ./test
foo=123

在 gcc Raspbian 6.3.0-18+rpi1 上测试。

上面的汇编代码基于 useFoo 示例的 gcc 输出。一种更简单的方法是使用 =foo 而不是手动将地址放入变量:

# test.s
.text
.global foo
.global setupFoo
setupFoo:
ldr r0, =foo
mov r1, #123
str r1, [r0]
bx lr

这将导致 foo 的地址被汇编程序放在函数定义之后。

关于c - 在 Arm 程序集中使用 C 中声明的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181145/

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