Високосный год - 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

Объяснение кода листинга программы

  1. Устанавливаем модель сегмента данных на small и код на 286.
  2. Привязываем сегмент данных к сегменту переменных.
  3. Задаем код для обработки високосного года.
  4. Переменная sYear используется для хранения строки Year:
  5. Переменная sLeap используется для хранения строки Leap:
  6. Готовность к выполнению команд от пользователя.
  7. Выполнение команд от пользователя.
  8. Выход из программы.
  9. Процедура YearToStr используется для преобразования года в строку.
  10. Деление на 10 с целью получения последней цифры года.
  11. Добавление символа к строке.
  12. Уменьшение указателя на строку.
  13. Проверка на ноль, необходимая для обработки последней цифры года.
  14. Деление на 10 с целью получения средней цифры года.
  15. Добавление символа к строке.
  16. Уменьшение указателя на строку.
  17. Проверка на ноль, необходимая для обработки средней цифры года.
  18. Деление на 10 с целью получения первой цифры года.
  19. Добавление символа к строке.
  20. Уменьшение указателя на строку.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5