【问题标题】:Correct use of scale value in indirect addressing在间接寻址中正确使用比例值
【发布时间】:2013-07-05 13:54:00
【问题描述】:

如果我必须用这样的寻址方式翻译一个简单的 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           # editor's note: typo for %rbp
    movq %rsp, %rbp
    movl (%rsi, %rdx, 4), %eax
    movl %eax, (%rdi, %rdx, 4)
    popq %rbp
    ret

【问题讨论】:

  • 你试过运行它吗?它不工作吗?顺便说一句,你不应该假设int 是任何特定的大小。如果您需要特定大小的整数,请使用stdint.h 中定义的类型(例如int32_t)。

标签: assembly x86-64 att addressing-mode


【解决方案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
    回复

我认为这段代码应该可以正常运行。让我知道这里是否有问题。谢谢。

祝你好运!

向皮赛MM

【讨论】:

  • 顺便说一句,我使用的是intel语法...您可能需要相应地修改为at&t语法...
  • 1.我知道对 rpb 没有影响,它只是序言和尾声约定; 2. 好的,用 movl 和 32 位寄存器编辑 3. 是的,sizeof(int) = 4。谢谢! 4. 编辑。现在应该是一样的,但我仍然使用AT&T。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多