Изменение системного времени и даты - 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