Программа не работает, найдите ошибку, пожалуйста - 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
Объяснение кода листинга программы
Список элементов:
- Включаемые файлы: io.asm
- Секции: stack, data, code
- Переменные: stck, vis, nvis
- Код программы: Примечание: В списке элементов указаны только основные составляющие кода, без учета комментариев и дополнительной информации.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д