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