Високосный год - 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 с целью получения первой цифры года.
- Добавление символа к строке.
- Уменьшение указателя на строку.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д