我试图找出将此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
不在这里时,它会置位)。