0
DX:AX
の単語の符号付き除算をしようとしていますが、単語[b] = 10で1234567としましょう。Dwordをワードで分割する
a dd 1234567
b dw 10
mov ax,[a]
mov dx,[a+2]
idiv word [b]
商は123456である必要がありますが、大きすぎるためaxに収まりません。この問題を解決するにはどうすればよいですか?
DX:AX
の単語の符号付き除算をしようとしていますが、単語[b] = 10で1234567としましょう。Dwordをワードで分割する
a dd 1234567
b dw 10
mov ax,[a]
mov dx,[a+2]
idiv word [b]
商は123456である必要がありますが、大きすぎるためaxに収まりません。この問題を解決するにはどうすればよいですか?
明らかに、使用可能な32ビットのオペランドサイズがあるので、それはちょうどidiv dword [b]
(これは16ビットb
の外で読み込まれ、したがって正しいものではない)以上の値で使用してください。
mov eax, [a]
cdq
mov ecx, 10 ; or movsx ecx, word [b] to load with sign-extension
idiv ecx
あなたは、他の32ビット動作のために、通常はあなたのようなeax
にa
のすべてをう置きます。次に、64b/32b => 32b除算を使用して、配当の上半分(符号またはゼロ拡張)を取ります。
cdq
符号がeax
にedx:eax
に拡張されています。 idiv
の代わりにdiv
を設定するには、xor edx,edx
を使用して上半分をゼロにします。
可能であれば、64ビット除算を使用します。それ以外の場合は、自分で実装してください。 – Jester
だから、私はdwordをqwordに変換し、単語をdwordに変換し、署名された除算を行うべきですか? –
はい、それは考えです。 – Jester