Распределение и запись символов в файлы - 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'
Для этого используется команда
createF.txtfile: $(mes0), которая выводит сообщениеCreateF.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.