0

如果我必须用这样的寻址来翻译一个简单的 C 函数:

void f(int *a, int *b, long i){
    a[i] = b[i];
}

在 System V AMD X86-64(AT&T 标准)程序集中,使用index,base寄存器加一个scale值的间接寻址。

那么,因为在汇编中没有任何类型的指针算术,所以比例值应该是4整数指针?

这段代码正确吗?

f:
    pushq %rpb           # editor's note: typo for %rbp
    movq %rsp, %rbp
    movl (%rsi, %rdx, 4), %eax
    movl %eax, (%rdi, %rdx, 4)
    popq %rbp
    ret
4

1 回答 1

1
  1. 我不明白你为什么需要推送和弹出 rbp。看来你不改了...
  2. 由于 a 和 b 是 int 指针,我会使用 eax 而不是 rax
  3. 是的,在 asm 中计算指针时需要乘以 4(我假设您使用的机器认为 sizeof(int)=4。如果您不确定,请对其进行测试。或者您可以将 stdint.h 与 int32_t 一起使用在您的 C 版本上以获得可靠的结果。
  4. 一个可能的代码可能是:

    mov eax, dword ptr [rsi+rdx*4]
    mov dword ptr [rdi+rdx*4], eax
    ret

我认为这段代码应该没有错误地运行。让我知道这里是否有问题。谢谢。

祝你好运!

相皮赛MM

于 2013-07-05T22:33:24.563 回答