我遇到一些内联汇编代码问题。我正在尝试将本地静态数组中的项加载到ARM平台上的寄存器中。不幸的是我不知道如何告诉GCC它应该将数组上的指针传递给寄存器。该寄存器将用于间接访问数组。
// should return argv[1]
int test() {
int argv[4] = {4, 3, 2, 1};
int out;
__asm__ volatile (
"ldr r0, %[ARGV]" "\n\t"
"mov r1, #4" "\n\t"
"ldr r2, [r0, r1]" "\n\t"
"mov %[OUT], r2"
: [OUT] "=r" (out)
: [ARGV] "m" (argv) // <==== i don't know which constraint put here :/
: "r0", "r1", "r2"
);
return out;
}
现在GCC抛出错误,我不知道如何解决它:
Assembler messages:
Error: invalid offset, value too big (0xFFFFFFFC)
THX
编辑:我用Android NDK编译了它(arm-linux-androideabi-g ++)答案 0 :(得分:2)
您无需将ARGV或OUT移入/移出寄存器,这就是寄存器约束为您处理的内容。
"mov r1, #4\n\t"
"ldr %[OUT], [%[ARGV], r1]\n\t"
: [OUT] "=r" (out)
: [ARGV] "r" (argv)
: "r1"
注意:使用过高的优化设置编译时,此代码确实存在问题。 (我不知道如何解决,除了:使用-O0)
答案 1 :(得分:1)
我认为它应该是这样的:
[ARGV] "r" (argv)
说“将数组的地址加载到寄存器中”。