C 将x86转换为Y86

C 将x86转换为Y86,c,assembly,x86,x86-64,y86,C,Assembly,X86,X86 64,Y86,我正在尝试将此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

我正在尝试将此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是图灵完备的,但是非常残缺,所以一般来说,你不能轻易转换。某些x86指令可能需要整个循环或很长的函数才能实现,但您的任何指令都不是这样。它们中的每一个都可以被翻译成一个或几个y86指令。(有些可能需要一个临时寄存器;我忘记了y86是否有compare with immediate或仅mov immediate来注册。)

您的代码没有任何乘法、移位、bsf、浮点或y86没有的任何东西(需要一个循环来模拟)

在指令集参考手册中查找每一条x86指令(,或者在这里,没有AVX/AVX2指令意味着涉猎更少。另请参阅标记wiki以获取指向英特尔和AMD PDF手册的链接。)查看操作部分,其中伪代码描述指令对体系结构状态的确切影响。这就是您希望使用y86指令实现的行为


例如,我忘记了y86是否有
push
/
pop
,但如果没有,您始终可以直接操作
rsp
并加载/存储。e、 g.
低于8美元,%rsp
movrm%rbx,(rsp)
push
(除了它会在x86的
push
没有的地方关闭标志)。

那么,到目前为止,您尝试了什么?