C IA32到Y86汇编代码转换
我的任务是将IA32代码转换为Y86。最初的程序是用C编写的,目的是获取一个整数数组,其中偶数定位值调用三个函数中的一个,奇数定位值在该函数中操作。函数包括一个数的求反、一个数的平方以及从1到提供的数的和 大多数指令都很容易从IA32转换为Y86,但有许多指令让我感到非常困难C IA32到Y86汇编代码转换,c,assembly,instructions,y86,C,Assembly,Instructions,Y86,我的任务是将IA32代码转换为Y86。最初的程序是用C编写的,目的是获取一个整数数组,其中偶数定位值调用三个函数中的一个,奇数定位值在该函数中操作。函数包括一个数的求反、一个数的平方以及从1到提供的数的和 大多数指令都很容易从IA32转换为Y86,但有许多指令让我感到非常困难 0000001e <negation>: 1e: 55 push %ebp 1f: 89 e5 mov %
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
这是解决这个问题的正确方法吗
另一条指令是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
00000028:
28:55%推压ebp
29:89 e5 mov%esp,%ebp
2b:8b 45 08 mov 0x8(%ebp),%eax
2e:0f af c0 imul%eax,%eax
31:5d流行百分比ebp
32:c3 ret
有人知道在这种情况下如何转换“imul”指令吗
谢谢你的帮助!任何关于IA32/Y86转换的提示也将不胜感激 要实现
imul
,您可能需要考虑使用shift和add例程来实现mul
例程:
- 找出结果应有的符号
- 将操作数转换为绝对值(使用求反例程)
- 在正值上调用
例程mul
- 如有必要,将结果转换为负数
imul
,您可能需要考虑使用shift和add例程来实现mul
例程:
- 找出结果应有的符号
- 将操作数转换为绝对值(使用求反例程)
- 在正值上调用
例程mul
- 如有必要,将结果转换为负数
- 1)是否允许mrmovl 0x4(%esp),%eax
ixorl %eax, 0xffffffff
iaddl %eax, 1
应该稍微更有效(ebp也可以用作GPR——无需推动esi)
2) 对于乘法,确实有移位和加法选项,同时也是一种基于LUT的方法,利用
4*a*b=(a+b)^2-(a-b)^2
这一事实。
对于每个8x8位或NxN位乘法
对于a=h1)是否允许mrmovl 0x4(%esp),%eax
ixorl %eax, 0xffffffff
iaddl %eax, 1
应该稍微更有效(ebp也可以用作GPR——无需推动esi)
2) 对于乘法,确实有移位和加法选项,
同时也是一种基于LUT的方法,利用4*a*b=(a+b)^2-(a-b)^2
这一事实。
对于每个8x8位或NxN位乘法
对于求反的a=h,您反转了irmovl指令的操作数
以下代码起作用:
#
# Negate a number in %ebx by subtracting it from 0
#
Start:
irmovl $999, %eax // Some random value to prove non-destructiveness
irmovl Stack, %esp // Set the stack
pushl %eax // Preserve
Go:
irmovl $300, %ebx
xorl %eax, %eax
subl %ebx,%eax
rrmovl %eax, %ebx
Finish:
popl %eax // Restore
halt
.pos 0x0100
Stack:
对于求反,您反转了irmovl指令的操作数
以下代码起作用:
#
# Negate a number in %ebx by subtracting it from 0
#
Start:
irmovl $999, %eax // Some random value to prove non-destructiveness
irmovl Stack, %esp // Set the stack
pushl %eax // Preserve
Go:
irmovl $300, %ebx
xorl %eax, %eax
subl %ebx,%eax
rrmovl %eax, %ebx
Finish:
popl %eax // Restore
halt
.pos 0x0100
Stack:
为了清楚起见,平方函数代码在IA32I中给出,我不知道Y86的详细信息,但它看起来至少应该是mrmovl 0x8(%ebp),%eax
应该是mrmovl 0xc(%ebp),%eax
,因为在设置ebp
之前您正在推一个额外的寄存器,平方函数代码在IA32I中给出,我不知道Y86的详细信息,但它看起来至少应该是mrmovl 0x8(%ebp),%eax
应该是mrmovl 0xc(%ebp),%eax
,因为在设置ebp
之前,您正在推一个额外的寄存器。我熟悉按位向左移位和向右移位的操作,但这些将如何在Y86中实施?期望值是大于0的正整数,所以我不必处理负值。哦,我错过了移位指令不是Y86的一部分。只需在寄存器中添加一个寄存器,就可以实现单个左移位。老实说,我不确定用Y86指令集实现右移的合适方法是什么。循环执行31位测试(使用和
)和或
-在结果中选择适当的位?幸运的是,乘法的移位/加法算法不需要右移。我熟悉按位向左移位和向右移位操作,但在Y86中如何实现这些操作?期望值是大于0的正整数,所以我不必处理负值。哦,我错过了移位指令不是Y86的一部分。只需在寄存器中添加一个寄存器,就可以实现单个左移位。老实说,我不确定用Y86指令集实现右移的合适方法是什么。循环执行31位测试(使用和
)和或
-在结果中选择适当的位?幸运的是,乘法的移位/加法算法不需要右移位。当然好的是,原来的问题是平方,而不是乘法!分解算法仍然是相关的…当然好的事情是原来的问题是平方,而不是乘法!分解算法仍然是相关的。。。