【问题标题】:Converting x86 to Y86将 x86 转换为 Y86
【发布时间】:2017-11-16 00:32:11
【问题描述】:

我正在尝试将这个 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 汇编代码?

谢谢!

【问题讨论】:

  • 嗯,到目前为止你尝试了什么?

标签: c assembly x86 x86-64 y86


【解决方案1】:

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

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

您的代码没有任何乘法、移位、bsf、浮点或任何 y86 所没有的(并且需要循环来模拟)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多