在间接寻址中正确使用比例值

时间:2013-07-05 13:54:00

标签: assembly mov addressing

如果我必须使用某种类型的寻址来翻译一个简单的C函数:

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

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

那么,因为在汇编中没有任何关于指针的算术,对于整数指针,缩放值应该是4

这段代码是否正确?

f:
    pushq %rpb
    movq %rsp, %rbp
    movl (%rsi, %rdx, 4), %eax
    movl %eax, (%rdi, %rdx, 4)
    popq %rbp
    ret

1 个答案:

答案 0 :(得分:1)

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

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

  5. 我认为此代码应该运行时没有错误。如果出现问题,请告诉我。感谢。

    祝你好运!

    xiangpisaiMM