Високосный год - Assembler
Формулировка задачи:
Нужно написать программу, которая позволит вывести на экран данные о первом високосном годе от текущего. Читал аналогичную тему, но видимо я тугой Вывод о первом дне високосного года (com-файл tasm)
Есть программа, которая выводит текущую системную дату:
*Она на трёх языках выводит(но это не важно).
model tiny
.code
org 100h
start: mov ah,2ah
int 21h
mov dwY,cx
mov dbD,dl
mov dbM,dh
mov dbW,al
mov cx,3
lea bx,pLang
@@01: MOV si,[bx]
push bx
push cx
mov al,dbD
xor ah,ah
call outnum
mov bl,dbM
call outinf
mov ax,dwY
call outnum
mov bl,dbW
add bx,12
call outinf
pop cx
pop bx
add bx,2
loop @@01
xor ax,ax
int 16h
ret
outNum: xor cx,cx
mov bx,10
@@02: xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz @@02
@@03: pop ax
or al,'0'
int 29h
loop @@03
ret
outinf: shl bx,1
mov dx,[bx+si]
mov ah,9
int 21h
ret
pLang dw offset dwEn
dw offset dwUa
dw offset dwRu
dwRU dw offset dbDecru
dw offset dbJanru
dw offset dbFebru
dw offset dbMarru
dw offset dbAprru
dw offset dbMayru
dw offset dbJunru
dw offset dbJulru
dw offset dbAugru
dw offset dbSepru
dw offset dbOctru
dw offset dbNovru
dw offset dbSunru
dw offset dbMonru
dw offset dbTueru
dw offset dbWenru
dw offset dbThuru
dw offset dbFriru
dw offset dbSatru
dwEN dw offset dbDecen
dw offset dbJanen
dw offset dbFeben
dw offset dbMaren
dw offset dbApren
dw offset dbMayen
dw offset dbJunen
dw offset dbJulen
dw offset dbAugen
dw offset dbSepen
dw offset dbOcten
dw offset dbNoven
dw offset dbSunen
dw offset dbMonen
dw offset dbTueen
dw offset dbWenen
dw offset dbThuen
dw offset dbFrien
dw offset dbSaten
dwUa dw offset dbDecua
dw offset dbJanua
dw offset dbFebua
dw offset dbMarua
dw offset dbAprua
dw offset dbMayua
dw offset dbJunua
dw offset dbJulua
dw offset dbAugua
dw offset dbSepua
dw offset dbOctua
dw offset dbNovua
dw offset dbSunua
dw offset dbMonua
dw offset dbTueua
dw offset dbWenua
dw offset dbThuua
dw offset dbFriua
dw offset dbSatua
dbJanru db ' џ*ў*ам $'
dbFebru db ' ”Ґўа*«м $'
dbMarru db ' Њ*ав $'
dbAprru db ' ЂЇаҐ«м $'
dbMayru db ' Њ*© $'
dbJunru db ' €о*м $'
dbJulru db ' €о«м $'
dbAugru db ' ЂўЈгбв $'
dbSepru db ' ‘Ґ*впЎам $'
dbOctru db ' ЋЄвпЎам $'
dbNovru db ' Ќ®пЎам $'
dbDecru db ' „ҐЄ*Ўам $'
dbSunru db ' ‚®бЄаҐбҐ*мҐ',13,10,'$'
dbMonru db ' Џ®*Ґ¤Ґ«м*ЁЄ',13,10,'$'
dbTueru db ' ‚в®а*ЁЄ',13,10,'$'
dbWenru db ' ‘।*',13,10,'$'
dbThuru db ' —ҐвўҐаЈ',13,10,'$'
dbFriru db ' Џпв*Ёж*',13,10,'$'
dbSatru db ' ‘гЎЎ®в*',13,10,'$'
dbJanen db ' January $'
dbFeben db ' February $'
dbMaren db ' March $'
dbApren db ' April $'
dbMayen db ' May $'
dbJunen db ' June $'
dbJulen db ' July $'
dbAugen db ' August $'
dbSepen db ' September $'
dbOcten db ' October $'
dbNoven db ' November $'
dbDecen db ' December $'
dbSunen db ' Sunday',13,10,'$'
dbMonen db ' Monday',13,10,'$'
dbTueen db ' Tuesday',13,10,'$'
dbWenen db ' Wednesday',13,10,'$'
dbThuen db ' Thursday',13,10,'$'
dbFrien db ' Friday',13,10,'$'
dbSaten db ' Saturday',13,10,'$'
dbJanua db ' ‘iзҐ*м $'
dbFebua db ' ‹овЁ© $'
dbMarua db ' ЃҐаҐ§Ґ*м $'
dbAprua db ' ЉўiвҐ*м $'
dbMayua db ' ’а*ўҐ*м $'
dbJunua db ' —ҐаўҐ*м $'
dbJulua db ' ‹ЁЇҐ*м $'
dbAugua db ' ‘ҐаЇҐ*м $'
dbSepua db ' ‚ҐаҐбҐ*м $'
dbOctua db ' †®ўвҐ*м $'
dbNovua db ' ‹Ёбв®Ї*¤ $'
dbDecua db ' ѓа㤥*м $'
dbSunua db ' ЌҐ¤?«п',13,10,'$'
dbMonua db ' Џ®*Ґ¤?«®Є',13,10,'$'
dbTueua db ' ‚?ўв®а®Є',13,10,'$'
dbWenua db ' ‘ҐаҐ¤*',13,10,'$'
dbThuua db ' —ҐвўҐа',13,10,'$'
dbFriua db ' Џ"пв*Ёжп',13,10,'$'
dbSatua db ' ‘гЎ®в*',13,10,'$'
dwY dw ?
dbM db ?
dbD db ?
dbW db ?
end startРешение задачи: «Високосный год»
textual
Листинг программы
;[url]http://www.codenet.ru/progr/dos/int_0026.php[/url] .model small .286 .code start: mov ax, @data mov ds, ax ;привязали DS к данным mov ah,2ah int 21h mov ax,cx mov di,ax lea si,sYear call YearToStr mov ax,di go1:inc ax mov di,ax test al,11b jnz go1 mov bl,100 div bl or ah,ah jnz go2 mov ax,di xor dx,dx mov bx,400 div bx mov ax,di or dx,ax jnz go1 go2:mov ax,di lea si,sLeap call YearToStr mov ah,8 ;ждем нажатия клавиши int 21h mov ah, 4ch ;выход int 21h YearToStr proc mov dx,si add si,8 mov bl,10 mov cx,4 go0:div bl add ah,'0' mov [si],ah dec si xor ah,ah loop go0 mov ah,9 int 21h ret endp .data sYear db 'Year: ',13,10,'$' sLeap db 'Leap: ',13,10,'$' .stack 256 end start
Объяснение кода листинга программы
- Устанавливаем модель сегмента данных на small и код на 286.
- Привязываем сегмент данных к сегменту переменных.
- Задаем код для обработки високосного года.
- Переменная sYear используется для хранения строки
Year: - Переменная sLeap используется для хранения строки
Leap: - Готовность к выполнению команд от пользователя.
- Выполнение команд от пользователя.
- Выход из программы.
- Процедура YearToStr используется для преобразования года в строку.
- Деление на 10 с целью получения последней цифры года.
- Добавление символа к строке.
- Уменьшение указателя на строку.
- Проверка на ноль, необходимая для обработки последней цифры года.
- Деление на 10 с целью получения средней цифры года.
- Добавление символа к строке.
- Уменьшение указателя на строку.
- Проверка на ноль, необходимая для обработки средней цифры года.
- Деление на 10 с целью получения первой цифры года.
- Добавление символа к строке.
- Уменьшение указателя на строку.