C 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 %

我的任务是将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    
这是解决这个问题的正确方法吗

另一条指令是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
例程:

然后,对于imul,只需使用以下步骤:

  • 找出结果应有的符号
  • 将操作数转换为绝对值(使用求反例程)
  • 在正值上调用
    mul
    例程
  • 如有必要,将结果转换为负数

要实现
imul
,您可能需要考虑使用shift和add例程来实现
mul
例程:

然后,对于imul,只需使用以下步骤:

  • 找出结果应有的符号
  • 将操作数转换为绝对值(使用求反例程)
  • 在正值上调用
    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位测试(使用
      )和
      -在结果中选择适当的位?幸运的是,乘法的移位/加法算法不需要右移位。当然好的是,原来的问题是平方,而不是乘法!分解算法仍然是相关的…当然好的事情是原来的问题是平方,而不是乘法!分解算法仍然是相关的。。。