1

IA32 コードを Y86 に変換する任務を負っています。元のプログラムは C で書かれており、偶数位置の値が 3 つの関数のいずれかを呼び出し、奇数位置の値がその関数内で操作される整数の配列を取ることを目的としています。関数には、数値の否定、数値の 2 乗、および 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 変換に関するヒントも大歓迎です。

4

3 に答える 3

0

否定のために、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: 
于 2015-11-18T02:22:13.100 に答える
0

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<<8+l, B=H<<8|L, aB = Ll + (hL+Hl)<<8 + hH<<16;
3 つの異なるテーブルを使用して処理できます。
s1[n] = n^2 >>2; s2[n]=n^2 << 6; s3[n]=n^2 << 14;

于 2012-12-01T15:46:29.197 に答える