4

在我的程序中,十六进制数除以十并检查余数。

第一师表现良好;然而,在第二次划分之后,程序出错了。我是组装新手,我找不到问题出在哪里......

这是代码段:

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。结果是正确的:26231 的商与余数为 4。

在第一个分区中,DX最初恰好为0一定是纯粹的运气。

于 2012-10-23T10:46:39.207 回答
3

英特尔指令 DIV 将寄存器对 DX:AX 与参数分开。

在第一种情况下,DX 恰好为零。
第二次 DX 一定是 4。

于 2012-10-23T10:44:13.123 回答