Я хочу создать программу, которая может вычислять задачи деления. Проблема в том, что моя программа дала сбой, когда я попытался разделить на отрицательное число, хотя я создал ветвь под названием "DivNeg", которая должна была предотвратить сбой. У кого-нибудь есть идеи, как это исправить?
Вот мой ассемблерный код
.386
.model flat
public _Divide
.code
_Divide proc
mov eax, [esp + 4] ; First address ; this is the dividend
mov ebx, [esp + 8] ; Second address ; this is the divisor
cmp ebx, 0
je DivZero
cmp ebx, 0
jnae DivNeg
cdq
idiv ebx ; To divide by eax by ebx
mov ebx, [esp + 12] ; Third address; this is the remainder
jmp Done1
DivZero:
mov eax,-1 ; If user divides by zero, this will set the result to negative 1
mov edx, 0 ; If user divides by zero, this will set the remainder to 0
mov ebx,[esp +12] ; Needed for the remainder if divided by 0
cmp ebx, 0
je Done2
Done1:
mov [ebx], edx
je Done1
DivNeg:
cmp ebx, 0
jge Done2
mov eax, -1
neg eax
je DivNeg
Done2:
ret
_Divide endp
end
je DivZero; je DivNeg
один за другим; а также что должен делать DivNeg? почему есть ascii «-»? - person Paweł Łukasik   schedule 05.10.20170
вebx
и сразу после этого сравниваете с-1
? это бесполезно - jmp никогда не произойдет. Непонимание того, что должен делать DivNeg, мешает оказанию помощи - person Paweł Łukasik   schedule 05.10.2017mov ebx, 0
. Этого не должно было быть в обновленном коде. Причина, по которой я создал циклDivNeg
, заключается в том, что у меня были проблемы со сбоем при делении на отрицательное число, когда у меня его не было. Я хотел создать этот цикл специально на тот случай, если кто-то будет делить на что-то меньшее нуля. Это был единственный способ для моей программы работать. Прошу прощения, если нечетко отвечаю на ваш вопрос. - person Jaquai   schedule 05.10.2017nullptr
для остатка, тогда он рухнет. Кстати,cmp ebx,0
jnae
НИКОГДА не прыгнет. Вам нужно уделять больше внимания инструкции и использовать отладчик. - person Ped7g   schedule 05.10.20170
и возвращаете какой-то неверный результат? Какова цель этого? Это не предотвратит его полный сбой, вы все равно можете сделать этотidiv
сбой с -2147483648/-1 = +2147483648 (DE = ошибка деления из-за переполнения). Так что, если вам нужно какое-то неточное быстрое деление с защитой от сбоев, это не сработает для этого другого особого случая. Скорее правильно обрабатывайте исключение DE в коде, который нуждается в разделении. - person Ped7g   schedule 05.10.2017