Неправильное вычисление в ассемблере

В приведеном ниже коде после вычисления получается 1. а должно 0,16 но так как у мне нужно целочисленное то 0.Почему в ответе 1 а не ноль.Програма работает корректно. Алгоритм

1.5*2-7*3+9/3=-8
2.(7+3)*5=50

А на последнем шаге ошибка деление 8/50 не дает 0,16 а 1. Код:

bits 64 //res = (a*e-b*c+d/b)/((b+c)*a)
section .data
    a dd 5
    b dw 3
    c dd 7
    d dw 9
    e dd 2
    error_code dd 0

section .bss
    result resd 1

section .text
global _start

_start:
    mov eax, [a]
    imul eax, [e]
    jo overflow

    mov ecx, eax

    movsx ebx, word [b]
    imul ebx, [c]
    jo overflow

    sub ecx, ebx
    jo overflow

    movsx eax, word [d]
    movsx ebx, word [b]
    test ebx, ebx
    jz divide_by_zero

    cdq
    idiv ebx

    add ecx, eax
    jo overflow

    movsx eax, word [b]
    add eax, [c]
    jo overflow

    imul eax, [a]
    jo overflow

    test eax, eax
    jz divide_by_zero

    mov edx, ecx
    cdq
    idiv eax

    mov [result], eax
    mov dword [error_code], 0
    jmp done

overflow:
    mov dword [error_code], 1
    jmp done

divide_by_zero:
    mov dword [error_code], 2

done:
    mov eax, 60
    xor ebx, ebx
    syscall

Ответы (1 шт):

Автор решения: MBo

idiv делит пару регистров EDX:EAX на другой регистр (или переменную в памяти)

Чего вы хотите добиться, выполняя второе деление по сути eax на eax? Cоответственно и получаете 1.

Делимое в EAX положите, старшее слово - EDX в вашем случае обнулить, делитель - например, в ECX, тогда idiv ecx

→ Ссылка