[英]Difference between global variables and variables declared in main in ARM C
[英]Using global variables declared in C, in Arm assembly
一旦你问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
的地址被汇编器放在函数定义之后。
我认为您需要将指令从ARM汇编程序转换为GNU汇编程序。 如果我理解正确,您可以使用.global
指令而不是.import
访问任何全局符号。 从使用为页面:
.global 符号
.global使符号对ld可见。 如果在部分程序中定义符号 ,则其值可用于与其链接的其他部分程序。 否则, 符号从链接到同一程序的另一个文件中获取同名符号的属性。
.extern (symbol)
是你需要的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.