Написать программу, которая по введенному номеру месяца выводит время года - Assembler
Формулировка задачи:
data segment mes1 db 10, 13, 'January$' mes1_e db 10, 13, 'Neverno$' mes2 db 10, 13, 'February$' mes3 db 10, 13, 'March$' mes4 db 10, 13, 'April$' mes5 db 10, 13, 'May$' mes6 db 10, 13, 'June$' mes7 db 10, 13, 'Jule$' mes8 db 10, 13, 'August$' mes9 db 10, 13, 'September$' mes10 db 10, 13, 'October$' mes11 db 10, 13, 'November$' mes12 db 10, 13, 'December$' data ends code segment start: assume cs:code, ds: data mov ax, data mov ds, ax mov ah, 01h ;вводим первый символ и запоминаем его в bl int 21h mov bl, al mov bl, '1' mov ah, 09h lea dx, mes1_e ;пусть символы равны cmp bl, al ;сравниваем их jne m_ne ;если они неравны, переходим на вывод сообщения lea dx, mes2 ;иначе загружаем адрес другой строки lea dx, mes3 lea dx, mes4 m_ne: int 21h mov ah, 01h ;вводим первый символ и запоминаем его в bl int 21h mov bl, al mov bl, '2' mov ah, 09h lea dx, mes3 ;пусть символы неравны cmp bl, al ;сравниваем их jne m_ne1 ;если они неравны, переходим на вывод сообщения lea dx, mes1_e ;иначе загружаем адрес другой строки m_ne1: int 21h mov ah, 01h ;вводим первый символ и запоминаем его в bl int 21h mov bl, al mov bl, '3' mov ah, 09h lea dx, mes4 ;пусть символы неравны cmp bl, al ;сравниваем их jne m_ne2 ;если они неравны, переходим на вывод сообщения lea dx, mes1_e ;иначе загружаем адрес другой строки m_ne2: int 21h mov ax, 4c00h int 21h mov ah, 01h ;вводим первый символ и запоминаем его в bl int 21h mov bl, al mov bl, '4' mov ah, 09h lea dx, mes5 ;пусть символы неравны cmp bl, al ;сравниваем их jne m_ne3 ;если они неравны, переходим на вывод сообщения lea dx, mes1_e ;иначе загружаем адрес другой строки m_ne3: int 21h code ends end start
Решение задачи: «Написать программу, которая по введенному номеру месяца выводит время года»
textual
Листинг программы
;fasm-code.. ;------------ org 100h jmp start table dw m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12 ;таблица переходов err db 10,13, 'Neverno $' m1 db 10,13, 'January $' m2 db 10,13, 'February $' m3 db 10,13, 'March $' m4 db 10,13, 'April $' m5 db 10,13, 'May $' m6 db 10,13, 'June $' m7 db 10,13, 'Jule $' m8 db 10,13, 'August $' m9 db 10,13, 'September$' m10 db 10,13, 'October $' m11 db 10,13, 'November $' m12 db 10,13, 'December $' start: mov cx,2 ; макс.длина ввода xor bx,bx ; здесь будет введённое число @inp: mov ah,1 ; ввод с эхом.. int 21h ; cmp al,13 ; Enter - закончить je @stop ; sub al,'0' ; символ в число shl bx,8 ; сдвинуть ВХ влево (для 2-значного) mov bl,al ; число в BL loop @inp ; @stop: shl bl,4 ; shr bx,4 ; собираем ввод из ВХ в BL or bl,bl ; jz @err ; ноль - ошибка! cmp bl,12h ; jbe @ok ; если <= 12 @err: mov ah,9 ; ERROR! mov dx,err ; int 21h ; jmp @exit ; @ok: test bl,10000b ; проверяем старшую тетраду jz @prn ; значит число меньше 9. sub bl,6 ; иначе: HEX --> DEC @prn: dec bl ; в таблице отсчёт с нуля shl bl,1 ; адрес - 2 байтный, поэтому х2 mov si,table ; адрес таблицы add si,bx ; добавить смещение mov ah,9 ; mov dx,[si] ; взять адрес из таблицы int 21h ; вывод!!! @exit: mov ah,8 ; Go to DOS int 21h ; int 20h ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д