繁体   English   中英

在gcc内联汇编程序(ARM)中使用数组

[英]Work with array in gcc inline assembler (ARM)

我有一些内联汇编代码的问题。 我正在尝试将本地静态数组中的项加载到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)

谢谢

编辑:我用Android NDK编译它(arm-linux-androideabi-g ++)

您无需将ARGV或OUT移入/移出寄存器,这就是寄存器约束为您处理的内容。

"mov r1, #4\n\t"
"ldr %[OUT], [%[ARGV], r1]\n\t"
: [OUT] "=r" (out)
: [ARGV] "r" (argv)
: "r1"

注意:在使用过高的优化设置进行编译时,此代码确实存在问题。 (我不知道如何解决,除了:使用-O0)

我认为它应该像这样工作:

[ARGV] "r" (argv)

这就是说“将数组的地址加载到寄存器中”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM