当我试图辨别汇编语言时,我现在感到非常困惑。 我被要求将以下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中的情况。我非常感谢任何能够引导我完成本代码中的内容的人。
答案 0 :(得分: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存储到寄存器中呢?答案 1 :(得分:-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