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