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