私はまだアセンブリに不慣れで、アセンブリの多くのコマンド コードをまだ知りません。16ビットレジスタで割り算をしたいです。その内容を印刷したい。レジスターの内容を印刷用に ASCII に変換する必要があることはわかっていますが、やはり問題は除算です。私を助けてください。
たとえば、cx の内容は 2012 (整数) です。私は何をすべきか?
mov ax, cx
mov bx, 1000
idiv bx
上記のコードは間違っていますよね?
編集:これは署名された部門であることに気付き、idiv
それに応じて回答が編集されました。
上記のコードは 1 つの側面で間違っています:ax
に符号拡張されていませんdx:ax
。
cwd
の前に (convert word to doubleword) を追加するだけidiv bx
で、正しいです。商は にax
なり、剰余は になりますdx
。
このリファレンスをチェックしてください(idivを検索してください)
idiv 命令は、64 ビット整数 EDX:EAX (EDX を最上位 4 バイト、EAX を最下位 4 バイトと見なすことによって構築される) の内容を、指定されたオペランド値で除算します。除算の商の結果は EAX に格納され、剰余は EDX に格納されます。構文 idiv idiv
例
idiv ebx — EDX:EAX の内容を EBX の内容で除算します。商を EAX に、余りを EDX に入れます。idiv DWORD PTR [var] — EDX:EAS の内容をメモリ位置 var に格納されている 32 ビット値で割ります。商を EAX に、余りを EDX に入れます。
もちろん、16 ビットを使用しているので、指定されたすべてのビット値を半分にカットし、各レジスタから E を削除すると、まったく同じになります。