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