Вывести текущую дату (число, месяц, год) - 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 для получения даты и времени, а затем выводит их на экран. Код также включает в себя подпрограммы для вывода чисел и строк на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д