【问题标题】:How to display 11.1 after div in assembly?如何在汇编中的div后显示11.1?
【发布时间】:2011-02-12 14:09:48
【问题描述】:

div后面怎么显示11.1?例如 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

【问题讨论】:

    标签: assembly x86 x86-16


    【解决方案1】:

    如果您想将两个整数相除并打印小数结果,那么您可以像在小学时手动除法一样进行操作。初始除法将为您提供结果的整数部分,然后只需将余数部分重复乘以 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...
    

    当然可以通过乘以 10N 一次得到 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
    

    更多详细信息可以在Turn float into string找到

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如前所述,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 寄存器将包含值6AH 寄存器将包含值2,这意味着2/5 的剩余部分为0.4,为您提供答案6.4.

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-20
          • 1970-01-01
          • 2022-06-14
          • 2021-04-25
          • 1970-01-01
          • 1970-01-01
          • 2021-08-24
          • 1970-01-01
          相关资源
          最近更新 更多