一旦你问 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
汇编器将地址放在函数定义之后。