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

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

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

Здравствуйте, дан символьный файл f, записать в файл g - большие буквы латинского алфавита, в файл b - цифры, в файл h - все остальные символы. Порядок следования сохранить. Алгоритм действий понимаю, но составить программу, чтобы работала не получается. Смогла организовать только ввод данных в файл f. Но как брать из этого файла и записывать в другой .... помогите!
EXTRN Cursor:Far,Clear:Far,Write_Str:Far,Vvod:Far,Vyvod:Far 
;------------------ Сегмент стека -------------------------
Stacksg   SEGMENT    PARA   STACK
          DW        128 DUP(?)
Stacksg   ENDS
;--------------------- Сегмент данных---------------------
Datasg    SEGMENT    PARA
DTAName  DB ?
 
STR1      LABEL  BYTE
MAXLEN    DB 100 
STRLEN    DB ?
FIELD     DB  100 dup("$")
;------------------
FILEf     LABEL BYTE
FCBDRVf   DB  0
FCBNAMEf  DB  "f       "
FCBEXTf   DB  "txt"     
FCBBLKf   DW  0000      
FCBRCSZf  DW    ?       
      DD    ?   
      DW    ?   
      DT    ?   
FCBSQRCf  DB    00      
FCBOTRCf  DD    ?       
 
FILEg     LABEL BYTE
FCBDRVg   DB  0
FCBNAMEg  DB  "g       "
FCBEXTg   DB  "txt"     
FCBBLKg   DW  0000      
FCBRCSZg  DW    ?       
      DD    ?   
      DW    ?   
      DT    ?   
FCBSQRCg  DB    00      
FCBOTRCg  DD    ?       
 
FILEb     LABEL BYTE
FCBDRVb   DB  0
FCBNAMEb  DB  "b       "
FCBEXTb   DB  "txt"     
FCBBLKb   DW  0000      
FCBRCSZb  DW    ?       
      DD    ?   
      DW    ?   
      DT    ?   
FCBSQRCb  DB    00      
FCBOTRCb  DD    ?       
 
FILEh     LABEL BYTE
FCBDRVh   DB  0
FCBNAMEh  DB  "h       "
FCBEXTh   DB  "txt"     
FCBBLKh   DW  0000      
FCBRCSZh  DW    ?       
      DD    ?   
      DW    ?   
      DT    ?   
FCBSQRCh  DB    00      
FCBOTRCh  DD    ?       
;------------------------------------
Datasg    ENDS
;---------------------Кодовый сегмент --------------------
Codesg    SEGMENT PARA
 begin    PROC     FAR
          ;Пролог EXE-программы.
          ;Выполнение первого требования.
          ASSUME CS:Codesg, DS:Datasg, SS:Stacksg
          ;Выполнение второго требования.
          PUSH  DS         ; Записать DS в стек.
          ;Выполнение третьего требования.
          XOR  AX,AX       ; Установить в нуль AX.
          PUSH  AX         ; Записать AX в стек.
          ;Выполнение четвертого требования.
          MOV   AX,Datasg  ; Занести адрес
          MOV   DS,AX      ; Datasg в DS.
          ;Завершение пролога EXE-программы. 
          CALL  Clear

        MOV AH,1AH       ; для записи данных в файл
    LEA DX,DTAName
    INT 21H
 
    MOV AH,16H       ; создание файла
    LEA DX,FILEf
    INT 21H
    
    MOV  FCBRCSZf,1      
 
    MOV   DX,0000H 
        CALL  Cursor
        
      ; Ввод строки 
      MOV  ah,0AH
          LEA  DX,STR1;
      int  21h

    MOV CX,0
        MOV CL,STRLEN
        MOV SI,0
    MOV AH,15H      ; последовательная заппись
    LEA DX,FILEF
 
MM1:
        MOV BL,BYTE PTR FIELD[SI]
        MOV DTAName,BL
    INT 21H
        INC SI
    LOOP MM1
    
;   MOV AH,10H       ; закрытие
;   LEA DX,FILEF
;   INT 21H 
 
;   MOV AH,0FH       ; открытие
;   LEA DX,FILEF
;   INT 21H 
 
;   MOV  FCBRCSZf,1      
 
        ;Переместить указатель в начало файла
        MOV FCBBLKf,0       
        MOV FCBSQRCf,0
 
    MOV   DX,0500H 
        CALL  Cursor
 
ZZ1:
    MOV AH,14H
    LEA DX,FILEF
    INT 21H
 
        CMP AL,1
        JE  ZZ 
        MOV DL,DTAName
        MOV AH,2
        INT 21H
        JMP ZZ1
