0

我对与 C 混合使用的 asm 代码有问题,但在具有适当参数的 asm 代码中使用时却没有。

;; array - RDI, x- RSI, y- RDX
getValue:   
   mov r13, rsi
   sal r13, $3
   mov r14, rdx
   sal r14, $2
   mov r15, [rdi+r13]
   mov rax, [r15+r14]

   ret

从技术上讲,我想保持 rdi、rsi 和 rdx 寄存器不变,因此我使用其他寄存器。

我使用的是 x64 机器,因此我的指针有 8 个字节。从技术上讲,这段代码应该这样做:

int getValue(int** array, int x, int y) {
    return array[x][y];
}

它以某种方式在我的 C 代码中工作,但在 asm 中以这种方式使用时不起作用:

mov rdi, [rdi]    ;; get first pointer - first row
mov r9,  $4       ;; we want second element from the row
mov rax, [rdi+r9] ;; get the element (4 bytes vs 8 bytes???)
mov rdi, FMT      ;; prepare printf format "%d", 10, 0
mov rsi, rax      ;; we want to print the element we just fetched
mov eax, $0       ;; say we have no non-integer argument
call printf       ;; always gives 0, no matter what's in the matrix

有人可以看到这个并帮助我吗?提前致谢。

4

2 回答 2

1

这意味着元素是双字,因此不应该加载 qwordsal r14, $2之前的最后一行。ret此外,x86 有很好的缩放寻址模式,所以你可以这样做:

mov rax, [rdi + rsi * 8]  ; load pointer to column
mov eax, [rax + rdx * 4]  ; note this loads a dword
ret

这意味着您有一个指向columns的指针数组,这是不寻常的。你可以这样做,但这是故意的吗?

于 2013-03-24T16:27:45.733 回答
0

这是一个标准的整数矩阵。

int** array;
sizeof(int*) == 8
sizeof(int) == 4

我的看法是,当我一开始有那个数组时,我有一个指向没有“空白”的内存空间的指针,它一个一个地保存所有指针(按索引),所以我说“让我们去数组的第 rsi 个元素”,这就是我移动 rsi-th * 8 个字节的原因。所以现在我得到了同样的情况,但是指针应该指向一个整数空间,所以是 4 字节的项目。这就是为什么我在那里移动了 4 个字节。

我的想法错了吗?

于 2013-03-24T16:24:11.097 回答