Вопрос № 23425: ;Больше не могу, голова разваливается.
;Очень прошу!
;Уважаемые программисты напишите за меня процедуру
;вывода чисел на экран.
;Я вообще запутался уже.
;После компиляции этой программы выходит сообщения переполнения
;при деле...
Вопрос № 23.425
;Больше не могу, голова разваливается.
;Очень прошу!
;Уважаемые программисты напишите за меня процедуру
;вывода чисел на экран.
;Я вообще запутался уже.
;После компиляции этой программы выходит сообщения переполнения
;при делении.
Наверное, нужно добавить кучу условий для того,
что бы не происходило переполнение.
В отладчике произошло переполнение пр div (ax=32h)/(si=A)
Я не понял, а почему переполнение произошло?
Наверное из-за остатка 0.
Отправлен: 13.07.2005, 09:48
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!
Остаток тут непричем. Когда в качестве делителя используется 16-разрядный регистр, то в качестве делимого выступает пара регистров dx:ax. После выполнения команды mov ax, dx число в регистрах dx:ax равно 65537*ax. После деления на 10 число равно 6553,7*ax. Частное должно быть помещено в регистр ax, остаток - в регистр dx. Остаток по-любому меньше чем 10. А вот частное может превысить 65535 (максимальное целое число, представимое с помощью 16-ти двоичных разрядов) уже при ax = 10. Поэтому для исправления этой
ситуации тебе нужно начало процедуры переписать так:
xor ax, ax
xchg ax, dx
и переполнения не возникнет.
В Приложении см. процедуру печати числа из регистра DX.
Приложение:
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 13.07.2005, 11:22
Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
добавь sub dx,dx перед делением.
и всё поедет
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 14.07.2005, 22:22