Вывести текущую дату (число, месяц, год) - Assembler

Узнай цену своей работы

Формулировка задачи:

Написать на языке ассемблера com-программу, которая позволит вывести текущую дату (число, месяц, год) с использованием текстовых форм на трех языках - русском, английском и украинском.

Решение задачи: «Вывести текущую дату (число, месяц, год)»

textual
Листинг программы
LOCALS
 
.model tiny
 
.code
 
        org     100h
main    proc
 
        jmp     start
 
        ;Данные
Year    dw      0
Month   dw      0
Day     dw      0
 
English         label
        dw      offset  EnJanuary
        dw      offset  EnFebruary
        dw      offset  EnMarch
        dw      offset  EnApril
        dw      offset  EnMay
        dw      offset  EnJune
        dw      offset  EnJuly
        dw      offset  EnAugust
        dw      offset  EnSeptember
        dw      offset  EnOctober
        dw      offset  EnNovember
        dw      offset  EnDecember
 
Ukrainian       label
        dw      offset  UkJanuary
        dw      offset  UkFebruary
        dw      offset  UkMarch
        dw      offset  UkApril
        dw      offset  UkMay
        dw      offset  UkJune
        dw      offset  UkJuly
        dw      offset  UkAugust
        dw      offset  UkSeptember
        dw      offset  UkOctober
        dw      offset  UkNovember
        dw      offset  UkDecember
 
Russian         label
        dw      offset  RuJanuary
        dw      offset  RuFebruary
        dw      offset  RuMarch
        dw      offset  RuApril
        dw      offset  RuMay
        dw      offset  RuJune
        dw      offset  RuJuly
        dw      offset  RuAugust
        dw      offset  RuSeptember
        dw      offset  RuOctober
        dw      offset  RuNovember
        dw      offset  RuDecember
 
EnJanuary       db      'January', '$'
EnFebruary      db      'February', '$'
EnMarch         db      'March', '$'
EnApril         db      'April', '$'
EnMay           db      'May', '$'
EnJune          db      'June', '$'
EnJuly          db      'July', '$'
EnAugust        db      'August', '$'
EnSeptember     db      'September', '$'
EnOctober       db      'October', '$'
EnNovember      db      'November', '$'
EnDecember      db      'December', '$'
 
UkJanuary       db      'Сiчень', '$'
UkFebruary      db      'Лютий', '$'
UkMarch         db      'Березень', '$'
UkApril         db      'Квiтень', '$'
UkMay           db      'Травень', '$'
UkJune          db      'Червень', '$'
UkJuly          db      'Липень', '$'
UkAugust        db      'Серпень', '$'
UkSeptember     db      'Вересень', '$'
UkOctober       db      'Жовтень', '$'
UkNovember      db      'Листопад', '$'
UkDecember      db      'Грудень', '$'
 
RuJanuary       db      'января', '$'
RuFebruary      db      'февраля', '$'
RuMarch         db      'марта', '$'
RuApril         db      'апреля', '$'
RuMay           db      'мая', '$'
RuJune          db      'июня', '$'
RuJuly          db      'июля', '$'
RuAugust        db      'августа', '$'
RuSeptember     db      'сентября', '$'
RuOctober       db      'октября', '$'
RuNovember      db      'ноября', '$'
RuDecember      db      'декабря', '$'
 
CrLf            db      0Dh, 0Ah, '$'
 
start:
        ;программа
        ;получение текущей даты
        mov     ah,     2Ah
        int     21h
        mov     Year,   cx
        mov     ax,     0
        mov     al,     dh
        mov     Month,  ax
        mov     al,     dl
        mov     Day,    ax
        ;вывод текущей даты в формате 'DD.MM.YYYY'
        mov     ax,     Day
        call    OutInt
        mov     al,     '.'
        int     29h
        mov     ax,     Month
        call    OutInt
        mov     al,     '.'
        int     29h
        mov     ax,     Year
        call    Show_AX
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
        ;вывод текущей даты по-английски
        lea     bx,     English
        call    ShowDate
        ;вывод текущей даты по-украински
        lea     bx,     Ukrainian
        call    ShowDate
        ;вывод текущей даты по-русски
        lea     bx,     Russian
        call    ShowDate
 
        int     20h
main    endp
 
;Показывает дату на выбранном языке
;на входе
; bx - адрес таблицы адресов строк
ShowDate        proc
        push    ax
        push    bx
        push    dx
        mov     ax,     Day
        call    OutInt
        mov     al,     ' '
        int     29h
        mov     ax,     Month   ;получаем адрес строки из таблицы по номеру месяца
        dec     ax
        add     bx,     ax
        add     bx,     ax
        mov     ah,     09h
        mov     dx,     [bx]
        int     21h
        mov     al,     ' '
        int     29h
        mov     ax,     Year
        call    Show_AX
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        pop     dx
        pop     bx
        pop     ax
        ret
ShowDate        endp
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
OutInt proc
        push    ax
        push    dx
        aam
        add     ax,3030h
        mov     dl,ah
        mov     dh,al
        mov     ah,02
        int     21h
        mov     dl,dh
        int     21h
        pop     dx
        pop     ax
        ret
OutInt endp
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
end     main

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

Этот код на языке Assembler предназначен для вывода текущей даты в формате 'DD.MM.YYYY'. Он использует функции BIOS для получения даты и времени, а затем выводит их на экран. Код также включает в себя подпрограммы для вывода чисел и строк на экран.

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

13   голосов , оценка 3.538 из 5
Похожие ответы