1

IA32アセンブリコードをY86アセンブリコードに変換する方法を勉強していますが、IA32コードにある次の命令でスタックしています。

 leal(%edx, %eax), %eax

Y86コードに相当する命令が見つかりません。私は次の2つのバージョンを持っていますが、どちらが正しいかわかりません。

バージョン1:

 mrmovl (%edx), %ebx
 mrmovl (%eax), %esi
 addl %ebx, %esi
 rrmovl %esi, 5eax

バージョン2:

 addl %edx, %eax

誰かもっと良いアイデアがありますか?

4

1 に答える 1

4

LEAメモリにアクセスせず、(アドレス)演算のみを行います。そのため、バージョン#2は正しいです。

x86LEAではフラグに影響を与えませんが、影響を与えることに注意してくださいADDLEAまた、より複雑な実効アドレス構文もサポートしていますが、y86に転記するのは非常に簡単です。例えば、

leal offset(%eax, %ebx, 4), %edx

になります:

rrmovl %ebx, %edx
addl %edx, %edx
addl %edx, %edx
addl %eax, %edx
pushl %eax           # save eax which used as temporary for adding the offset
irmovl $offset, %eax
addl %eax, %edx
popl %eax            # restore eax
于 2012-11-24T23:29:47.643 に答える