我的ARM asm存在问题,在Cortex A53(64位)上。我必须像这样编写128条指令:
#define MACRO1() \
__asm__ volatile ("str %0,[%1], #4\n\t" \
"str %0,[%1], #4\n\t" \
: "=r"(here) \
: "r"(here) \
: );
因此,我创建了一个名为MACRO1的宏,我复制了128次。这里的变量在代码的前一部分中声明如下:
P4_uint32_t * buffer;
... code
P4_uint32_t *here = buffer;
我的问题是编译器做了类似的事情:
8014b40: f8008400 str x0, [x0],#4
8014b44: f8008400 str x0, [x0],#4
8014b48: f8008413 str x19, [x0],#4
8014b4c: f8008413 str x19, [x0],#4
8014b50: f8008673 str x19, [x19],#4
8014b54: f8008673 str x19, [x19],#4
我有这些寄存器的问题,因为这里的变量是在x19寄存器中声明的,所以为什么它使用x0寄存器。问题是:
access to unmapped memory during write at address 0x802e000
这个地址指向代码的这一部分......
感谢您的帮助:)
答案 0 :(得分:0)
修复是在汇编代码的末尾添加 clobber 列表,如下所示:
__asm__ volatile ("str %0,[%1], #4\n\t" \
"str %0,[%1], #4\n\t" \
: "=r"(here) \
: "r"(here) \
: "%0", "%1");
这有助于编译器理解每个寄存器的更改,这解决了我的问题。