通过arm c内联汇编程序在内存中操作数组

int smplSize = 48; int Smpl[48]; for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0; Smpl[smplSize-1] = 0x1; int *ptrToSmpl = &Smpl[0]; printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize); asm volatile( "@ ------------------------------------------------- \n" "@ Invert the sample \n" "@ ------------------------------------------------- \n" //"0: \n" "ldr r2,[r3] \n" //"cmp r2,#0x1 \n" //"bne 1f \n" "add r2,#0x1 \n" //"add r2,#0x1 \n" "str r2,[r3] \n" //"ldr r1, .0 \n" //"bx r1 \n" //"1: \n" : : "r" (ptrToSmpl) : "r3", "memory" ); printf("Sample[0] = %i" , Smpl[0]); 

编辑:

正如你所看到的,我想通过arm上的内联汇编程序来操作数组的变量,但我总是得到一个段错误。 如何在没有segfault的情况下访问内存?

 printf("Hello inline asmTest start!\n\n"); int smplSize = 48; int Smpl[48]; for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0; Smpl[smplSize-1] = 0x1; int *ptrToSmpl = &Smpl[0]; printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize); asm volatile( "@ ------------------------------------------------- \n" "@ Invert the sample \n" "@ ------------------------------------------------- \n" //"0: \n" "ldr r2,%[ptrToSmpl] \n" //"cmp r2,#0x1 \n" //"bne 1f \n" "add r2,#0x1 \n" //"add r2,#0x1 \n" "str r2,%[ptrToSmpl] \n" //"ldr r1, .0 \n" //"bx r1 \n" //"1: \n" : : [ptrToSmpl]"r" (ptrToSmpl) : ); printf("Sample[0] = %i" , Smpl[0]); 

好的,我这样做了,但是现在我得到一个“/tmp/cczQDyiw.s|72|错误:internal_relocation(类型:OFFSET_IMM)没有修好” 在编译时。

顺便说一句:我可以“org [程序的地址]”内联asm代码吗?

 printf("Hello inline asmTest start!\n\n"); int smplSize = 48; int Smpl[48]; for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0; Smpl[smplSize-1] = 0x1; int *ptrToSmpl = &Smpl[0]; printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize); asm volatile( "@ ------------------------------------------------- \n" "@ Invert the sample \n" "@ ------------------------------------------------- \n" "init: \n" "ldr r0,%[ptrToSmpl] \n" "loop : \n" "ldr r4,[r0] \n" "cmp r4,#0x0 \n" "bne end \n" "add r4,#0x1 \n" "str r4,[r0] \n" "add r0,#0x1 \n" "b loop \n" "end: \n" : : [ptrToSmpl]"r" (ptrToSmpl) : "r0" , "r4", "memory" ); printf("Sample[0] = %i" , Smpl[0]); 

编辑2:

正如你在上面所看到的那样,我认为仍然存在一个错误。 现在的错误消息是:“/ tmp / ccE69oZd.s | 75 | Error:未定义的符号r6用作立即值|” 但是在任何地方都没有r6。

您应该将%[ptrToSmpl]放在方括号内 – 您希望从/向寄存器中的地址加载/存储。

这个ldr r2,%[ptrToSmpl]被翻译成ldr r2,rX – 废话

这个ldr r2,[%[ptrToSmpl]] ldr r2,[rX] – 正确

此外 – 你应该将r2放入被破坏的寄存器列表中,因为你覆盖了编译器放在那里的东西。 在最后一个(第三个)冒号后添加“r2”(带引号)。

不要硬编码程序集应该使用的寄存器。 使用%0%1等表示法命名与要传递的参数对应的寄存器。

如果你正确地这样做,你不应该在你的情况下使用诸如"memory"约束。