2017-11-08 18 views
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に収まりません。この問題を解決するにはどうすればよいですか?

+0

可能であれば、64ビット除算を使用します。それ以外の場合は、自分で実装してください。 – Jester

+0

だから、私はdwordをqwordに変換し、単語をdwordに変換し、署名された除算を行うべきですか? –

+0

はい、それは考えです。 – Jester

答えて

0

明らかに、使用可能な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ビット動作のために、通常はあなたのようなeaxaのすべてをう置きます。次に、64b/32b => 32b除算を使用して、配当の上半分(符号またはゼロ拡張)を取ります。

cdq符号がeaxedx:eaxに拡張されています。 idivの代わりにdivを設定するには、xor edx,edxを使用して上半分をゼロにします。

関連する問題