4

11.1之后怎么显示div?例如 32/5=6.4,我只能显示 6 那么如何显示 6.4?

OUT23:

    MOV BL,CNT  ;CNT is the total number of even number
    DIV BL
    MOV DL,AL
    MOV BH,AL
    MOV AH,09H
    LEA DX,MSG23
    INT 21H
    MOV DL,BH   ;print out the average, only the integer part able to display
    MOV AH,02
    ADD DL,30H
    INT 21H
4

3 回答 3

3

如果您想将两个整数相除并打印小数结果,那么您可以像在小学手动除法一样进行操作。初始除法将为您提供结果的整数部分,然后将余数部分重复乘以 10 并除以除数,直到它为零或您已达到预期的精度以获得分数

32/5上面的例子为例

  • 整数部分:

    32/5 = 6 → Print out "6."
    
  • 小数部分:

    Remainder: 2, multiply it by 10 → 2*10 = 20
    20/5 = 4 → Print out "4"
    Remainder: 0, stop here
    

更复杂的除法也可以像上面那样完成,只需在每一步之后将余数乘以 10。如果结果是无限的,那么当你获得足够的精度时停止。例如:25/11 = 2.27272727...

  25/11 = 2 R 3 → 2.
3*10/11 = 2 R 8 → 2
8*10/11 = 7 R 3 → 7
3*10/11 = 2 R 8 → 2
8*10/11 = 7 R 3 → 7
and so on...

当然,通过乘以 10 N一次得到 N 个小数位数,它可以做得更快


或者使用浮点值并FDIV像其他人所说的那样进行浮点除法。之后有多种方法可以将浮点结果转换为字符串,但要获得正确舍入的结果将非常困难,因此最好只使用为此目的制作的库。

然而,对于一个非常简单的演示,同样可以使用上述方法:

  • 拆分结果的整数部分并打印它,然后.
  • 将整数部分乘以 10,整数部分将是下一个小数位
  • 删除整数部分并重复上述步骤,直到达到所需的精度

一个粗略的例子是这样的,忽略由于二进制浮点属性引起的错误

11.157
Int part: 11    → print 11.
Fractional part:
0.157*10 = 1.57 → print 1
 0.57*10 = 5.7  → print 5
  0.7*10 = 7    → print 7

更详细的信息可以在将浮点数转为字符串中找到

于 2013-09-07T11:10:29.077 回答
2

DIV是整数除法指令。如果您想要浮点除法,那么您需要查看FDIV.

于 2011-02-12T19:51:05.867 回答
2

如前所述DIV,执行整数除法。由于它是整数除法,因此得到的商和余数在单独的寄存器对中可用,确切的寄存器取决于除数的大小。

1 字节除数

AX - Dividend
AH - Remainder
AL - Quotient

2 字节除数

DX:AX - Dividend
DX - Remainder
AX - Quotient

4 字节除数

EDX:EAX - Dividend
EDX - Remainder
EAX - Quotient

由于您使用的是 1 字节除数“BL”,余数将在 AH 寄存器中。在您的情况下,32/5寄存器AL将包含该值6,而该寄存器将包含该AH值,2这意味着其中的剩余部分2/50.4为您提供答案6.4

如果您决定使用 FPU 操作,则需要使用指令将两个值加载325FPU 堆栈中FLD,每个值一次,然后调用FDIV它将从 FPU 堆栈中弹出两个值,将它们相除并推送结果到 FPU 堆栈上。

然后可以使用该FSTP指令将结果移出堆栈到内存地址。获得结果后,您需要将其从二进制 IEEE 浮点表示转换为可以显示在屏幕上的字符串表示。

于 2011-02-13T18:31:34.423 回答