0

現在、x86 アセンブラを使用してコードを高速化するさまざまな方法をテストしています。以前は 1D 配列にアクセスできましたが、2D 配列はまったく違うようです。

アセンブリで作成した 2 つの for ループを使用し、'x' を ECX レジスタに移動し、'y' を EDX レジスタに移動しました。

また、これを使用して、配列の実効アドレスを EBX にロードしました。

lea ebx,dword ptr [slimeTrail]

今私がやりたいことは、ループを使用して文字を分離し、次を使用して AL レジスタに移動することです。

movsx al,byte ptr [ebx + (ecx * sizeX) + edx]

sizeX は幅です。

しかし、私が得ているエラーは

error C2404: 'edx' : illegal register in 'second operand'

error C2425: '*' : non-constant expression in 'second operand'

Intel のマニュアルを確認しましたが、そこに到達していないようです。基本的なことを見逃していませんか?

4

1 に答える 1

1

メモリオペランドのアドレス指定を学ぶ必要があります。

32 ビット モードでは、通常、1 つの命令でメモリ オペランドのアドレスとして次のいずれかを使用することに制限されます。

  • 登録
  • 変位 (定数)
  • レジスター + ディスプレースメント
  • レジスター 1 + レジスター 2 * スケール + 変位 (スケールは定数: 1、2、4、または 8)

あなたebx + (ecx * sizeX) + edxは上記のどちらでもありません。

sizeXが 1、2、4、および 8 のいずれでもない場合は、またはまたは 他の同等の操作 (いくつかの命令で構成される)ecxを使用して乗算し、積をまたはに追加する必要があります。mulimulebxedxmov al,byte ptr [ebx + edx]

ところで、movsx al, ...意味がないのはおそらく無効です。簡単movにできます。

于 2013-02-05T11:10:50.620 に答える