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