Assembly 带自动寄存器开关的Arm汇编程序问题

Assembly 带自动寄存器开关的Arm汇编程序问题,assembly,arm,Assembly,Arm,我的手臂asm有问题,位于皮质A53(64位)。我必须编写128条指令,如下所示: #define MACRO1() \ __asm__ volatile ("str %0,[%1], #4\n\t" \ "str %0,[%1], #4\n\t" \ : "=r"(he

我的手臂asm有问题,位于皮质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
这部分代码上的地址点

感谢您的帮助:)

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

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

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

asm是否应该引用名为
output
的变量?虽然对输入和输出使用相同的c变量是合法的,但请注意编译器可能会对%0和%1使用不同的寄存器。而且,由于您似乎没有为%0赋值,因此执行此语句后,
此处的内容将是未定义的。我真的不明白您为什么需要使用内联程序集。使用volatile数组(或指向volatile int的指针)就足够了吗?谢谢你的帮助,解释为什么我必须在asm中这么做有点棘手,但要快速解释:我需要对代码的这一部分进行完全控制,因为它用于对缓存进行充电。因此,asm是控制生成代码的更简单的方法。