Вывод символьной строки на экран - Assembler

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

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

Добрый вечер, реализовал программу, условие её такого что нужно из текстового файла прочитать 20 символов начиная с 10-байта в файле. Показать строчку на экране( что у меня не получается!!!!) и записать в новый файл по 4 символа в каждой строчке. Все условие программы у меня реализовано и работает прекрасно, но при выводе строк на экран выдает полнейшую чушь Помогите разобраться
Листинг программы
  1. .386
  2. stak segment
  3. db 100 dup (0)
  4. stak ends
  5. ;сегмент данных
  6. dseg segment
  7. txt1 db 'File Name Read: ',0dh,0ah,'$' ;текст перед запросом на имя файла
  8. txt2 db 'Not Enter FileName!',0dh,0ah,'$' ;неуказано ничего в командной строке, например нажали Enter просто
  9. txt3 db 'Open File Error!',0dh,0ah,'$' ;ошибка открытия файла
  10. txt4 db 'Error Create File!',0dh,0ah,'$' ;ошибка создания файла
  11. txt5 db 'File Name Write: ',0dh,0ah,'$' ;текст перед запросом на имя файла
  12. txt6 db 'Stroka simvolov v file: ',0dh,0ah,'$' ;символы записываемые в файл
  13. perehod db 0dh,0ah,'$' ;перевод строки и возврат коретки
  14. buf_ db 0 ;буфер для чтения 4 байт
  15. des1 dw ? ;хэндл файла который читаем
  16. des2 dw ? ;хэндл файла который создается (tmp.tmp)
  17. kol dw 0
  18. stroch dw 0
  19. ;буфер для файл чтения
  20. max db 254 ;максимально допустимая
  21. len db 0 ;действительная длина данных
  22. buf db 254 dup (0);буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
  23. ;буфер для файл записи
  24. max2 db 254 ;максимально допустимая
  25. len2 db 0 ;действительная длина данных
  26. buf2 db 254 dup (0);буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
  27. dseg ends
  28. cseg segment
  29. assume cs:cseg, ds:dseg, ss:stak
  30. .386
  31. start:
  32. ;настройка DS на сегмент данных
  33. mov ax,dseg
  34. mov ds,ax
  35. ;выводим приглашение
  36. lea dx,txt1 ;текст txt1
  37. call t1 ;процедура вывода текста
  38. ;запрос на ввод строки имя файла
  39. mov ah,0ah
  40. lea dx,max
  41. int 21h
  42. jc exit_1
  43.  
  44. cmp [len],0 ;если len = 0 значит не вводили в строке а нажали Enter
  45. jne d1 ;если len <> 0 то d1
  46. jmp exit_1 ;если 0 то мы ничего ни ввели в командной строке, выход
  47.  
  48. d1:
  49. lea dx,perehod ;строка perehod
  50. call t1 ;вывод текста
  51. ;что то ввели в строке, проверим мож файл?
  52. ;для это поместим в конец строки символ с кодом 0
  53. lea si,buf SI адрес буфера buf
  54. xor bx,bx ;обнулим BX
  55. mov bl,[len] ;длину строки LEN в BL
  56. mov al,0 ;сделаем AL = 0
  57. mov ds:[si+bx],al строке которую мы ввели в конце есть символ 0Dh, адрес ее это буфер buf + дина LEN
  58. ;положим туда AL, а это 0, для открытия файла
  59.  
  60. ;AL = режим открытия, AL = 0 чтобы открыть для чтения
  61. mov ax,3d00h
  62. lea dx,buf ;имя файлов, может включать и путь
  63. int 21h
  64. jnc create_file ;если не было ошибок при открытии
  65.  
  66. ;если файла нет или ошибка была при открытии,выводим текст txt3
  67. lea dx,txt3
  68. call t1
  69. jmp exit_dos ;на метку, выход в дос
  70.  
  71. ;не было ошибок открытия, продолжаем
  72. create_file:
  73. ;сохраним хэндл файла (описатель)
  74. mov [des1],ax
  75. ;выводим приглашение
  76. lea dx,txt5 ;текст txt5
  77. call t1 ;процедура вывода текста
  78. ;опрос на ввода имени для записи
  79. mov ah,0ah
  80. lea dx,max2
  81. int 21h
  82. jnc create2 ;если были ошибки, то закроем файл 1 и выходим
  83. cmp [len2],0 ;если len2 <> 0 то d1
  84. je close2
  85.  
  86. create2:
  87. lea dx,perehod ;строка perehod
  88. call t1 ;вывод текста
  89. ;подготовка к созданию файла
  90. ;что то ввели в строке, проверим мож файл?
  91. ;для это поместим в конец строки символ с кодом 0
  92. lea si,buf2 SI адрес буфера buf2
  93. xor bx,bx ;обнулим BX
  94. mov bl,[len2] ;длину строки LEN в BL
  95. mov al,0 ;сделаем AL = 0
  96. mov ds:[si+bx],al строке которую мы ввели в конце есть символ 0Dh, адрес ее это буфер buf + дина LEN
  97. ;положим туда AL, а это 0, для открытия файла
  98. ;создадим файл указанный в строке buf2
  99. ;Вход AH = 3cH
  100. ;DS:DX = адрес строки ASCIIZ с именем файла
  101. ;CX = атрибут файла
  102. mov ah,3ch
  103. mov cx,20h
  104. lea dx,buf2
  105. int 21h
  106. jnc vse_ok ;не было ошибок при создании файла
  107. ;если ошибки при создании файл
  108. lea dx,txt4
  109. call t1
  110. jmp close2 ;на метку закрытия первого файла
  111.  
  112. vse_ok:
  113. ;сохраним хэндл файла (описатель) (tmp.tmp)
  114. mov [des2],ax
  115.  
  116. ;организуем цикл для чтения и записи
  117. lea dx,txt6
  118. call t1
  119. mov ah,42h
  120. mov bx,[des1]
  121. mov al,0
  122. mov cx,0
  123. mov dx,10
  124. int 21h
  125. cikl:
  126. mov ah,3fh
  127. mov bx,[des1]
  128. lea dx,buf_
  129. push dx
  130. mov cx,1
  131. int 21h
  132. jc close1 ;если при чтении файла была ошибка то на метку close1
  133. ;при чтении в AX возсращается реальное считанное кол-во байт
  134. ;если 0 то закрываем файлы
  135. cmp ax,0
  136. je close1
  137. ;если встретили не конец строки
  138. cmp [buf_],0Dh
  139. jne write1
  140. ;если встретили конец строки
  141. jmp close1
  142.  
  143. write1:
  144. ; Здесь вывод символа на экран но он не работает!!! точнее работает не коректно!
  145. pop dx
  146. push ax
  147. mov ax,dx
  148. add ax,41h
  149. int 29h
  150. pop ax
  151. ; запись в файл ... (работает)
  152. mov cx,ax
  153. mov ah,40h
  154. mov bx,[des2]
  155. lea dx,buf_
  156. int 21h
  157. mov bp,[kol]
  158. cmp bp,19
  159. jz short close1
  160. inc bp
  161. mov [kol],bp
  162. mov bp,[stroch]
  163. cmp bp,3
  164. jz short otv
  165. inc bp
  166. mov [stroch],bp
  167. ;прыгаем на метку cikl
  168. jmp cikl
  169. otv:
  170. mov ah,40h
  171. mov bx,[des2]
  172. lea dx,perehod
  173. mov cx,2
  174. int 21h
  175. mov bp,0
  176. mov [stroch],bp
  177. jmp cikl
  178. ;закрываем файл (временный файл tmp.tmp)
  179. close1:
  180. ;Вход AH = 3eH
  181. ;BX = описатель файла
  182. mov ah,3eh
  183. mov bx,[des2]
  184. int 21h
  185. ;закрываем файл (который указан в командной строке)
  186. close2:
  187. ;Вход AH = 3eH
  188. ;BX = описатель файла
  189. mov ah,3eh
  190. mov bx,[des1]
  191. int 21h
  192. jmp exit_dos ;на метку выход
  193.  
  194. exit_1:
  195. lea dx,txt2 ;не ввели что либо в строке при опросе, выводим текст txt2
  196. call t1
  197.  
  198. exit_dos: ;выход в дос
  199. mov ax,4c00h
  200. int 21h
  201.  
  202. t1 proc ;процедура вывода текста, в DX уже есть строка
  203. mov ah,09h
  204. int 21h
  205. ret
  206. t1 endp
  207. cseg ends
  208.  
  209. end start

