Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Команда div 
V
    Опции темы
Tiglon
Дата 1.4.2013, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Доброго времени суток.
Мое задание состоит в том что бы вывести следующий високосный год от текущего.
Вот к чему я пришел 
Код

CSEG segment
org 100h
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
kod:
    mov al,02h
    mov ah,00h
    int 10h
;----------------------------------------
    mov ah,04h
    int 1ah
    
    mov bx,cx
    xor cx,cx
    mov cx,5
    cycl:
    push bx
    mov  ax,bx
    ;xor bx,bx
    ;mov  bh,00
    mov  bl,4
    div  bx
    cmp  ax,0
    je okloop  
    pop bx
    inc bx
    loop cycl
    
    okloop:
    
    xor cx,cx
    mov cx,bx
    mov al,ch
        call first
        call symbol

    mov al,ch
        call second
        call symbol

    mov al,cl
        call first
        call symbol

    mov al,cl
        call second
        call symbol

First proc
    and al,0f0h
    lea bx,tabl
    shr al,4
    xlat

    ret
First endp
Second proc
    and al,0fh
    lea bx,tabl
    xlat
    ret
Second endp
symbol proc
    lea bx,Got
    mov [bx],al
    mov dx,bx
    mov ah,9h
    int 21h
    ret
symbol endp
;----------------------------------------
    RET
    Got db 1 dup (' '),'$'
    tabl db '0123456789 '
CSEG ends
end kod


Так как мы с преподавателем дошли до согласия что для проверки високосный год или нет достаточно поделить его на 4. Если делиться без остатка он високосный.
Поэтому решил использовать команду div. Но возникла вот какая проблема. 
Вот в этой части кода.
Код

cycl:
    push bx
    mov  ax,bx
    ;xor bx,bx
    ;mov  bh,00
    mov  bl,4
    div  bx
    cmp  ax,0
    je okloop  

Результат мне выдавало 2004 или 2018.
Когда я проверял на дебаггере почему так я заметил что в регистре bx у мена находится не 4 как мне нужно а 2004 так как сначала я в него заношу текущий год. Сначала я решил обнулить регистр bx перед записью в него числа 4 на что мне выдало Divide overflow. Проверяя на дебаггере я увидил что все работает правильно но не понял причины переполнения. После решил по отдельности записать в bh 00 а в bl 04 на что получил тот же результат. 
Объясните пожалуйста почему так ?
Почему я не могу выполнить деление ?
Заранее очень благодарю за помощь.
PM MAIL   Вверх
586
Дата 1.4.2013, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Tiglon @  1.4.2013,  21:52 Найти цитируемый пост)
Сначала я решил обнулить регистр bx перед записью в него числа 4 на что мне выдало Divide overflow.

Обнули ещё регистр DX.
Или вместо команды DIV BX используй команду DIV BL, тогда регистр DX не нужно будет обнулять.

У команды DIV BX в качестве делимого используются регистры DX:AX. В результате деления, частное заносится в регистр AX, а остаток в DX.
У команды DIV BL в качестве делимого используется регистр AX. В результате деления, частное заносится в регистр AL, а остаток в регистр AH.

Это сообщение отредактировал(а) 586 - 1.4.2013, 21:19
PM   Вверх
Tiglon
Дата 1.4.2013, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Цитата

Или вместо команды DIV BX используй команду DIV BL


Код

push bx
    mov  ax,bx
    xor bx,bx
    xor dx,dx
    ;mov  bh,00
    mov  bl,04
    div  bl
    cmp  ah,0


Все дело в том что когда я использую bl то пишет Divide overflow. А вот если использовать bx то выдает результат 2018.

PM MAIL   Вверх
586
Дата 1.4.2013, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Tiglon @  1.4.2013,  22:43 Найти цитируемый пост)
Все дело в том что когда я использую bl то пишет Divide overflow.

При таком числе - да. Используй команду DIV BX.

Цитата(Tiglon @  1.4.2013,  22:43 Найти цитируемый пост)
А вот если использовать bx то выдает результат 2018.

Остаток будет в регистре DX.

Это сообщение отредактировал(а) 586 - 1.4.2013, 21:56
PM   Вверх
Tiglon
Дата 1.4.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Цитата(586 @  1.4.2013,  21:55 Найти цитируемый пост)
Остаток будет в регистре DX.


Оу. В результате получил что-то новенькое ))
Буду сейчас пробовать.
Огромное спасибо smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0752 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.