Изменение исходного кода для процессора 8086 - Assembler

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

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

Кто может пожалуйста немного нужно изменить код чтобы отличался от данного

Листинг программы
  1. ;ASGN: N1
  2. ;Buff - строка с паролем
  3. ;MaxLen - Максимальная длина строки
  4. MaxLen equ 100
  5. .286
  6. .model small
  7. .stack 100h
  8. .data
  9. buff db 101 dup(?)
  10. pass db 101 dup(?)
  11. PathtoFile db '1.txt',0
  12. Msg1 db 13,10,'Input password: $'
  13. Msg2 db 13,10,'The password is incorrect$'
  14. Msg_error db 'Error$'
  15. Month db 'January$ '
  16. db 'February$ '
  17. db 'March$ '
  18. db 'April$ '
  19. db 'May$ '
  20. db 'June$ '
  21. db 'July$ '
  22. db 'August$ '
  23. db 'September$'
  24. db 'October$ '
  25. db 'November$ '
  26. db 'December$ '
  27. ln_pass dw 0
  28. handle dw 0
  29. cnt dw 3
  30. s db ":$"
  31. .code
  32. startupcode
  33. Open:
  34. mov ah, 3dh
  35. mov al, 00
  36. lea dx, PathtoFile
  37. int 21h
  38. jc Error
  39. mov handle,ax
  40. jmp Readfile
  41. Error:
  42. mov ah,9
  43. mov dx,offset Msg_error; ссылка на сообщение
  44. int 21h
  45. jmp exit
  46. Readfile:
  47. mov ah, 3fh
  48. mov bx, handle
  49. mov cx, 512
  50. lea dx, pass
  51. int 21h
  52. jc Error
  53. mov ln_pass, ax
  54. PassAttempt:
  55. mov di,offset buff ;Указатель на строку
  56. xor cx,cx ;Счетчик введенных символов обнуляем
  57. ;вывод сообщения
  58. mov ah,9
  59. lea dx, Msg1
  60. int 21h
  61. PassLoop: ;Начало цикла ввода
  62. mov ah,08h
  63. int 21h ;Ждем нажатия клавиши
  64. cmp al,0dh
  65. je EndLoop ;Если Enter то закончить цикл
  66. cmp cx,MaxLen
  67. je PassLoop ;Если конец буфера строки то ждем Enter
  68. mov [di],al ;Помещаем нажатую клавишу в буфер
  69. inc di ;Увеличиваем адрес
  70. inc cx ;Увеличиваем счетчик
  71. mov ah,02h
  72. mov dl,"*"
  73. int 21h ;Выводим звездочку
  74. jmp PassLoop ;На начало цикла
  75. EndLoop:
  76. xor al,al ;Обнуляем al
  77. mov [di],al конец нашей строки 0
  78. push cx
  79. push ds
  80. pop es
  81. lea si, buff
  82. lea di, pass
  83. mov cx, ln_pass
  84. repe cmpsb
  85. pop cx
  86. je PrintDate
  87. ;вывод сообщения
  88. mov ah,9
  89. lea dx, Msg2
  90. int 21h
  91. dec cnt
  92. cmp cnt,0
  93. jne PassAttempt
  94. jmp exit
  95. PrintDate:
  96. ;перевод в начало следущей строки
  97. mov ah,2
  98. mov dl,0dh
  99. int 21h
  100. mov dl,0ah
  101. int 21h
  102. ;получаем дату
  103. mov ah,2ah
  104. int 21h
  105. ;вывод дня
  106. push cx
  107. push dx
  108. xor ax, ax
  109. mov al, dl
  110. call PrintNum
  111. mov ah, 02h
  112. mov dl, " "
  113. int 21h
  114. pop dx
  115. ;вывод месяца
  116. mov ah,10
  117. mov al, dh
  118. dec dh
  119. mov al,dh
  120. mul ah
  121. lea dx, Month
  122. add dx, ax
  123. mov ah, 9
  124. int 21h
  125. mov ah, 02h
  126. mov dl, " "
  127. int 21h
  128. ;вывод года
  129. pop cx
  130. mov ax, cx
  131. call PrintNum
  132. ;перевод в начало следущей строки
  133. mov ah,2
  134. mov dl,0dh
  135. int 21h
  136. mov dl,0ah
  137. int 21h
  138. ;Получаем время
  139. mov ah,2ch
  140. int 21h
  141. ;Вывод часа
  142. push dx
  143. push cx
  144. xor ax,ax
  145. mov al,ch
  146. Call PrintNum
  147. mov ah,9
  148. lea dx,s
  149. int 21h
  150. ;вывод минут
  151. pop cx
  152. xor ax,ax
  153. mov al,cl
  154. Call PrintNum
  155. mov ah,9
  156. lea dx,s
  157. int 21h
  158. ;Вывод секунд
  159. pop dx
  160. xor ax,ax
  161. mov al,dh
  162. Call PrintNum
  163. exit: ; Выход из программы
  164. mov ah, 3eh ;закрытие файла
  165. mov bx, handle
  166. int 21h
  167. mov ah,4ch
  168. int 21h
  169.  
  170. ;Макрос переводящий число в строку (не более 65535)
  171. ;num - число
  172. ;на выходе, в стеке хранится размер и число по разрядам
  173. dectoascii macro num
  174. mov cx,num
  175. xor di,di
  176. mov bx,10
  177. @@1:
  178. inc di
  179. xor dx,dx
  180. mov ax,cx
  181. div bx
  182. push dx
  183. mov cx,ax
  184. cmp cx,0
  185. je @@2
  186. jmp @@1
  187. @@2:
  188. push di
  189. endm
  190. printnum proc
  191. dectoascii ax
  192. ;Вывод на экран
  193. pop cx ;длина числа в cx
  194. @@3:
  195. mov ah,02h
  196. pop dx ;восстанавливаем из стека очередной разряд
  197. add dl,"0"
  198. int 21h
  199. loop @@3
  200. ret
  201. printnum endp
  202. END

