Распределение и запись символов в файлы - 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 ;
Объяснение кода листинга программы
- Создать символьный файл 'F.txt'
Для этого используется команда
create
F.txtfile: $
(mes0), которая выводит сообщениеCreate
F.txtfile: $
и затем переходит к меткеstart
. - Записать в файл 'G.txt' - большие буквы латинского алфавита
Для этого используется буфер
buffG
, в который записываются символы от ' ' до '9' (32 символа). Затем вызывается функцияcreateFile
, которая создает файл 'G.txt' и записывает в него содержимое буфераbuffG
. - Записать в файл 'B.txt' - цифры
Аналогично, используя буфер
buffB
, в файл 'B.txt' записываются цифры от '0' до '9'. - Записать в файл 'H.txt' - все остальные символы
В буфер
buffH
записываются все остальные символы, включая буквы верхнего и нижнего регистра, знаки препинания и другие символы. Затем вызывается функцияcreateFile
, которая создает файл 'H.txt' и записывает в него содержимое буфераbuffH
. - Вывести на экран результаты
Используя буферы
buffG
,buffB
иbuffH
, выводятся результаты на экран. Сначала выводится сообщениеAll file created! Result...
, затем содержимое буфераbuffG
,buffB
иbuffH
. - Выполнить сортировку
Для сортировки используется буферы
string
,buffG
,buffB
иbuffH
. В буферstring
записываются символы из исходной строки. Затем происходит сортировка: заглавные буквы записываются в буферbuffG
, цифры - вbuffB
, а все остальные символы - вbuffH
. - Создать файлы 'G.txt', 'B.txt' и 'H.txt'
Используя функцию
createFile
, создаются файлы 'G.txt', 'B.txt' и 'H.txt'. После создания каждого файла, в него записывается содержимое соответствующего буфера. - Вывести сообщение и ожидать нажатия клавиши
В конце программы выводится сообщение
нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
и затем программа ожидает нажатия клавиши с помощью функцииint 16h
иint 20h
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д