Установка системной даты и времени, введенных пользователем - 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

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

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