当我试图辨别汇编语言时,我现在非常困惑。 我被要求将以下 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 中到底发生了什么。我将非常感谢任何能够引导我完成这段代码中发生的事情的人。
最佳答案
这是我的第一个镜头: 在 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 存储到寄存器中呢?
关于将 x86-64 代码转换为 Y86-64 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47066554/