我的任务是把IA32代码转换成Y86。原始程序是用C编写的,目的是获取一个整数数组,其中偶数位置的值调用三个函数中的一个,奇数位置的值在该函数中操作。函数包括一个数的求反,一个数的平方,以及从1到提供的数的和。
大多数指令很容易从IA32转换为Y86,但是有很多指令给了我一段非常困难的时间。

0000001e <negation>:
  1e:   55                      push   %ebp
  1f:   89 e5                   mov    %esp,%ebp
  21:   8b 45 08                mov    0x8(%ebp),%eax
  24:   f7 d8                   neg    %eax
  26:   5d                      pop    %ebp
  27:   c3                      ret

neg指令不是Y86中的有效指令。这就是我86年的作品:
# int Negation(int x)
Negation:
    pushl %ebp
    pushl %esi
    rrmovl %esp,%ebp
    mrmovl 0x8(%ebp),%eax
    irmovl %esi,$0
    subl %eax, %esi
    rrmovl %esi, %eax
    popl %esi
    popl %ebp
    ret

这是解决这个问题的正确方法吗?
另一个指令是my square函数中的imul指令:
00000028 <square>:
  28:   55                      push   %ebp
  29:   89 e5                   mov    %esp,%ebp
  2b:   8b 45 08                mov    0x8(%ebp),%eax
  2e:   0f af c0                imul   %eax,%eax
  31:   5d                      pop    %ebp
  32:   c3                      ret

有人知道在这种情况下如何转换“imul”指令吗?
谢谢你的帮助!关于IA32/Y86转换的任何提示也将非常感谢。

最佳答案

要实现imul,您可能需要使用shift和add例程来实现mul例程:
http://en.wikipedia.org/wiki/Multiplication_algorithm#Peasant_or_binary_multiplication
对于imul只需使用以下步骤:
找出结果应该有什么标志
将操作数转换为绝对值(使用求反例程)
对正值调用mul例程
必要时将结果转换为负数

07-24 09:44
查看更多