我无法通过内联c将值存储到2D数组中。
我可以使用ldrb
指令从数组中读取值:
uint8_t r[4][4];
uint8_t i, j;
for(i = 0; i < 4; i++) {
for(j = (i+1); j < 4; j++) {
__asm__ __volatile__(
"mov r0, %[ii]\n\t"
"mov r1, %[jj]\n\t"
"mov r2, #4\n\t"
"mul r2, r2, r0\n\t" // row*size
"add r2, r2, r1\n\t" // row*size + column
"ldrb r2, [%[rr], r2]\n\t" // Load r[i][j] into r2
:
: [ii]"h" (i),[jj]"h" (j),[rr]"l" (r)
: "r0","r1","r2"
);
}
}
但是我无法使用strb
指令来完成工作。我能够编译它,但它似乎并没有实际存储数组中的值。
uint8_t r[4][4];
uint8_t i, j;
for(i = 0; i < 4; i++) {
for(j = (i+1); j < 4; j++) {
__asm__ __volatile__(
"mov r0, %[ii]\n\t"
"mov r1, %[jj]\n\t"
"mov r2, #4\n\t"
"mul r2, r2, r0\n\t" // row*size
"add r2, r2, r1\n\t" // row*size + column
"mov r0, #6\n\t"
"strb r0, [%[rr], r2]\n\t" // Store r0 in r[i][j]
:[rr]"+l" (r)
:[ii]"l" (i),[jj]"l" (j)
:"r0","r1","r2","memory"
);
}
}
当我按上述方式运行时,出现以下错误:
./src/main.c:52:17: warning: asm operand 3 probably doesn't match constraints
__asm__ __volatile__(
如果我将约束更改为=l
,我会收到以下错误:
error: impossible constraint in 'asm'
__asm__ __volatile__(
我还尝试添加uint8_t *rr = &r[0][0];
并使用rr
代替另一个StackOverflow帖子中的建议。这并没有给我上述错误,但没有写入预期的内存位置。
在这里,我不确定要让[rr]"+l" (r)
使其发挥作用。我也试过了m约束。我试过添加&#34;内存&#34;我读到的这是一个clobber列表,用于修改输入/输出中未列出的内存地址。
我现在处于死胡同,我无法找到任何人写入阵列的例子,我试图关注Manipulating an array in memory via the arm c inline assembler,但我可以&#39;使用带偏移量的strb指令。我确定它很小,我很忙,任何建议都会很好,因为我被困住了。
我在数组中传递的方式是否正确?我有正确的clobbers吗?我在这些方面错过了其他的东西吗?
由于
注意:我仅限于16位拇指指令。