Распределение и запись символов в файлы - Assembler

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

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

Здравствуйте, дан символьный файл f, записать в файл g - большие буквы латинского алфавита, в файл b - цифры, в файл h - все остальные символы. Порядок следования сохранить. Алгоритм действий понимаю, но составить программу, чтобы работала не получается. Смогла организовать только ввод данных в файл f. Но как брать из этого файла и записывать в другой .... помогите!
Листинг программы
  1. EXTRN Cursor:Far,Clear:Far,Write_Str:Far,Vvod:Far,Vyvod:Far
  2. ;------------------ Сегмент стека -------------------------
  3. Stacksg SEGMENT PARA STACK
  4. DW 128 DUP(?)
  5. Stacksg ENDS
  6. ;--------------------- Сегмент данных---------------------
  7. Datasg SEGMENT PARA
  8. DTAName DB ?
  9. STR1 LABEL BYTE
  10. MAXLEN DB 100
  11. STRLEN DB ?
  12. FIELD DB 100 dup("$")
  13. ;------------------
  14. FILEf LABEL BYTE
  15. FCBDRVf DB 0
  16. FCBNAMEf DB "f "
  17. FCBEXTf DB "txt"
  18. FCBBLKf DW 0000
  19. FCBRCSZf DW ?
  20. DD ?
  21. DW ?
  22. DT ?
  23. FCBSQRCf DB 00
  24. FCBOTRCf DD ?
  25. FILEg LABEL BYTE
  26. FCBDRVg DB 0
  27. FCBNAMEg DB "g "
  28. FCBEXTg DB "txt"
  29. FCBBLKg DW 0000
  30. FCBRCSZg DW ?
  31. DD ?
  32. DW ?
  33. DT ?
  34. FCBSQRCg DB 00
  35. FCBOTRCg DD ?
  36. FILEb LABEL BYTE
  37. FCBDRVb DB 0
  38. FCBNAMEb DB "b "
  39. FCBEXTb DB "txt"
  40. FCBBLKb DW 0000
  41. FCBRCSZb DW ?
  42. DD ?
  43. DW ?
  44. DT ?
  45. FCBSQRCb DB 00
  46. FCBOTRCb DD ?
  47. FILEh LABEL BYTE
  48. FCBDRVh DB 0
  49. FCBNAMEh DB "h "
  50. FCBEXTh DB "txt"
  51. FCBBLKh DW 0000
  52. FCBRCSZh DW ?
  53. DD ?
  54. DW ?
  55. DT ?
  56. FCBSQRCh DB 00
  57. FCBOTRCh DD ?
  58. ;------------------------------------
  59. Datasg ENDS
  60. ;---------------------Кодовый сегмент --------------------
  61. Codesg SEGMENT PARA
  62. begin PROC FAR
  63. ;Пролог EXE-программы.
  64. ;Выполнение первого требования.
  65. ASSUME CS:Codesg, DS:Datasg, SS:Stacksg
  66. ;Выполнение второго требования.
  67. PUSH DS ; Записать DS в стек.
  68. ;Выполнение третьего требования.
  69. XOR AX,AX ; Установить в нуль AX.
  70. PUSH AX ; Записать AX в стек.
  71. ;Выполнение четвертого требования.
  72. MOV AX,Datasg ; Занести адрес
  73. MOV DS,AX ; Datasg в DS.
  74. ;Завершение пролога EXE-программы.
  75. CALL Clear
  76.  
  77. MOV AH,1AH ; для записи данных в файл
  78. LEA DX,DTAName
  79. INT 21H
  80. MOV AH,16H ; создание файла
  81. LEA DX,FILEf
  82. INT 21H
  83. MOV FCBRCSZf,1
  84. MOV DX,0000H
  85. CALL Cursor
  86. ; Ввод строки
  87. MOV ah,0AH
  88. LEA DX,STR1;
  89. int 21h
  90.  
  91. MOV CX,0
  92. MOV CL,STRLEN
  93. MOV SI,0
  94. MOV AH,15H ; последовательная заппись
  95. LEA DX,FILEF
  96. MM1:
  97. MOV BL,BYTE PTR FIELD[SI]
  98. MOV DTAName,BL
  99. INT 21H
  100. INC SI
  101. LOOP MM1
  102. ; MOV AH,10H ; закрытие
  103. ; LEA DX,FILEF
  104. ; INT 21H
  105. ; MOV AH,0FH ; открытие
  106. ; LEA DX,FILEF
  107. ; INT 21H
  108. ; MOV FCBRCSZf,1
  109. ;Переместить указатель в начало файла
  110. MOV FCBBLKf,0
  111. MOV FCBSQRCf,0
  112. MOV DX,0500H
  113. CALL Cursor
  114. ZZ1:
  115. MOV AH,14H
  116. LEA DX,FILEF
  117. INT 21H
  118. CMP AL,1
  119. JE ZZ
  120. MOV DL,DTAName
  121. MOV AH,2
  122. INT 21H
  123. JMP ZZ1
  124. ZZ:
  125. MOV AH,10H ; закрытие
  126. LEA DX,FILEF
  127. INT 21H
  128. ;Создать 3 файла
  129. ;Открыть файл f
  130. ;AA: Прочитать символ
  131. ;Проверить AL. Если AL = 01, то конец
  132. ;Проверить символ и записать его в нужный файл
  133. ;Перейти на AA
  134. ;Закрыть все файлы
  135. ;Открыть созданные 3 файла и вывести их содержимое
  136. RET
  137. begin ENDP
  138. Codesg ENDS
  139. END begin

