gpt4 book ai didi

c - 通过 arm c 内联汇编器操作内存中的数组

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:11 25 4
gpt4 key购买 nike

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 上的内联汇编程序操作数组的变量,但我总是遇到段错误。如何在没有段错误的情况下访问内存?

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)未修复|”编译时。

顺便说一句:我可以“组织[程序地址]”内联汇编代码吗?

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|错误: undefined symbol r6 用作立即值|”但是到处都没有 r6。

最佳答案

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

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

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

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

关于c - 通过 arm c 内联汇编器操作内存中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com