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 変換に関するヒントも大歓迎です。