Изменение системного времени и даты - Assembler

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

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

Программа должна выводить системное время и дату, и предложить мне поменять их Проблема в том что он её не меняет Помогите пожалуйста Вот что имею
;program get (and set) current time and date (int 1ah)
.model tiny
.code
 
org 100h ; СОМ-program
start:
 
    call show_time  ; display curr time
    mov ah,9
    lea dx,promt    ; show prompt to enter the new time
    int 21h
    lea si,hour     ; read hours
 
    call input      ; 
    cmp cl,0ffh     ; if error
    jz endtime      ; stop enter time
 
    mov dl,':'      ; add ":" after hours
    mov ah,2
    int 21h
    lea si,min      ; read mins
    call input
    mov ch,[hour]
    cmp ch,23h      ; if hours not more than 23
    jg  errortime   ; if more - display error
    mov cl,[min]    ; if mins not more than 59
    cmp cl,59h
    jg  errortime   ; if more - display error
    mov ah,03
    int 1ah         ; setup new time
 
    call show_time  ; display curr time
endtime:
;--date operations
    call show_date  ; display curr date
    mov ah,9
    lea dx,promt2   ; show prompt to enter the new date
    int 21h
    lea si,day      ; read date
    call input
    cmp cl,0ffh     ; if error
    jz enddate      ; close program
    mov dl,'.'      ; add "." as separator
    mov ah,2
    int 21h
    lea si,month    ; read month
    call input
    cmp cl,0ffh     ; if error
    jz enddate      ; close program
    mov dl,'.'      ; add "." as separator
    mov ah,2
    int 21h
    lea si,century  ; read century
    call input
    cmp cl,0ffh     ; if error - close program
    jz enddate
    lea si,year     ; read year, without separator
    call input
    mov dh,[month]
    cmp dh,12h      ; if month more than 12
    jg  errortime   ; close program
    mov dl,[day]
    cmp dl,31h      ; if days more than 31
    jg  errortime   ; close program
    mov ch,[century]    ; load century in ch
    mov cl,[year]       ; load year in cl
    mov ah,5
    int 1ah         ; setup new date
    call show_date  ; display the new date
enddate:
    ret
 
errortime:  ; if time/date was entered incorect then show error msg
    lea dx,ertime
    mov ah,9
    int 21h 
    ret     ; and close program
 
;---input proc. Entered number stored in [si] (in BCD format).
input:
    mov cx,2    ; enter 2 symbols
    mov bx,0    ; number will be created in bx
inhour:
    mov ah,01h
    int 21h     ; get 1 symbol
    cmp al,':'  ; if ":"
    jz endhour
    cmp al,'.'  ; or "."
    jz endhour
    cmp al,2fH  ; if was pressed enter, backspace etc.
    jl endinput
    cmp al,3AH  ; if was entered not number
    jg endinput ; 
    xor ah,ah   ; if all good, then clear ah
    sub al,30h  ; convert symbol to num
    xchg bx,ax  ; ax = bx, bx = ax
    mov dl,10h
    mul dl      ; 
    add bl,al   ; 
    mov [si],bl ; save BCD number in [si]
    loop inhour ;
endhour:
    ret ; close program
 
endinput:
    mov cl,0ffh ; if error while input
    ret         ; close program
 
;---display curr time (got from CMOS)
show_time:
    mov ah,2
    int 1ah     ; get curr time from CMOS
    xor ah,ah
    mov bl,10h
    mov al,ch
    mov [hour],ch   ; 
    div bl          ; div by 10h
    add ax,'00'     ;
    mov word ptr [hourp],ax ; 
    xor ah,ah       ;
    mov al,cl
    mov [min],cl    ; 
    div bl          ; div by 10h
    add ax,'00'     ; 
    mov word ptr [minp],ax  ; 
    xor ah,ah
    mov al,dh
    div bl          ; div by 10h
    add ax,'00'     ; 
    mov word ptr [secp],ax
    mov ah,9
    lea dx,msg      ; show curr time msg
    int 21h
ret

;---display curr date (04 func, int 1ah)
show_date:
    mov ah,04
    int 1ah         ; get curr date and further decompose it into components (day, month etc)
    xor ah,ah
    mov bl,10h
    mov al,ch
    mov [century],ch    ; 
    div bl      ; div by 10h
    add ax,'00' ; 
    mov word ptr [centuryp],ax  ; 
    xor ah,ah
    mov al,cl
    mov [year],cl
    div bl      ; div by 10h
    add ax,'00' ; 
    mov word ptr [yearp],ax
    xor ah,ah
    mov al,dl
    mov [day],dl
    div bl      ; div by 10h
    add ax,'00' ; 
    mov word ptr [dayp],ax
    xor ah,ah
    mov al,dh
    mov [month],dh
    div bl      ; div by 10h
    add ax,'00'     
    mov word ptr [monthp],ax
 
    mov ah,9
    lea dx,msg2     ; display curr date msg
    int 21h
    ret
 
.data
msg     db 0dh,0ah,'Now time is ';  \
hourp   db '00:';                   curr time msg
minp    db '00:';                   /
secp    db '00',0dh,0ah,'$'
promt   db 'Please enter new time in format HH:MM',0dh,0ah,'$' ; enter new time msg
promt2  db 'Please enter new date in format DD.MM.YYYY',0dh,0ah,'$' ; enter new date msg
ertime  db 0dh,0ah,'Error in format time or date$' ; error msg
msg2    db 0dh,0ah,'Now date is ';  \
dayp    db '00.';                   
monthp  db '00.';                   curr date msg
centuryp    db '00';
yearp   db '00',0dh,0ah,'$';        /
hour    db ? ; vars to store hours, mins, century, year, month, day
min     db ?
century db ?
year    db ?
month   db ?
day     db ?
 
end start

Решение задачи: «Изменение системного времени и даты»

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

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


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

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

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