Решение задачи: «Распределение и запись символов в файлы»

textual
Листинг программы
  1. ; fasm code...
  2. ; Создать символьный файл 'F.txt'.
  3. ; Записать в файл 'G.txt' - большие буквы латинского алфавита,
  4. ; в файл 'B.txt' - цифры, в файл 'H.txt' - все остальные символы.
  5. ; Порядок следования сохранить.
  6.  
  7. org 100h
  8. jmp start
  9.  
  10. mes0      db   13,10,'Create "F.txt" file: $'
  11. mes1      db   13,10,'All file created! Result...',13,10,10,'$'
  12. fName     db   'F.txt',0
  13.  
  14. buffF     db   80                       ; буфер для строки (0Ah)
  15. strLen    db   0                        ;
  16. string    db   80 dup(' ')              ;
  17. buffG     db   32 dup(' '),13,10        ; файловые буфера
  18. buffB     db   32 dup(' '),13,10        ;
  19. buffH     db   32 dup(' '),13,10,'$'    ; выводить на экран будем сразу/три строки
  20.  
  21. start: mov   dx,mes0            ;
  22.        call  message            ;
  23.        mov   ah,0Ah             ; вводим данные в файл-F
  24.        mov   dx,buffF           ;
  25.        int   21h                ;
  26.  
  27.        xor   cx,cx              ;
  28.        mov   dx,fName           ; данные в буфере!
  29.        call  createFile         ; создаём файл F.txt
  30.        mov   cl,[strLen]        ; байт для записи..
  31.        mov   dx,string          ; адрес данных
  32.        call  writeFile          ; запись/закрытие!
  33.  
  34.        mov   cl,[strLen]        ; начинаем сортировку!
  35.        mov   si,string          ; адрес исходной строки
  36.        mov   di,buffG           ; адрес буфера для заглавных
  37.        mov   bx,buffB           ;     ..для цифр
  38.        mov   bp,buffH           ;         ..для остальных
  39. find:  lodsb                    ; читаем из SI
  40.        test  al,100000b         ; проверка на заглавную
  41.        jnz   @@1                ; пропустить если нет
  42.        mov   byte[di],al        ; иначе: сохранить в буфере
  43.        inc   di                 ; сл.позиция в буфере..
  44.        jmp   okey               ; читаем сл.символ из строки
  45. @@1:   cmp   al,'0'             ; фильтр чисел
  46.        jb    @@2                ;
  47.        cmp   al,'9'             ;
  48.        ja    @@2                ;
  49.        mov   byte[bx],al        ; сохранить, если число
  50.        inc   bx                 ;
  51.        jmp   okey
  52. @@2:   mov   byte[bp],al        ; остальное - "в мусорку"
  53.        inc   bp                 ;
  54. okey:  loop  find               ;
  55.  
  56.        mov   byte[fName],'G'    ; меняем букву в имени файла
  57.        mov   dx,fName           ;
  58.        call  createFile         ; создаём файл G.txt
  59.        mov   cx,32              ; байт для записи..
  60.        mov   dx,buffG           ; адрес данных
  61.        call  writeFile          ; запись/закрытие!
  62.  
  63.        mov   byte[fName],'B'    ;
  64.        mov   dx,fName           ;
  65.        call  createFile         ; создаём файл B.txt
  66.        mov   cx,32              ;
  67.        mov   dx,buffB           ;
  68.        call  writeFile          ; запись/закрытие!
  69.  
  70.        mov   byte[fName],'H'    ;
  71.        mov   dx,fName           ;
  72.        call  createFile         ; создаём файл H.txt
  73.        mov   cx,32              ;
  74.        mov   dx,buffH           ;
  75.        call  writeFile          ; запись/закрытие!
  76.  
  77.        mov   dx,mes1            ; выводим все строки на экран
  78.        call  message            ;
  79.        mov   dx,buffG           ;
  80.        call  message            ;
  81.  
  82. exit:  xor   ax,ax              ; ждём клавишу..
  83.        int   16h                ;
  84.        int   20h                ; выход!
  85.  
  86. ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
  87. message:
  88.        mov   ah,9
  89.        int   21h
  90.        ret
  91. ;---------------------------------------------------------------------
  92. createFile:                  ; Создать файл!
  93.         mov   ah,3Ch         ;
  94.         mov   cx,20h         ; атрибут архивный
  95.         int   21h            ;
  96.         ret                  ;
  97. ;---------------------------------------------------------------------
  98. writeFile:                   ; Запись в файл!
  99.         mov   bx,ax          ; отправляем дескриптор в BX
  100.         mov   ah,40h         ;
  101.         int   21h            ;
  102.         mov   ah,3Eh         ; Закрыть файл
  103.         int   21h            ;
  104.         ret                  ;

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

  1. Создать символьный файл 'F.txt' Для этого используется команда createF.txtfile: $ (mes0), которая выводит сообщение CreateF.txtfile: $ и затем переходит к метке start.
  2. Записать в файл 'G.txt' - большие буквы латинского алфавита Для этого используется буфер buffG, в который записываются символы от ' ' до '9' (32 символа). Затем вызывается функция createFile, которая создает файл 'G.txt' и записывает в него содержимое буфера buffG.
  3. Записать в файл 'B.txt' - цифры Аналогично, используя буфер buffB, в файл 'B.txt' записываются цифры от '0' до '9'.
  4. Записать в файл 'H.txt' - все остальные символы В буфер buffH записываются все остальные символы, включая буквы верхнего и нижнего регистра, знаки препинания и другие символы. Затем вызывается функция createFile, которая создает файл 'H.txt' и записывает в него содержимое буфера buffH.
  5. Вывести на экран результаты Используя буферы buffG, buffB и buffH, выводятся результаты на экран. Сначала выводится сообщение All file created! Result..., затем содержимое буфера buffG, buffB и buffH.
  6. Выполнить сортировку Для сортировки используется буферы string, buffG, buffB и buffH. В буфер string записываются символы из исходной строки. Затем происходит сортировка: заглавные буквы записываются в буфер buffG, цифры - в buffB, а все остальные символы - в buffH.
  7. Создать файлы 'G.txt', 'B.txt' и 'H.txt' Используя функцию createFile, создаются файлы 'G.txt', 'B.txt' и 'H.txt'. После создания каждого файла, в него записывается содержимое соответствующего буфера.
  8. Вывести сообщение и ожидать нажатия клавиши В конце программы выводится сообщение нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн и затем программа ожидает нажатия клавиши с помощью функции int 16h и int 20h.

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


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

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

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

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

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

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