4

私のプログラムでは、16進数を10で割って、余りをチェックしています。

最初の除算はうまく実行されます。ただし、2番目の分割後、プログラムは失敗します。組み立ては初めてですが、どこに問題があるのか​​わかりませんでした...

コードセグメントは次のとおりです。

ORG 1000

    MOV AX, 0x04B4 (1204 decimal value )
    MOV BX, 0x000A ( 10 decimal value )
    MOV CX, 0x0000

    DIV BX ( After this part, AX is 120 decimal and DX 4 decimal )

    CMP DX, 0x0000
    JE eq1

    ADD CX, 0x0002
    JMP con1

    eq1:    ADD CX, 0x0001  

    con1:

    DIV BX ( But, after this division AX becomes 6677 ( 26231 decimal and DX remains 4 decimal )
    CMP DX, 0x0000

手伝ってくれてありがとう!

4

2 に答える 2

12

このDIV BX命令は、DX:AXの32ビット値をBXで除算します。DXを初期化していないため、被除数の上位ワードは、前の計算でDXレジスタに残ったガベージです。したがって、実際には0x00040078=262314を10で除算しています。結果は正しいです。 4の残り。

最初の部門では、DXが最初にたまたま0だったのは純粋な運だったに違いありません。

于 2012-10-23T10:46:39.207 に答える
3

Intel命令DIVは、レジスタペアDX:AXを引数で除算します。

最初のケースでは、DXはたまたまゼロです。
2回目のDXは4だったに違いありません。

于 2012-10-23T10:44:13.123 に答える