2012-03-16 172 views
1

我在使用某些内联汇编代码时遇到了问题。我试图从本地静态数组中将项目加载到ARM平台上的寄存器中。不幸的是,我不知道如何告诉GCC它应该传递数组上的指针来注册。该寄存器将用于间接访问数组。在gcc内联汇编程序(ARM)中使用数组

// 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

这个组装,链接和运行良好使用铿锵。不知道发生了什么事。你确定它在这个代码中,它是错误的? – mattjgalloway 2012-03-16 10:21:06

+0

我忘了告诉我用Android NDK编译它(arm-linux-androideabi-g ++) – zdenek 2012-03-16 10:28:34

+0

如果你将'argv'的约束设置为'“rm”',它是否适合你? – mattjgalloway 2012-03-16 10:35:00

回答

1

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

[ARGV] "r" (argv) 

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

+0

是的,你是对的。我用'MOV'替换'LDR'指令并使用'r'约束,现在它工作正常。谢谢。 – zdenek 2012-03-16 14:40:57

1

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

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

注:这段代码时过高的优化设置编译有问题。 (我不知道如何解决这个问题,除了:使用-O0)