2012-02-16 14 views
2

divオペランドを使用できない場合、整数の残りの部分を見つける方法については疑問に思っています。たとえば、アセンブリでdivを使用せずに余りを見つける方法

mov eax, 400 ; 400/4 
shr eax, 2  ; Remainder : 0 


mov eax, 397 ; 397/4 
shr eax, 2  ; Remainder : 1 


mov eax, 394 ; 394/4 
shr eax, 2  ; Remainder : 2 

シフトを変更すると、残りの部分が切り捨てられます。

div(残りはedxに格納されています)を使用せずに、残りの部分を把握するにはどうすればよいですか?

+2

が、一般的な除数のために( 17のように)それほど簡単ではありません。 –

+1

shr eaxの後に、その結​​果を保存します。その後、元のnumからそれを4倍にしてください。あなたの残りがあります。 –

+0

ありがとうございました、私は正しい軌道に乗っていました。ちょうどそこに着くことはありませんでした。 :) とても有難い。 @PeteWilsonあなたが答えにあなたの返事を入れたいなら、私はそれを受け入れます。さもなければ私はちょうど答えを入れます。 Kerrek SBが説明してくれてありがとうございます。ビット操作部分について詳しく説明できますか? – StartingGroovy

答えて

5

例のように2の累乗で除算するときに余りを欲しいのであれば、残りは実際に入力の下位ビット(シフトしたビット)だけです。したがって、ビットマスキング演算子を適用して、余分な演算をせずに残りの部分をすぐに取り出すことができます。マイクロソフトのx86アセンブリ言語で

、私はあなたの最初の例は次のようになりますと信じて:(残りのためにもこれと)2の累乗による除算は、単純なビット操作で

mov eax, 400 ; 400/4 
and eax, 3h  ; Masking with hex 3 (the lowest two bits) retrieves the remainder 
関連する問題