ZZ:
    MOV AH,10H       ; закрытие
    LEA DX,FILEF
    INT 21H 
 
    ;Создать 3 файла
        ;Открыть файл f
        ;AA: Прочитать символ
        ;Проверить AL. Если AL = 01, то конец
        ;Проверить символ и записать его в нужный файл
        ;Перейти на AA
        ;Закрыть все файлы
        ;Открыть созданные 3 файла и вывести их содержимое
 
        RET  
 begin    ENDP
Codesg    ENDS
          END  begin

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

textual
Листинг программы
; fasm code...
; Создать символьный файл 'F.txt'.
; Записать в файл 'G.txt' - большие буквы латинского алфавита,
; в файл 'B.txt' - цифры, в файл 'H.txt' - все остальные символы.
; Порядок следования сохранить.
 
org 100h
jmp start
 
mes0      db   13,10,'Create "F.txt" file: $'
mes1      db   13,10,'All file created! Result...',13,10,10,'$'
fName     db   'F.txt',0
 
buffF     db   80                       ; буфер для строки (0Ah)
strLen    db   0                        ;
string    db   80 dup(' ')              ;
buffG     db   32 dup(' '),13,10        ; файловые буфера
buffB     db   32 dup(' '),13,10        ;
buffH     db   32 dup(' '),13,10,'$'    ; выводить на экран будем сразу/три строки
 
start: mov   dx,mes0            ;
       call  message            ;
       mov   ah,0Ah             ; вводим данные в файл-F
       mov   dx,buffF           ;
       int   21h                ;
 
       xor   cx,cx              ;
       mov   dx,fName           ; данные в буфере!
       call  createFile         ; создаём файл F.txt
       mov   cl,[strLen]        ; байт для записи..
       mov   dx,string          ; адрес данных
       call  writeFile          ; запись/закрытие!
 
       mov   cl,[strLen]        ; начинаем сортировку!
       mov   si,string          ; адрес исходной строки
       mov   di,buffG           ; адрес буфера для заглавных
       mov   bx,buffB           ;     ..для цифр
       mov   bp,buffH           ;         ..для остальных
find:  lodsb                    ; читаем из SI
       test  al,100000b         ; проверка на заглавную
       jnz   @@1                ; пропустить если нет
       mov   byte[di],al        ; иначе: сохранить в буфере
       inc   di                 ; сл.позиция в буфере..
       jmp   okey               ; читаем сл.символ из строки
@@1:   cmp   al,'0'             ; фильтр чисел
       jb    @@2                ;
       cmp   al,'9'             ;
       ja    @@2                ;
       mov   byte[bx],al        ; сохранить, если число
       inc   bx                 ;
       jmp   okey
@@2:   mov   byte[bp],al        ; остальное - "в мусорку"
       inc   bp                 ;
okey:  loop  find               ;
 
       mov   byte[fName],'G'    ; меняем букву в имени файла
       mov   dx,fName           ;
       call  createFile         ; создаём файл G.txt
       mov   cx,32              ; байт для записи..
       mov   dx,buffG           ; адрес данных
       call  writeFile          ; запись/закрытие!
 
       mov   byte[fName],'B'    ;
       mov   dx,fName           ;
       call  createFile         ; создаём файл B.txt
       mov   cx,32              ;
       mov   dx,buffB           ;
       call  writeFile          ; запись/закрытие!
 
       mov   byte[fName],'H'    ;
       mov   dx,fName           ;
       call  createFile         ; создаём файл H.txt
       mov   cx,32              ;
       mov   dx,buffH           ;
       call  writeFile          ; запись/закрытие!
 
       mov   dx,mes1            ; выводим все строки на экран
       call  message            ;
       mov   dx,buffG           ;
       call  message            ;
 
exit:  xor   ax,ax              ; ждём клавишу..
       int   16h                ;
       int   20h                ; выход!
 
;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
message:
       mov   ah,9
       int   21h
       ret
;---------------------------------------------------------------------
createFile:                  ; Создать файл!
        mov   ah,3Ch         ;
        mov   cx,20h         ; атрибут архивный
        int   21h            ;
        ret                  ;
;---------------------------------------------------------------------
writeFile:                   ; Запись в файл!
        mov   bx,ax          ; отправляем дескриптор в BX
        mov   ah,40h         ;
        int   21h            ;
        mov   ah,3Eh         ; Закрыть файл
        int   21h            ;
        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
Похожие ответы