Распределение и запись символов в файлы - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д