Установка системной даты и времени, введенных пользователем - Assembler

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

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

пользователю предлагають ввести новую дату, если он ввел не пустое значение, то использовать его для установки системной даты. помогите пожалуста) использую tasm
как пользоваться 2ch int21h?

Решение задачи: «Установка системной даты и времени, введенных пользователем»

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

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


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

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

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

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

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

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