臂装配器问题与自动套准开关

时间:2017-06-28 08:04:54

标签: assembly arm

我的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

这个地址指向代码的这一部分......

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

修复是在汇编代码的末尾添加 clobber 列表,如下所示:

__asm__ volatile ("str  %0,[%1], #4\n\t"             \
                  "str  %0,[%1], #4\n\t"             \
                 :  "=r"(here)                       \
                 :  "r"(here)                        \
                 :  "%0", "%1");

这有助于编译器理解每个寄存器的更改,这解决了我的问题。