Программа не работает, найдите ошибку, пожалуйста - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго вечера всем читающим. Пишу программу на ассемблере (masm) по универскому заданию. Сразу скажу, в этом деле я новичок, поэтому код достаточно корявый. Задание: "С клавиатуры вводится целое 16-битное беззнаковое число А. Определить, является ли год А високосным и вывести ответ на экран. Високосными считаются года кратные 4, НО из всех годов, кратных 100, високосные только те, что кратны 400 (т.е. 1700, 1800, 1900 - не високосные, 1600, 2000 - високосные) Мой код:
include io.asm 
stack segment stack
    dw 128 dup (?)
stack ends
data segment
    assume ss:stack, ds:data, cs:code
vis db 'javljaetsja visokosnym$'
nvis db 'ne javljaetsja visokosnym$'
data ends
code segment 'code'
    assume ss:stack, ds:data, cs:code
start:
        mov ax,data
        mov ds,ax
        mov ax,100
        inint bx
    mov cx,bx
        div bx
        cmp dx,0
        jz L1
        jnz L2
 
L1:    mov ax,400
        div cx
        cmp dx,0
        jz L3
        jnz L4
 
L2:    mov ax,4
        div cx
        cmp dx,0
        jz L3
        jnz L4
 
L3:    mov dx,offset vis
        outstr
        jmp L5
 
L4:    mov dx,offset nvis
        outstr
        
L5:
        
finish
code ends
end start
Кажется, что все правильно, но программа ВСЕГДА выводит, что год не високосный.. Подскажите, в чем ошибка.

Решение задачи: «Программа не работает, найдите ошибку, пожалуйста»

textual
Листинг программы
include io.asm
 
stck    segment stack
        dw      128 dup (?)
stck    ends
 
data    segment
        assume ss:stck, ds:data, cs:code
vis     db      'javljaetsja visokosnym$'
nvis    db      'ne javljaetsja visokosnym$'
data    ends
 
code    segment 'code'
        assume ss:stck, ds:data, cs:code
start:
        mov     ax, data        ; Инициализируем сегмент данных
        mov     ds, ax
 
        inint   ax              ; ax <- число, введённое с клавиатуры
        mov     cx, ax          ; Сохраняем число в cx
 
;----- Проверяем, делится ли год на 4 без остатка
 
        mov     bx, 4           ; Поделим dx:ax (год) на bx (4)
        xor     dx, dx          ; Содержимое dx нас не интересует
        div     bx              ; Выполняем деление
        test    dx, dx          ; Остаток равен нулю?
        jnz     no              ; Если нет, год не является високосным
 
;----- Проверяем, делится ли год на 100 без остатка
 
        mov     bx, 100
        mov     ax, cx
        div     bx
        test    dx, dx          ; Остаток равен нулю?
        jnz     yes             ; Если нет, год високосный и проверку
                                ; с делением на 400 можно пропустить
 
;----- Год делится на 100, поэтому проверяем, делится ли на 400
 
        mov     bx, 400
        mov     ax, cx
        div     bx
        test    dx, dx          ; Остаток равен нулю?
        jnz     no              ; Если нет, год не является високосным
 
yes:                            ; Это високосный год
        mov     dx,offset vis   ; Адресуем строку с этим сообщением
        jmp     short exit      ; Пропускаем противоположное утверждение
 
no:
        mov     dx,offset nvis  ; Это не високосный год
 
exit:
        outstr                  ; Выводим сообщение на экран
        finish                  ; Завершаем работу программы
code    ends
 
        end     start

Объяснение кода листинга программы

Список элементов:

  1. Включаемые файлы: io.asm
  2. Секции: stack, data, code
  3. Переменные: stck, vis, nvis
  4. Код программы: Примечание: В списке элементов указаны только основные составляющие кода, без учета комментариев и дополнительной информации.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы