2012-02-20 17 views
1

に相対アドレッシング:私の知る限りは、x86で相対アドレス指定するための構文は次のようである知っているように私が正しく、この得た場合、私は思っていたアセンブリ

を:これらの仮定Igiven今

base + index * scale + displacement 

私はEAXに次のようにロードしたい
int i //valuee in ecx 
int arr[256] //adress in esi 

:[私は10 +]

のARR

私の最初の推測されました:

mov eax, dword ptr[esi + ecx*4 + 10*4] 

しかし、私はそれは、上記の構文は収まらないので、第2の乗算について不明な点です。

また、インデックスと配列のデータ型が異なる場合はどうなりますか?例:

short arr[i + 10] 

何が乗算になりますか?

答えて

2

その常に簡単にあなたのコード以下、少しそれを打破するには、次の

  • esiarr
  • ecxへのポインタであるi
  • 10 * sizeof(int) = 40

今度はまとめて:

mov eax, dword ptr[esi + ecx* 4 + 40]

あなたの声明は正しいです。 2番目の乗算はアセンブラによって定数40に折りたたまれていなければなりません。そうでなければ手で計算する必要がありますが、アセンブラ(あるいはコンパイラがインラインの場合はこれをテストする必要がありますアセンブリ)。

更新

あなたはレジスタはいえ変更する必要はありませんが、新しい要素のサイズに定数を調整する必要があるだろう: mov eax, dword ptr[esi + ecx * 2 + 20]

これは、インラインアセンブラとして行われている場合は、 sizeof演算子を使用すると、作業が簡単になり、折り畳まれてしまいますが、特定のアセンブラでSIZEOFマクロを使用することもできます。

+0

ああダム私。そのような最適化を完全に忘れました;-) – er4z0r

+0

元トピックに関連トピックを含めるように変更しました。あなたはそれについてもコメントできますか? – er4z0r

+0

@ er4z0r:私のアップデート – Necrolis

関連する問題