将x86-64代码转换为Y86-64代码

时间:2017-11-02 02:19:12

标签: c assembly x86-64 y86

当我试图辨别汇编语言时,我现在感到非常困惑。 我被要求将以下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中的情况。我非常感谢任何能够引导我完成本代码中的内容的人。

2 个答案:

答案 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