是否可以使用 STR 自动增加寄存器的基地址[Rn]!
?我浏览了文档,但未能找到明确的答案,主要是因为 LDR 和 STR 都提供了命令语法 - 理论上它应该适用于两者,但我找不到 auto 的任何示例- 增加商店(加载正常)。
我做了一个小程序,将两个数字存储在一个向量中。完成后,out
应该是的内容,{1, 2}
但存储会覆盖第一个字节,就好像自动增量不起作用一样。
#include <stdio.h>
int main()
{
int out[]={0, 0};
asm volatile (
"mov r0, #1 \n\t"
"str r0, [%0]! \n\t"
"add r0, r0, #1 \n\t"
"str r0, [%0] \n\t"
:: "r"(out)
: "r0" );
printf("%d %d\n", out[0], out[1]);
return 0;
}
编辑:虽然答案对于常规加载和存储是正确的,但我发现优化器会弄乱 vldm/vstm 等向量指令的自动增量。例如下面的程序
#include <stdio.h>
int main()
{
volatile int *in = new int[16];
volatile int *out = new int[16];
for (int i=0;i<16;i++) in[i] = i;
asm volatile (
"vldm %0!, {d0-d3} \n\t"
"vldm %0, {d4-d7} \n\t"
"vstm %1!, {d0-d3} \n\t"
"vstm %1, {d4-d7} \n\t"
:: "r"(in), "r"(out)
: "memory" );
for (int i=0;i<16;i++) printf("%d\n", out[i]);
return 0;
}
编译
g++ -O2 -march=armv7-a -mfpu=neon main.cpp -o main
将在最后 8 个变量的输出上产生乱码,因为优化器会保留递增的变量并将其用于 printf。换句话说,out[i]
is 实际上out[i+8]
,所以前 8 个打印值是向量中的最后 8 个值,其余的是超出范围的内存位置。
我已经尝试在volatile
整个代码中使用不同的关键字组合,但是只有当我使用-O0
标志编译或者我使用 volatile 向量而不是指针和 new 时,行为才会改变,比如
volatile int out[16];