Установка системной даты и времени, введенных пользователем - Assembler
Формулировка задачи:
пользователю предлагають ввести новую дату, если он ввел не пустое значение, то использовать его для установки системной даты.
помогите пожалуста)
использую tasm
как пользоваться 2ch int21h?
Решение задачи: «Установка системной даты и времени, введенных пользователем»
textual
Листинг программы
LOCALS .model small .stack 100h .data ;Данные Year dw 0 Month dw 0 Day dw 0 CrLf db 0Dh, 0Ah, '$' msgToday db 'Today ', '$' msgNewDate db 'New date ', '$' PromptDate db 'Enter new date: ', '$' kbdBuf db 11, 0, 11 dup(0) .code main proc mov ax, @data mov ds, ax ;получение текущей даты call GetToday mov ah, 09h lea dx, msgToday int 21h call ShowDate ;получение даты пользователя call GetUserDate ;попытка установить новую дату call SetToday ;получение текущей даты с целью контроля установки call GetToday mov ah, 09h lea dx, msgNewDate int 21h call ShowDate mov ax, 4C00h int 21h main endp GetToday proc ;получение текущей даты push ax push bx push cx push dx mov ah, 2Ah int 21h mov Year, cx mov ax, 0 mov al, dh mov Month, ax mov al, dl mov Day, ax pop dx pop cx pop bx pop ax ret GetToday endp ;установить текущую дату из переменных SetToday proc push ax push bx push cx push dx mov ah, 2Bh mov cx, Year mov dh, byte ptr Month mov dl, byte ptr Day int 21h pop dx pop cx pop bx pop ax ret SetToday 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 ;вывод текущей даты в формате 'DD.MM.YYYY' ShowDate proc push ax push dx mov ax, Day call Show_AX mov al, '.' int 29h mov ax, Month call Show_AX mov al, '.' int 29h mov ax, Year call Show_AX mov ah, 09h lea dx, CrLf int 21h pop dx pop ax ret ShowDate endp GetUserDate proc push ax push bx push cx push dx push si push di ;строка приглашения к вводу новой даты mov ah, 09h lea dx, PromptDate int 21h ;ввод строки с новой датой mov ah, 0Ah lea dx, kbdBuf int 21h mov ah, 09h lea dx, CrLf int 21h ;проверка строки на пустоту (нулевую длину) mov cl, kbdBuf+1 ;cx - длина введённой строки mov ch, 0 cmp cx, 0 je @@Exit cmp cx, 10 jne @@Exit lea si, kbdBuf+2 cld ;выделение дня из строки mov cx, 2 mov al, 0 mov bl, 10 @@Day: mul bl mov bh, al lodsb cmp al, '0' jb @@Exit cmp al, '9' ja @@Exit sub al, '0' add al, bh loop @@Day mov Day, ax lodsb ;выделение месяца из строки mov cx, 2 mov al, 0 mov bl, 10 @@Month: mul bl mov bh, al lodsb cmp al, '0' jb @@Exit cmp al, '9' ja @@Exit sub al, '0' add al, bh loop @@Month mov Month, ax lodsb ;выделение года из строки mov cx, 4 mov ax, 0 mov bx, 10 @@Year: mul bx mov dx, ax lodsb cmp al, '0' jb @@Exit cmp al, '9' ja @@Exit sub al, '0' mov ah, 0 add ax, dx loop @@Year mov Year, ax @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret GetUserDate endp end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д