2013-11-22 16 views
5

私はEAXを37倍にする必要があります。shl eax,5shl register,2を使用して、eaxに38を掛けるためにレジスタを追加しますが、奇数で乗算するコードがわからないので、shl addを使用する必要がありますとmovのみ。ありがとう!shlを使って奇数で乗算するアセンブリ言語?

+2

だけでも、どうもありがとうございました、私はハハことを行うことが知られているの必要があり、 'eax' – harold

+0

うわーそう単純で、元(シフトされていない)を追加します。 – user2990286

+0

あなたはそれを返信に投稿したいと思うなら、あなたに+1を喜んで送ってください! – user2990286

答えて

2

ハロルドは、あなたが同様に乗算を実行するためにLEA命令を使用することができ、あなたに言っているものに加えて:LEAを使用して

EAX * 2 : lea eax,[eax*2] 
EAX * 3 : lea eax,[eax*2+eax] 
EAX * 4 : lea eax,[eax*4] 
EAX * 5 : lea eax,[eax*4+eax] 
EAX * 8 : lea eax,[eax*8] 
EAX * 9 : lea eax,[eax*8+eax] 
+0

in-placeに2の累乗を乗算するには 'lea'ではなく' shl eax、3'を使います。 '[eax * 8]'アドレス指定モードでは、ベースレジスタを持たないスケーリングされたインデックスをエンコードする唯一の方法は 'disp32'であるため、エンコーディングで32ビットの' 0'ディスプレースメントが必要です。また、 'eax * 2'は、' lea'よりも多くのポートで動作する 'add eax、eax'で最もうまくいきます。 –

6

、あなたが直接小さな、奇数定数(2、たくさんのを掛けることができます4,8,3,5,9)、さらに2つのレジスタを追加して答えを別の場所に移動します。これは驚くほど便利です。これらを合成することで、LEA命令のシーケンスを使用して小さな定数をかなり増やすことができます。他のADD、SHL、SUB(NEG、ADDを含む)命令を慎重に使用すると、これらのシーケンスを短くすることができます。

乗算EAX 37によって:

lea ecx, [eax+8*eax] ; 9 * eax 
lea eax, [ecx*4+eax] ; 37 * eax 
38によって

乗算EAX:

これらのような短い配列は、命令の多くは現在のプロセッサにより実行時に重なっている部分的にので、ほとんど常に高速乗算使用よりも
lea ecx, [8*eax] 
neg eax 
lea ecx, [5*ecx] 
lea eax, [ecx+2*eax] 

ベター:

lea ecx, [8*eax+eax] ; 9 * eax 
lea ecx, [4*ecx] ; 36 * eax 
lea eax, [eax*2+ecx] ; 38 * eax 

楽しみのためだけに、multip LY 103によって:

lea ecx, [8*eax] ; 8 * eax 
lea ecx, [ecx*4] ; 32 * eax 
lea ecx, [ecx*2+ecx] ; 96 * eax 
lea ecx, [ecx+8*eax]; ; 104 * eax 
sub ecx, eax ; 103 * eax 
関連する問題