我试图找出将此x86汇编代码转换为Y86形式:

给定c程序:

  int sum(int x) {
     if (x == 0 || x ==1) {
        return 1;
     } else {
        return x + sum(x-1);
     }
  }


生成以下x86-64汇编代码:

sum:
    cmpl $1, %rdi
    ja .L8
    movl $1, %eax
    ret
.L8:
    pushq %rbx
    movl %edi, %ebx
    leal -1(%rdi), %edi
    call sum
    addl %ebx, %eax
    popq %rbx
    ret


如何将其转换为具有相同功能的Y86-64汇编代码?

谢谢!

最佳答案

在这种情况下,您可以通过用简短的y86指令序列替换每条指令来进行转换,这些指令的作用完全相同。

y86是Turing完整的,但是非常残缺,因此通常不能总是轻松地进行转换。某些x86指令可能需要一个完整的循环或很长的函数才能实现,但您的任何指令都并非如此。它们每个都可以转译成一个或几个y86指令。 (有些可能需要暂存器;我忘记了y86是否与立即或仅立即进行比较进行比较。)

您的代码没有任何乘法,移位或bsf或浮点数,或者y86没有的其他任何内容(并且需要循环来模拟)。

在指令集参考手册(like this online version或此older one中没有AVX / AVX2指令的地方,可以省去一些麻烦)中查找每个x86指令。有关英特尔和AMD的PDF的链接,请参见x86标记Wiki。请参阅“操作”部分,其中伪代码描述了指令对体系结构状态的确切影响。这就是您要使用y86指令实现的行为。

例如,我忘记了y86是否具有push / pop,但是如果没有,您总是可以直接操纵rsp并加载/存储。例如sub $8, %rsp; movrm %rbx, (rsp)push(除了x86的push不在这里时,它会置位)。

08-05 23:42