我的任务是把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
例程
必要时将结果转换为负数