Решение задачи: «Изменение исходного кода для процессора 8086»

textual
Листинг программы
  1.     .286
  2.     .model small
  3.     .stack 100h   ; размер стека
  4. ;ASGN: N1
  5. ;Buff - строка с паролем
  6. ;MaxLen - Максимальная длина строки
  7.  
  8.    
  9.     .data
  10. MaxLen  equ 512
  11. buff    db MaxLen+1 dup(0)
  12. pass    db MaxLen+1 dup(0)
  13.  
  14. PathtoFile  db '1.txt',0
  15. Msg1        db 13,10,'Input password: $'
  16. Msg2        db 13,10,'The password is incorrect$'
  17. Msg_error   db 'Error$'
  18. Month       db 'January$        ' ; по 16 символов, чтоб пользоваться сдвигом на 4
  19.             db 'February$       '
  20.             db 'March$          '
  21.             db 'April$          '
  22.             db 'May$            '
  23.             db 'June$           '
  24.             db 'July$           '
  25.             db 'August$         '
  26.             db 'September$      '
  27.             db 'October$        '
  28.             db 'November$       '
  29.             db 'December$       '
  30.  
  31. ln_pass     dw 0
  32. handle      dw 0
  33. cnt         dw 3         ; количество попыток ввода пароля
  34.  
  35.  
  36.     .code
  37. startupcode
  38.     ; Открываем файл на чтение
  39. Open:
  40.     mov ah, 3dh         ; открыть описатель файла
  41.     mov al, 00          ; для чтения
  42.     lea dx, PathtoFile  ; ds:dx адрес строки ASCIIZ с именем файла
  43.     int 21h
  44.     jc Error
  45.     mov handle,ax
  46.     jmp Readfile
  47. Error:
  48.     mov ah,9            ; Выдать строку на дисплей
  49.     lea dx, Msg_error   ; дрес строки, заканчивающейся символом '$'  
  50.     int 21h
  51.     jmp quit
  52.  
  53.     ; Читаем из файла MaxLen байт в буфер pass
  54. Readfile:
  55.     mov ah, 3fh         ; читать файл через описатель
  56.     mov bx, handle      ; описатель файла
  57.     lea dx, pass        ; DS:DX = адрес буфера для чтения данных
  58.     mov cx, MaxLen      ; число считываемых байт
  59.     int 21h
  60.     jc Error
  61.     mov ln_pass, ax
  62.  
  63.     ; читаем с консоли символы в buff (пароль)
  64. PassAttempt:
  65.     mov ah, 09h         ; Выдать строку на дисплей
  66.     lea dx, Msg1        ; дрес строки, заканчивающейся символом '$'  
  67.     int 21h
  68.  
  69.     lea di, buff        ; Указатель на строку
  70.     xor cx, cx          ; Счетчик символов
  71. PassLoop:
  72.     cmp cx, MaxLen 
  73.     je EndLoop
  74.  
  75.     mov ah, 08h         ; Консольный ввод без эха
  76.     int 21h            
  77.     cmp al, 0dh         ; Клавиша Enter
  78.     je EndLoop
  79.    
  80.     mov [di],al         ; Пишем в буфер
  81.     inc di              ; Сдвигаемся по буферу
  82.     inc cx              ; Увеличиваем счетчик
  83.    
  84.     mov ah, 02h         ; вывод на дисплей
  85.     mov dl, '*'
  86.     int 21h
  87.     jmp PassLoop   
  88.  
  89. EndLoop:
  90.     xor al, al  
  91.     mov [di],0          ; Ставим 0 в конец buff
  92.            
  93.     ; сравниваем buff и pass (проверяем пароль) [cx уже содержит количество байт в buff]   
  94.     lea si, buff
  95.     lea di, pass
  96.     cld
  97.     repe cmpsb
  98.        
  99.     je PrintDate
  100.    
  101.     ; проверка не удалась
  102.     mov ah, 09h         ; Выдать строку на дисплей
  103.     lea dx, Msg2        ; дрес строки, заканчивающейся символом '$'  
  104.     int 21h
  105.  
  106.     dec cnt             ; уменьшаем количество попыток
  107.     cmp cnt, 0        
  108.     jne PassAttempt     ; отправляем вводить пароль снова
  109.  
  110.     jmp exit
  111.  
  112. PrintDate:
  113.     ; это перевод в начало следущей строки
  114.     mov ah, 02h        ; вывод на дисплей
  115.     mov dl, 0dh        ; 13
  116.     int 21h
  117.     mov dl, 0ah        ; 10
  118.     int 21h
  119.    
  120.     mov ah, 2ah        ; дать системную дату
  121.     int 21h
  122.     ; AL = день недели (0=Вск, 1=Пнд,...6=Суб) DOS 3.0+
  123.     ; CX = год (1980 до 2099)
  124.     ; DH = месяц (1 до 12)
  125.     ; DL = день (1 до 31)
  126.  
  127.     push cx ; прячем в стеке год
  128.     push dx ; потом месяц и день
  129.    
  130.     ;вывод дня
  131.     movzx ax, dl
  132.     call PrintNum
  133.  
  134.     mov ah, 02h      ; вывод на дисплей (разделитель в дате)
  135.     mov dl, ' '
  136.     int 21h
  137.    
  138.     pop dx
  139.     ;вывод месяца (буквами)
  140.     dec dh
  141.     movzx ax, dh
  142.        
  143.     mov ah, 09h          ; Выдать строку на дисплей
  144.     lea dx, [Month+4*ax] ; DS:DX = адрес строки, заканчивающейся символом '$'  
  145.     int 21h
  146.  
  147.     mov ah, 02h      ; вывод на дисплей (разделитель в дате)
  148.     mov dl, ' '
  149.     int 21h
  150.  
  151.     pop cx
  152.     ;вывод года
  153.     mov ax, cx
  154.     call PrintNum
  155.    
  156.     ; это перевод в начало следущей строки
  157.     mov ah, 02h        ; вывод на дисплей
  158.     mov dl, 0dh        ; 13
  159.     int 21h
  160.     mov dl, 0ah        ; 10
  161.     int 21h
  162.  
  163.    
  164.     mov ah, 2ch         ; дать время DOS
  165.     int 21h
  166.     ; CH = часы (0 до 23)
  167.     ; CL = минуты (0 до 59)
  168.     ; DH = секунды (0 до 59)
  169.     ; DL = сотые доли секунды (0 до 99)
  170.  
  171.    
  172.     push dx   ; пишем в стек секунды и доли
  173.     push cx   ; потом часы и минуты
  174.    
  175.     ;Вывод часа
  176.     movzx ax,ch
  177.     Call PrintNum
  178.  
  179.     mov ah, 02h         ; вывод на дисплей
  180.     mov dl, ':'         ; разделитель чисел
  181.     int 21h
  182.  
  183.     ;вывод минут
  184.     pop cx
  185.     movzx ax,cl
  186.     Call PrintNum
  187.  
  188.     mov ah, 02h         ; вывод на дисплей
  189.     mov dl, ':'         ; разделитель чисел
  190.     int 21h
  191.    
  192.     ;Вывод секунд
  193.     pop dx
  194.     movzx ax,dh
  195.     Call PrintNum
  196.  
  197. exit:
  198.     mov ah, 3eh         ; Закрыть описатель файла
  199.     mov bx, handle      ; описатель файла
  200.     int 21h
  201. quit:
  202.     mov ah, 4ch         ; завершить программу -- EXIT
  203.     int 21h             ; al - код выхода
  204.    
  205.     ;Макрос переводящий число в строку (не более 65535)
  206.     ;num - число
  207.     ;на выходе, в стеке хранится размер и число по разрядам
  208.  
  209. dectoascii macro num
  210.     mov ax, num     ; кладем число в ax
  211.     mov bx, 10      ; будем делить его на 10
  212.     xor di, di      ; количество цифр
  213. @@1:
  214.     inc di
  215.     xor dx, dx      ; (ax:dx = num)
  216.     div bx
  217.     push dx         ; последняя цифра уходит в стек
  218.  
  219.     test ax, ax
  220.     jnz @@1
  221.  
  222.     push di         ; всего цифр тоже отправляем в стек
  223. endm
  224.  
  225. printnum proc
  226.     dectoascii ax  
  227.     pop cx          ; количество цифр (счетчик цикла)
  228. @@3:
  229.     mov ah, 02h     ; вывод на дисплей
  230.     pop dx          ; вынимаем цифру из стека
  231.     add dl, '0'
  232.     int 21h
  233.  
  234.     loop @@3
  235.     ret
  236. printnum endp
  237.  
  238. END

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


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

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

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

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

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

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