2016-10-15 7 views
0

レジスタaxの値が7で割り切れていて、余りが0であるかどうかをチェックしたいと思います。どうすればいいですか?レジスタが7で割り切れるかどうかを確認する方法はありますか?

+1

の複数た符号付きまたは符号なしとしてAXの値は、治療されるべきか?あなたは16ビットモードに制限されていますか?もしそうなら、なぜですか? IDIVを使用した回答は受け入れられるのでしょうか、(遅い)ハードウェア分割命令を避ける巧妙なやり方を探していますか?最初にアセンブリ言語を手で書くのはなぜですか? – zwol

答えて

6

this answerのように、さまざまな定数を使用できます。

7 MOD 2 のモジュラ逆数は、(定義により)、0x6db7あるフォームx = n * 7の数がnが以下0xffff/7に等しくなるx * 0x6db7 = nを、従うであろうことを意味します。したがって、x * 0x6db7のうち大きい方が得られれば、それは7の倍数ではないことが分かります。また、7の非倍数も低い結果にマップすることはできません。

だから、これは当然の符号なしの数字です

imul ax, ax, 0x6db7 
cmp ax, 0x2492 
ja not_multiple_of_7 

(テストしていません)を使用することができます。ボーナスとして

axはときに限り7 で割った元の値になり、それは7

+0

乗算付きのCPU(例えば、表示しているようにインテルなど)がある場合は、通常は剰余を生成する除算命令もあります。分割して残りをチェックする。それは概念的に簡単です。あなたの計画は、この小切手の*性能*が重要なときには良いです。ほとんどの場合、パフォーマンスは重要ではありません。この魔法はほとんどの読者にとっては不透明で、数学に依存するため保守が難しいコードを生成しますほとんどの読者は持っていません。 (それは賢いから上書きする)。 –

+0

@IraBaxter:質問の「残余なし」というフレーズは、「残った命令を使わずに」意味しました。しかし、OPの自己回答はそれが意味するものではないことを証明します。 –

1
org 100h 
    mov ax,14 
    mov cl,7 
    div cl 
    cmp ah,0 
    je positive 
    PRINTN "The number has a remainder" 
    jmp finish 
positive: 
    PRINTN "The number has no remainder" 
finish: 
PRINTN "After comparison" 
mov ah, 0 
int 16h 
ret 
+2

これで注意してください。商が255以下であれば、1792以降で#DE – harold

関連する問題