Написать программу, которая по введенному номеру месяца выводит время года - 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 ;