【问题标题】:IA32 to Y86 Assembly Code ConversionIA32 到 Y86 汇编代码转换
【发布时间】:2012-11-30 23:48:35
【问题描述】:

我的任务是将 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 中的有效指令。这就是我在 Y86 中所拥有的:

# 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

这是解决这个问题的正确方法吗?

另一个指令是我的平方函数中的 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 转换的提示也将不胜感激。

【问题讨论】:

  • 明确一点,IA32中给出了square函数代码
  • 我不知道 Y86 的详细信息,但看起来至少 mrmovl 0x8(%ebp),%eax 应该是 mrmovl 0xc(%ebp),%eax,因为您在设置 ebp 之前要推送一个额外的寄存器。

标签: c assembly instructions y86


【解决方案1】:

为了实现imul,您可能需要考虑使用移位和添加例程来实现mul 例程:

那么对于imul,只需使用以下步骤:

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

【讨论】:

  • 我熟悉按位运算左移和右移,但是在 Y86 中如何实现呢?并且期望值是大于 0 的正整数,所以我不必处理负值。
  • 哦 - 我错过了班次指令不是 Y86 的一部分。您只需向自身添加一个寄存器即可实现单个左移。老实说,我不确定用 Y86 指令集实现右移可能是一种体面的方法。一个循环进行 31 位测试(使用 and)和 or-ing 结果中的适当位?
  • 幸运的是,乘法的移位/加法算法不需要右移。
【解决方案2】:

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=h&lt;&lt;8+l, B=H&lt;&lt;8|L, aB = Ll + (hL+Hl)&lt;&lt;8 + hH&lt;&lt;16;
可以使用 3 个不同的表来处理:
s1[n] = n^2 &gt;&gt;2; s2[n]=n^2 &lt;&lt; 6; s3[n]=n^2 &lt;&lt; 14;

【讨论】:

  • 当然,原来的问题是平方,而不是乘法!分解算法仍然是相关的......
【解决方案3】:

对于求反,您颠倒了 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: 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多