Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 189
от 18.07.2005, 16:20

Администратор:Калашников О.А.
В рассылке:Подписчиков: 247, Экспертов: 15
В номере:Вопросов: 1, Ответов: 2


Вопрос № 23425: ;Больше не могу, голова разваливается. ;Очень прошу! ;Уважаемые программисты напишите за меня процедуру ;вывода чисел на экран. ;Я вообще запутался уже. ;После компиляции этой программы выходит сообщения переполнения ;при деле...

Вопрос № 23.425
;Больше не могу, голова разваливается.
;Очень прошу!
;Уважаемые программисты напишите за меня процедуру
;вывода чисел на экран.
;Я вообще запутался уже.
;После компиляции этой программы выходит сообщения переполнения
;при делении.

CSEG segment
assume cs:CSEG, ds:CSEG, ss:CSEG
org 100h
BEGIN:

mov cx,12-3
mov ax,1
mov bx,1
_m:
mov dx,ax
add ax,bx
mov bx,dx
push ax
push dx
mov dx,ax
add dx,48
call pr1
pop dx
pop ax
loop _m

int 20h

pr1 proc
mov ax,dx
mov si, 10
div si
mov dl, ah

mov ah,2
int 21h

ret
endp

CSEG ends
end BEGIN

; таблица вывода на экран
; 3 4 5 6 7 8 9 10 11 12
;al=1|2|3|5|8|13|21|34|55|89
;bl=1|1|2|3|5|8 |13|21|34|55
;dl=?|1|2|3|5|8 |13|21|34|55

Наверное, нужно добавить кучу условий для того,
что бы не происходило переполнение.
В отладчике произошло переполнение пр 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное