Разделение сборки больше остатков десятичных чисел, чем один - PullRequest
1 голос
/ 28 мая 2020

Как мне получить больше номеров деления в сборке?
Я могу напечатать только первое десятичное число: 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

1 Ответ

2 голосов
/ 31 мая 2020

Целочисленное деление 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

...