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

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

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

Программа должна выводить системное время и дату, и предложить мне поменять их Проблема в том что он её не меняет Помогите пожалуйста Вот что имею
Листинг программы
  1. ;program get (and set) current time and date (int 1ah)
  2. .model tiny
  3. .code
  4. org 100h ; СОМ-program
  5. start:
  6. call show_time ; display curr time
  7. mov ah,9
  8. lea dx,promt ; show prompt to enter the new time
  9. int 21h
  10. lea si,hour ; read hours
  11. call input ;
  12. cmp cl,0ffh ; if error
  13. jz endtime ; stop enter time
  14. mov dl,':' ; add ":" after hours
  15. mov ah,2
  16. int 21h
  17. lea si,min ; read mins
  18. call input
  19. mov ch,[hour]
  20. cmp ch,23h ; if hours not more than 23
  21. jg errortime ; if more - display error
  22. mov cl,[min] ; if mins not more than 59
  23. cmp cl,59h
  24. jg errortime ; if more - display error
  25. mov ah,03
  26. int 1ah ; setup new time
  27. call show_time ; display curr time
  28. endtime:
  29. ;--date operations
  30. call show_date ; display curr date
  31. mov ah,9
  32. lea dx,promt2 ; show prompt to enter the new date
  33. int 21h
  34. lea si,day ; read date
  35. call input
  36. cmp cl,0ffh ; if error
  37. jz enddate ; close program
  38. mov dl,'.' ; add "." as separator
  39. mov ah,2
  40. int 21h
  41. lea si,month ; read month
  42. call input
  43. cmp cl,0ffh ; if error
  44. jz enddate ; close program
  45. mov dl,'.' ; add "." as separator
  46. mov ah,2
  47. int 21h
  48. lea si,century ; read century
  49. call input
  50. cmp cl,0ffh ; if error - close program
  51. jz enddate
  52. lea si,year ; read year, without separator
  53. call input
  54. mov dh,[month]
  55. cmp dh,12h ; if month more than 12
  56. jg errortime ; close program
  57. mov dl,[day]
  58. cmp dl,31h ; if days more than 31
  59. jg errortime ; close program
  60. mov ch,[century] ; load century in ch
  61. mov cl,[year] ; load year in cl
  62. mov ah,5
  63. int 1ah ; setup new date
  64. call show_date ; display the new date
  65. enddate:
  66. ret
  67. errortime: ; if time/date was entered incorect then show error msg
  68. lea dx,ertime
  69. mov ah,9
  70. int 21h
  71. ret ; and close program
  72. ;---input proc. Entered number stored in [si] (in BCD format).
  73. input:
  74. mov cx,2 ; enter 2 symbols
  75. mov bx,0 ; number will be created in bx
  76. inhour:
  77. mov ah,01h
  78. int 21h ; get 1 symbol
  79. cmp al,':' ; if ":"
  80. jz endhour
  81. cmp al,'.' ; or "."
  82. jz endhour
  83. cmp al,2fH ; if was pressed enter, backspace etc.
  84. jl endinput
  85. cmp al,3AH ; if was entered not number
  86. jg endinput ;
  87. xor ah,ah ; if all good, then clear ah
  88. sub al,30h ; convert symbol to num
  89. xchg bx,ax ; ax = bx, bx = ax
  90. mov dl,10h
  91. mul dl ;
  92. add bl,al ;
  93. mov [si],bl ; save BCD number in [si]
  94. loop inhour ;
  95. endhour:
  96. ret ; close program
  97. endinput:
  98. mov cl,0ffh ; if error while input
  99. ret ; close program
  100. ;---display curr time (got from CMOS)
  101. show_time:
  102. mov ah,2
  103. int 1ah ; get curr time from CMOS
  104. xor ah,ah
  105. mov bl,10h
  106. mov al,ch
  107. mov [hour],ch ;
  108. div bl ; div by 10h
  109. add ax,'00' ;
  110. mov word ptr [hourp],ax ;
  111. xor ah,ah ;
  112. mov al,cl
  113. mov [min],cl ;
  114. div bl ; div by 10h
  115. add ax,'00' ;
  116. mov word ptr [minp],ax ;
  117. xor ah,ah
  118. mov al,dh
  119. div bl ; div by 10h
  120. add ax,'00' ;
  121. mov word ptr [secp],ax
  122. mov ah,9
  123. lea dx,msg ; show curr time msg
  124. int 21h
  125. ret
  126.  
  127. ;---display curr date (04 func, int 1ah)
  128. show_date:
  129. mov ah,04
  130. int 1ah ; get curr date and further decompose it into components (day, month etc)
  131. xor ah,ah
  132. mov bl,10h
  133. mov al,ch
  134. mov [century],ch ;
  135. div bl ; div by 10h
  136. add ax,'00' ;
  137. mov word ptr [centuryp],ax ;
  138. xor ah,ah
  139. mov al,cl
  140. mov [year],cl
  141. div bl ; div by 10h
  142. add ax,'00' ;
  143. mov word ptr [yearp],ax
  144. xor ah,ah
  145. mov al,dl
  146. mov [day],dl
  147. div bl ; div by 10h
  148. add ax,'00' ;
  149. mov word ptr [dayp],ax
  150. xor ah,ah
  151. mov al,dh
  152. mov [month],dh
  153. div bl ; div by 10h
  154. add ax,'00'
  155. mov word ptr [monthp],ax
  156. mov ah,9
  157. lea dx,msg2 ; display curr date msg
  158. int 21h
  159. ret
  160. .data
  161. msg db 0dh,0ah,'Now time is '; \
  162. hourp db '00:'; curr time msg
  163. minp db '00:'; /
  164. secp db '00',0dh,0ah,'$'
  165. promt db 'Please enter new time in format HH:MM',0dh,0ah,'$' ; enter new time msg
  166. promt2 db 'Please enter new date in format DD.MM.YYYY',0dh,0ah,'$' ; enter new date msg
  167. ertime db 0dh,0ah,'Error in format time or date$' ; error msg
  168. msg2 db 0dh,0ah,'Now date is '; \
  169. dayp db '00.';
  170. monthp db '00.'; curr date msg
  171. centuryp db '00';
  172. yearp db '00',0dh,0ah,'$'; /
  173. hour db ? ; vars to store hours, mins, century, year, month, day
  174. min db ?
  175. century db ?
  176. year db ?
  177. month db ?
  178. day db ?
  179. end start

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

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.  
  9. ;Данные
  10. Year            dw      0
  11. Month           dw      0
  12. Day             dw      0
  13. CrLf            db      0Dh, 0Ah, '$'
  14. msgToday        db      'Today ', '$'
  15. msgNewDate      db      'New date ', '$'
  16. PromptDate      db      'Enter new date: ', '$'
  17. kbdBuf          db      11, 0, 11 dup(0)
  18. .code
  19.  
  20. main    proc
  21.         mov     ax,     @data
  22.         mov     ds,     ax
  23.  
  24.         ;получение текущей даты
  25.         call    GetToday
  26.         mov     ah,     09h
  27.         lea     dx,     msgToday
  28.         int     21h
  29.         call    ShowDate
  30.         ;получение даты пользователя
  31.         call    GetUserDate
  32.         ;попытка установить новую дату
  33.         call    SetToday
  34.         ;получение текущей даты с целью контроля установки
  35.         call    GetToday
  36.         mov     ah,     09h
  37.         lea     dx,     msgNewDate
  38.         int     21h
  39.         call    ShowDate
  40.  
  41.         mov     ax,     4C00h
  42.         int     21h
  43. main    endp
  44.  
  45. GetToday        proc
  46.         ;получение текущей даты
  47.         push    ax
  48.         push    bx
  49.         push    cx
  50.         push    dx
  51.  
  52.         mov     ah,     2Ah
  53.         int     21h
  54.         mov     Year,   cx
  55.         mov     ax,     0
  56.         mov     al,     dh
  57.         mov     Month,  ax
  58.         mov     al,     dl
  59.         mov     Day,    ax
  60.  
  61.         pop     dx
  62.         pop     cx
  63.         pop     bx
  64.         pop     ax
  65.  
  66.         ret
  67. GetToday        endp
  68.  
  69. ;установить текущую дату из переменных
  70. SetToday        proc
  71.         push    ax
  72.         push    bx
  73.         push    cx
  74.         push    dx
  75.  
  76.         mov     ah,     2Bh
  77.         mov     cx,     Year
  78.         mov     dh,     byte ptr Month
  79.         mov     dl,     byte ptr Day
  80.         int     21h
  81.  
  82.         pop     dx
  83.         pop     cx
  84.         pop     bx
  85.         pop     ax
  86.  
  87.         ret
  88. SetToday        endp
  89.  
  90. ; выводит число из регистра AX на экран
  91. ; входные данные:
  92. ; ax - число для отображения
  93. Show_AX proc
  94.         push    ax
  95.         push    bx
  96.         push    cx
  97.         push    dx
  98.         push    di
  99.  
  100.         mov     cx, 10
  101.         xor     di, di          ; di - кол. цифр в числе
  102.  
  103.         ; если число в ax отрицательное, то
  104.         ;1) напечатать '-'
  105.         ;2) сделать ax положительным
  106.         or      ax, ax
  107.         jns     @@Conv
  108.         push    ax
  109.         mov     dx, '-'
  110.         mov     ah, 2           ; ah - функция вывода символа на экран
  111.         int     21h
  112.         pop     ax
  113.  
  114.         neg     ax
  115.  
  116. @@Conv:
  117.         xor     dx, dx
  118.         div     cx              ; dl = num mod 10
  119.         add     dl, '0'         ; перевод в символьный формат
  120.         inc     di
  121.         push    dx              ; складываем в стэк
  122.         or      ax, ax
  123.         jnz     @@Conv
  124.         ; выводим из стэка на экран
  125. @@Show:
  126.         pop     dx              ; dl = очередной символ
  127.         mov     ah, 2           ; ah - функция вывода символа на экран
  128.         int     21h
  129.         dec     di              ; повторяем пока di<>0
  130.         jnz     @@Show
  131.  
  132.         pop     di
  133.         pop     dx
  134.         pop     cx
  135.         pop     bx
  136.         pop     ax
  137.         ret
  138. Show_AX endp
  139.  
  140. ;вывод текущей даты в формате 'DD.MM.YYYY'
  141. ShowDate        proc
  142.         push    ax
  143.         push    dx
  144.  
  145.         mov     ax,     Day
  146.         call    Show_AX
  147.         mov     al,     '.'
  148.         int     29h
  149.         mov     ax,     Month
  150.         call    Show_AX
  151.         mov     al,     '.'
  152.         int     29h
  153.         mov     ax,     Year
  154.         call    Show_AX
  155.         mov     ah,     09h
  156.         lea     dx,     CrLf
  157.         int     21h
  158.  
  159.         pop     dx
  160.         pop     ax
  161.         ret
  162. ShowDate        endp
  163.  
  164. GetUserDate     proc
  165.         push    ax
  166.         push    bx
  167.         push    cx
  168.         push    dx
  169.         push    si
  170.         push    di
  171.  
  172.         ;строка приглашения к вводу новой даты
  173.         mov     ah,     09h
  174.         lea     dx,     PromptDate
  175.         int     21h
  176.         ;ввод строки с новой датой
  177.         mov     ah,     0Ah
  178.         lea     dx,     kbdBuf
  179.         int     21h
  180.  
  181.         mov     ah,     09h
  182.         lea     dx,     CrLf
  183.         int     21h
  184.         ;проверка строки на пустоту (нулевую длину)
  185.         mov     cl,     kbdBuf+1        ;cx - длина введённой строки
  186.         mov     ch,     0
  187.  
  188.         cmp     cx,     0
  189.         je      @@Exit
  190.  
  191.         cmp     cx,     10
  192.         jne     @@Exit
  193.  
  194.         lea     si,     kbdBuf+2
  195.         cld
  196.         ;выделение дня из строки
  197.         mov     cx,     2
  198.         mov     al,     0
  199.         mov     bl,     10
  200. @@Day:
  201.         mul     bl
  202.         mov     bh,     al
  203.         lodsb
  204.         cmp     al,     '0'
  205.         jb      @@Exit
  206.         cmp     al,     '9'
  207.         ja      @@Exit
  208.         sub     al,     '0'
  209.         add     al,     bh
  210.         loop    @@Day
  211.         mov     Day,    ax
  212.         lodsb
  213.         ;выделение месяца из строки
  214.         mov     cx,     2
  215.         mov     al,     0
  216.         mov     bl,     10
  217. @@Month:
  218.         mul     bl
  219.         mov     bh,     al
  220.         lodsb
  221.         cmp     al,     '0'
  222.         jb      @@Exit
  223.         cmp     al,     '9'
  224.         ja      @@Exit
  225.         sub     al,     '0'
  226.         add     al,     bh
  227.         loop    @@Month
  228.         mov     Month,  ax
  229.         lodsb
  230.         ;выделение года из строки
  231.         mov     cx,     4
  232.         mov     ax,     0
  233.         mov     bx,     10
  234. @@Year:
  235.         mul     bx
  236.         mov     dx,     ax
  237.         lodsb
  238.         cmp     al,     '0'
  239.         jb      @@Exit
  240.         cmp     al,     '9'
  241.         ja      @@Exit
  242.         sub     al,     '0'
  243.         mov     ah,     0
  244.         add     ax,     dx
  245.         loop    @@Year
  246.         mov     Year,   ax
  247.  
  248. @@Exit:
  249.         pop     di
  250.         pop     si
  251.         pop     dx
  252.         pop     cx
  253.         pop     bx
  254.         pop     ax
  255.         ret
  256. GetUserDate     endp
  257.  
  258. end     main

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


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

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

14   голосов , оценка 4.214 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы