C 将x86转换为Y86
我正在尝试将此x86汇编代码转换为Y86格式: 给定c程序: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
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
没有的地方关闭标志)。那么,到目前为止,您尝试了什么?