0

当我试图辨别汇编语言时,我现在非常困惑。我被要求将以下 x86-84 代码转换为 Y86-84:

long arith(long int x, long int y, long int z) {

return (x+y+z) & (x+4+48*y);

}

在 x86-64 中:

arith:
leaq (%rsi, %rsi, 2), %rax
salq $4, %rax
leaq 4(%rdi, %rax), %rax
addq %rdi, %rsi
addq %rdx, %rsi
andq %rsi, %rax
ret

在我转换之前,我很难理解 x86-64 中发生了什么。我将非常感谢任何能引导我了解这段代码中发生的事情的人。

4

2 回答 2

0

这是我的第一枪:在 Y86:

arith:
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rax
addq %rsi, %rsi
addq %rsi, %rax
addq %rdi, %rax
addq 4, %rax
addq %rdi, %rsi
addq %rdx, %rsi
addq %rsi, %rax
ret

我相信 'addq 4, ​​%rax' 行是不正确的。我应该如何将 4 添加到存储在 %rax 寄存器中的值?

编辑:我看到一个更大的问题,在添加到 %rsi 之后,我无法像使用 x86 那样无缝地将 x+y+z 放入 %rsi。那么如何将 x+y+z 存储到寄存器中呢?

于 2017-11-02T03:20:12.927 回答
-1

这是我的第二个镜头:

arith:
subq %r8, %r8
addq %rdi, %r8
addq %rsi, %r8
addq %rdx, %r8
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
addq %rsi, %rsi
subq %rax, %rax
addq %rsi, %rax
addq %rdi, %rax
addq $4, %rax
andq %r8, %rax
于 2017-11-02T04:04:33.970 回答