通过ARMC内联汇编程序操作内存中的数组 int-smplSize=48; int-Smpl[48]; 对于(inti=0;i

通过ARMC内联汇编程序操作内存中的数组 int-smplSize=48; int-Smpl[48]; 对于(inti=0;i,c,gcc,assembly,arm,inline-assembly,C,Gcc,Assembly,Arm,Inline Assembly,编辑: 正如您所看到的,我希望通过arm上的内联汇编程序操作数组的变量,但我总是会遇到一个错误。如何在无故障的情况下访问内存 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*)pt

编辑:

正如您所看到的,我希望通过arm上的内联汇编程序操作数组的变量,但我总是会遇到一个错误。如何在无故障的情况下访问内存

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]);
printf(“你好,测试开始!\n\n”);
int-smplSize=48;
int-Smpl[48];
对于(inti=0;i
好的,我这样做了,但现在我得到了一个“/tmp/cczqdyw.s | 72 |错误:内部_重定位(类型:OFFSET | IMM)未修复|”编译它时

顺便说一句:我可以“org[address of the program]”内联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"

            //"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]);
printf(“你好,测试开始!\n\n”);
int-smplSize=48;
int-Smpl[48];
对于(inti=0;i
编辑2:

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

不要硬编码程序集应该使用的寄存器。使用
%0
%1
等符号来命名与正在传递的参数相对应的寄存器


如果操作正确,则不需要在本例中使用诸如
“memory”
之类的约束。

您应该将
%[ptrtospl]
放在方括号内-您希望从/存储到寄存器中的地址

这个
ldr r2,%[ptrToSmpl]
被翻译成
ldr r2,rX
-无意义

ldr r2,[%[ptrtospl]]
ldr r2,[rX]
-正确


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

如何确保ptrToSmpl以r3结尾?如果您有其他问题,请开始一个新的线程-一旦已经给出并接受了答案,就很难遵循您的编辑,也很难正确回答它们。顺便说一句,您使用
adr
的想法是完全错误的,这表明您不知道该指令的作用……sry使用adr是一个错误,应该是ldr。如何增加ptr的值?只需观察编译器是如何做到这一点的(;编写一个简单的循环,并查看它如何转换为汇编代码)(您可以像这样生成汇编列表
arm none-eabi-objdump--demangle-S file.elf>file.lss
)。如果您想在加载(或存储)后增加地址寄存器,您可以像下面这样做
ldr r1、[r2]、#4
(4显然是添加到r2的数字).我建议您用C语言编写代码并检查程序集-然后您将看到编译器做得有多好(并决定不自己编写),或者您将看到这些构造如何转换为程序集。
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]);