【问题标题】:Assembly division more decimal numbers remainders than just one汇编除法的十进制数余数多于一个
【发布时间】:2020-05-28 18:08:56
【问题描述】:

我应该如何在 Assembly 中获得更多的部门编号?
我只能打印第一个十进制数字:c

org 100h ;start

xor edx,edx 
mov eax,1 
mov ebx,7 
div ebx ; 1 / 7  
; EAX / EBX = EAX; remainder IN EDX
; EDX VALUE IS ONLY 1 INSTEAD OF 1428571428571429‬....
; SO instead of printing 0,1428571428571429‬...x 
;(x is how many decimal numbers I want) I can only print out 0,1 :(

mov ax,4c00h;end
int 21h

【问题讨论】:

  • 请注意,div 为您提供余数,而不是小数位。巧合的是,在您的情况下,这个数字等于小数点后的第一位。试试长除法。
  • 感谢您的回答 :) 我是汇编新手,我应该使用函数还是循环?
  • 使用任何你需要的东西来解决问题。如果您不确定,请尝试先用高级语言绘制算法草图,然后再将其翻译成汇编。
  • 指令 div 执行 integer 除法,在您的示例中,它给出商 EAX=0 和余数 EDX=1。如果需要real除法,将内存中的数字定义为floatdivident DD 1.0divisor DD 7.0,然后使用felixcloutier.com/x86/fdiv:fdivp:fidiv

标签: assembly nasm x86-16 division


【解决方案1】:

整数除法 div 在计算 1/7 时会丢失分数,因为它只能将结果的整数部分存储在 EAX 寄存器中。

可以打印计算 1/7 的结果(小数点后 9 位),但仍然只使用整数运算。只需将其放大一点,然后计算 1000000000/7。

    ORG     256

    mov     eax, 1000000000
    mov     ebx, 7
    xor     edx, edx
    div     ebx          ; -> EAX = 142857142 EDX=6
; Rounding to nearest
    shr     ebx
    cmp     ebx, edx
    adc     eax, 0
; Converting to decimal characters
    mov     ebx, 10
    push    bx           ; Sentinel
  NextDiv:
    xor     edx, edx
    div     ebx
    add     dl, '0'
    push    dx
    test    eax, eax
    jnz     NextDiv
; Printing the result
    mov     ah, 02h      ; DOS.PrintChar
    mov     dl, '0'
    int     21h
    mov     dl, '.'
    int     21h
    pop     dx
  NextChar:
    int     21h
    pop     dx
    cmp     dx, bx
    jne     NextChar
; Giving yourself an opportunity to see the result
    mov     ah, 00h      ; BIOS.GetKey
    int     16h
; Quiting the program
    mov     ax, 4C00h    ; DOS.Terminate
    int     21h

上面的程序会打印:

0.142857143

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多