【问题标题】:Assembly Division [duplicate]装配部 [重复]
【发布时间】:2012-10-23 10:37:21
【问题描述】:

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

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

这里是代码段:

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

感谢您的帮助!

【问题讨论】:

  • 这可能是最常见的装配问题。就不能做点什么吗?如果您提出一个新问题,建议框主要包含“整数除法没有返回浮点数,我很困惑”形式的问题和“我忘记 div 是双宽”形式的问题并没有真正出现。

标签: assembly x86 division


【解决方案1】:

DIV BX 指令将 DX:AX 中的 32 位 值除以 BX。由于您没有初始化 DX,因此除数的高位字是前一次计算中 DX 寄存器中留下的任何垃圾,因此您实际上是在将 0x00040078=262314 除以 10。结果是正确的:26231 的商与余数为 4。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多