gpt4 book ai didi

将 x86 转换为 Y86

转载 作者:行者123 更新时间:2023-11-30 20:32:30 24 4
gpt4 key购买 nike

我正在尝试将此 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 是否有与立即比较或仅 mov-immediate 进行注册。)

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

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

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

关于将 x86 转换为 Y86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com