Решение задачи: «Вывод символьной строки на экран»

textual
Листинг программы
  1. model small
  2.  stack 256
  3. dataseg
  4.    txt1 db 'File Name Read: ',0dh,0ah,'$'          ;текст перед запросом на имя файла
  5.    txt2 db 'Not Enter FileName!',0dh,0ah,'$'       ;неуказано ничего в командной строке, например нажали Enter просто
  6.    txt3 db 'Open File Error!',0dh,0ah,'$'          ;ошибка открытия файла
  7.    txt4 db 'Error Create File!',0dh,0ah,'$'        ;ошибка создания файла
  8.    txt5 db 'File Name Write: ',0dh,0ah,'$'         ;текст перед запросом на имя файла
  9.    txt6 db 'Stroka simvolov v file: ',0dh,0ah,'$'  ;символы записываемые в файл
  10.    perehod db 0dh,0ah,'$'                          ;перевод строки и возврат коретки
  11.  
  12.     buf_ db 0          ;буфер для чтения 4 байт
  13.     des1 dw ?          ;хэндл файла который читаем
  14.     des2 dw ?          ;хэндл файла который создается (tmp.tmp)
  15.     kol  dw 0
  16.     stroch  dw 0
  17.                        ;буфер для файл чтения
  18.      max db 254        ;максимально допустимая
  19.      len db 0          ;действительная длина данных
  20.      buf db 254 dup (0);буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
  21.  
  22.                        ;буфер для файл записи
  23.     max2 db 254        ;максимально допустимая
  24.     len2 db 0          ;действительная длина данных
  25.     buf2 db 254 dup (0);буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)
  26.  
  27. codeseg
  28.  .386
  29. start:
  30.                  ;настройка DS на сегмент данных
  31.  mov ax,@data
  32.  mov ds,ax
  33.  
  34.                 ;выводим приглашение
  35.  lea dx,txt1    ;текст txt1
  36.  call t1        ;процедура вывода текста
  37.  
  38.                 ;запрос на ввод строки имя файла
  39.  mov ah,0ah
  40.  lea dx,max
  41.  int 21h
  42.  jc exit_1
  43.  
  44.  
  45.  cmp [len],0  ;если len = 0 значит не вводили в строке а нажали Enter
  46.  jne d1       ;если len <> 0 то d1
  47.  jmp exit_1   ;если 0 то мы ничего ни ввели в командной строке, выход
  48.  
  49.  
  50. d1:
  51.  lea dx,perehod      ;строка perehod
  52.  call t1             ;вывод текста
  53.  
  54.                      ;что то ввели в строке, проверим мож файл?
  55.                      ;для это поместим в конец строки символ с кодом 0
  56.  lea si,buf           SI адрес буфера buf
  57.  xor bx,bx           ;обнулим BX
  58.  mov bl,[len]        ;длину строки LEN в BL
  59.  mov al,0            ;сделаем AL = 0
  60.  mov ds:[si+bx],al   строке которую мы ввели в конце есть символ 0Dh, адрес ее это буфер buf + дина LEN
  61.                      ;положим туда AL, а это 0, для открытия файла  
  62.                      
  63.  
  64.                      ;AL = режим открытия, AL = 0 чтобы открыть для чтения
  65.  mov ax,3d00h
  66.  lea dx,buf          ;имя файлов, может включать и путь
  67.  int 21h
  68.  jnc create_file     ;если не было ошибок при открытии
  69.  
  70.  
  71.                    ;если файла нет или ошибка была при открытии,выводим текст txt3
  72.  lea dx,txt3
  73.  call t1
  74.  jmp exit_dos      ;на метку, выход в дос
  75.  
  76.  
  77.                    ;не было ошибок открытия, продолжаем
  78. create_file:
  79.                    ;сохраним хэндл файла (описатель)
  80.  mov [des1],ax
  81.  
  82.                    ;выводим приглашение
  83.  lea dx,txt5       ;текст txt5
  84.  call t1           ;процедура вывода текста
  85.  
  86.                    ;опрос на ввода имени для записи  
  87.  mov ah,0ah
  88.  lea dx,max2
  89.  int 21h
  90.  jnc create2       ;если были ошибки, то закроем файл 1 и выходим      
  91.  
  92.  cmp [len2],0      ;если len2 <> 0 то d1
  93.  je close2
  94.  
  95.  
  96. create2:
  97.  lea dx,perehod    ;строка perehod
  98.  call t1           ;вывод текста
  99.  
  100.                    ;подготовка к созданию файла
  101.                    ;что то ввели в строке, проверим мож файл?
  102.                    ;для это поместим в конец строки символ с кодом 0
  103.  lea si,buf2       SI адрес буфера buf2
  104.  xor bx,bx            ;обнулим BX
  105.  mov bl,[len2]        ;длину строки LEN в BL
  106.  mov al,0             ;сделаем AL = 0
  107.  mov ds:[si+bx],al     строке которую мы ввели в конце есть символ 0Dh, адрес ее это буфер buf + дина LEN
  108.                       ;положим туда AL, а это 0, для открытия файла  
  109.                                      
  110.                       ;создадим файл указанный в строке buf2
  111.                       ;Вход AH = 3cH
  112.                       ;DS:DX = адрес строки ASCIIZ с именем файла
  113.                       ;CX = атрибут файла
  114.  mov ah,3ch
  115.  mov cx,20h
  116.  lea dx,buf2
  117.  int 21h
  118.  jnc vse_ok           ;не было ошибок при создании файла
  119.  
  120.                       ;если ошибки при создании файл
  121.  lea dx,txt4
  122.  call t1
  123.  jmp close2  ;на метку закрытия первого файла
  124.  
  125.  
  126. vse_ok:
  127.                       ;сохраним хэндл файла (описатель) (tmp.tmp)
  128.  mov [des2],ax
  129.  
  130.  
  131.  
  132.  
  133.  
  134.                       ;организуем цикл для чтения и записи
  135.  lea dx,txt6
  136.  call t1
  137.  
  138.  mov ah,42h
  139.  mov bx,[des1]
  140.  mov al,0
  141.  mov cx,0
  142.  mov dx,10
  143.  int 21h
  144.  
  145. cikl:
  146.  
  147.  mov ah,3fh
  148.  mov bx,[des1]
  149.  lea dx,buf_
  150. ; push dx
  151.  mov cx,1
  152.  int 21h  
  153.  jc close1 ;если при чтении файла была ошибка то на метку close1
  154.  
  155.                      ;при чтении в AX возсращается реальное считанное кол-во байт
  156.                      ;если 0 то закрываем файлы
  157.  cmp ax,0
  158.  je close1
  159.  
  160.                      ;если встретили не конец строки
  161.  cmp [buf_],0Dh
  162.  jne write1
  163.  
  164.                      ;если встретили конец строки
  165.  jmp close1
  166.  
  167.  
  168.                
  169. write1:
  170. ; Здесь вывод символа на экран но он не работает!!! точнее работает не коректно!  
  171. ;pop dx
  172.   push ax
  173. ; mov ax,dx  
  174.   mov al,[buf_]
  175. ;add ax,41h                
  176.   int 29h
  177.   pop ax
  178.  
  179. ;запись в файл ... (работает)
  180.  mov cx,ax
  181.  mov ah,40h
  182.  mov bx,[des2]
  183.  lea dx,buf_
  184.  int 21h
  185.  
  186.  mov bp,[kol]
  187.  cmp bp,19
  188.  jz short close1
  189.  inc bp
  190.  mov [kol],bp
  191.  
  192.  mov bp,[stroch]
  193.  cmp bp,3
  194.  jz short otv
  195.  inc bp
  196.  mov [stroch],bp
  197.                       ;прыгаем на метку cikl
  198.  jmp cikl
  199.  
  200. otv:
  201.  mov ah,40h
  202.  mov bx,[des2]
  203.  lea dx,perehod
  204.  mov cx,2
  205.  int 21h
  206.  
  207.  mov bp,0
  208.  mov [stroch],bp
  209.  jmp cikl  
  210.  
  211. ;закрываем файл (временный файл tmp.tmp)
  212. close1:
  213. ;Вход AH = 3eH
  214. ;BX = описатель файла
  215.  mov ah,3eh
  216.  mov bx,[des2]
  217.  int 21h
  218.    
  219. ;закрываем файл (который указан в командной строке)  
  220. close2:
  221. ;Вход AH = 3eH
  222. ;BX = описатель файла
  223.  mov ah,3eh
  224.  mov bx,[des1]
  225.  int 21h
  226.  jmp exit_dos ;на метку выход
  227.  
  228.  
  229.  
  230. exit_1:
  231.    lea dx,txt2      ;не ввели что либо в строке при опросе, выводим текст txt2
  232.    call t1
  233.  
  234.  
  235. exit_dos:           ;выход в дос
  236.    mov ax,4c00h
  237.    int 21h
  238.  
  239.  
  240. t1 proc             ;процедура вывода текста, в DX уже есть строка
  241.    mov ah,09h
  242.    int 21h
  243.    ret
  244. t1 endp
  245.  
  246. end start

Объяснение кода листинга программы

Этот код на языке Assembler выполняет следующие действия:

  1. Запрос на ввод строки имени файла.
  2. Если введено что-то, код проверяет, является ли это именем файла. Если да, то в конце строки добавляется символ 0Dh.
  3. Код открывает файл для чтения и записи, используя введенное имя файла.
  4. Если файл не может быть открыт, код выводит сообщение об ошибке и закрывает файл.
  5. Если файл успешно открыт, код начинает цикл чтения и записи данных из файла в буфер.
  6. В цикле, каждый символ из файла выводится на экран и записывается обратно в файл.
  7. Когда достигается конец строки, код выводит сообщение об успешном завершении операции.
  8. Если в процессе чтения или записи возникают ошибки, код закрывает файлы и выводит сообщение об ошибке.
  9. В конце работы программы, код закрывает оба файла и завершает работу.

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


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

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

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

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

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

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