Вы используете инструкцию DIV
для вычисления num2 / num1
. DIV
используется для деления чисел без знака . Если вам нужно разделить числа со знаком (положительное и отрицательное), используйте инструкцию IDIV
.
Не забудьте заранее продлить дивиденды, поскольку IDIV [num1]
фактически выполняет EDX:EAX / [num1]
. (cdq
знак расширяет EAX в EDX: EAX, т.е. устанавливает все биты EDX в знаковый бит EAX.)
Частное этого деления уже подписано. Чтобы принять решение о выводе символа «-», достаточно взглянуть на знак числа в EAX
.
Дополнительные комментарии:
. Более разумно перенести инструкции, связанные со знаками, в процедуру преобразования ASCIIToNum .
. Преобразование в двоичное представление не должно использовать деление на 2 (крайне неэффективно). Это легко сделать простым сдвигом вправо.
. Вы можете написать этот код, не требуя отдельной переменной Flag . Вместо этого сохраните и восстановите флаги процессора.
include 'win32ax.inc'
include 'input.inc'
.data
num1 dd 0
num2 dd 0
mes rb 100h
.code
start:
input_dialog
test eax, eax
jz exit
mov esi, eax
call ASCIIToNum
mov [num1], eax
input_dialog
test eax, eax
jz exit
mov esi, eax
call ASCIIToNum
mov [num2], eax
CDQ ;Sign-extend EAX into EDX:EAX
IDIV [num1] ;Signed division of EDX:EAX by [num1]
lea esi, [mes+50]
test eax, eax
pushf
jns .Convert ;Quotient was positive, no NEG needed
neg eax
.Convert:
call NumToASCII
popf
jns .Cout ;Quotient was positive, no '-' needed
dec esi
mov byte [esi], '-'
.Cout:
invoke MessageBox, HWND_DESKTOP, esi, "Div is:", MB_OK
exit:
invoke ExitProcess,0
.end start
.input_resources
; Input: ESI
; Output: EAX
proc ASCIIToNum
push ebx esi
xor eax, eax
movzx ebx, byte [esi]
cmp bl, '-'
pushf
sete bl ;Number is positive, no unary '-' to skip
add esi, ebx
.next:
mov bl, [esi]
inc esi
test bl, bl
jz .done
sub bl, 30h
imul eax, 10
add eax, ebx
jmp .next
.done:
popf
jne .pos ;Number is positive, no NEG needed
neg eax
.pos:
pop esi ebx
ret
endp
; Input: EAX
; Output: ESI, EAX=0
proc NumToASCII
push edx
mov byte [esi], 0
.divloop:
mov dl, '0'
shr eax, 1
adc dl, 0
dec esi
mov [esi], dl
test eax, eax
jnz .divloop
pop edx
ret
endp