通过C中的内联汇编在二维数组中存储值

时间:2017-01-30 14:46:09

标签: c assembly arm inline-assembly

我无法通过内联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位拇指指令。

0 个答案:

没有答案