关于gnu assembler:ARM-GAS:如何加载一些c文件中定义的静态数组的地址(PIC和常规代码)

ARM-GAS: how to load address of static array defined in some c-file (PIC and regular code)

我在 c 文件 (const int data_input[1024];) 中定义了一些简单的静态数组,我需要从我的汇编代码中访问它。正确的做法是什么?

到目前为止,我一直是这样做的:

1
2
3
4
5
6
7
8
.global data_input

data_input_ptr:
    .word data_input

my_function:
    adr r1, data_input_ptr
    bx lr

AFAIK,adr 是 ldr r1、=data_input_ptr 或类似的伪操作。

对我来说,我这样做的方式似乎不是很正确:首先,如果在链接时检测到有可能,那么 adr r1、data_input 可能会直接使用 pc 相对寻址。
另一个问题是关于 PIC:如果代码必须与位置无关怎么办。如果 data_input_ptr 的值必须由加载器初始化,它是如何工作的(我对此是否正确?)


你这样做的方式应该可行,但另一种处理方式是使用数组的地址作为汇编函数的第二个参数。像这样的东西:

1
2
3
4
5
6
7
8
9
10
Call from c-file:
my_function(original_argument, data_input);

my_function.h:
void my_function(void *original_argument, int *array_address);

my_function.S:
my_function:
    /* r1 already contains data_input_ptr since second argument ends up in r1 */
    bx lr