-2

我试图弄清楚将此 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 汇编代码?

谢谢!

4

1 回答 1

0

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

y86 是图灵完备的,但是非常残缺,所以一般来说你不能总是轻易地转换。一些单一的 x86 指令可能需要一个完整的循环或很长的函数来实现,但您的任何指令都不是这种情况。它们中的每一个都可以音译为一条或几条 y86 指令。(有些可能需要临时寄存器;我忘记了 y86 是否与立即比较或仅 mov-immediate 进行比较。)

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

在指令集参考手册中查找每条 x86 指令(比如这个在线版本,或者这个没有 AVX/AVX2 指令意味着更少涉水的旧版本。另请参阅标签 wiki 以获取英特尔和 AMD 的 PDF 手册的链接。 ) 查看操作部分,其中伪代码描述了指令对架构状态的确切影响。这就是您要使用 y86 指令实现的行为。

例如,我忘记了 y86 是否有push/ pop,但如果没有,您总是可以rsp直接操作并加载/存储。例如sub $8, %rspmovrm %rbx, (rsp)push(除了它破坏 x86push没有的标志)。

于 2017-11-16T03:16:14.853 回答