
- •Контрольная работа
- •Тема №1 «Арифметические и логические команды в ассемблере».
- •Тема №3 « Работа с массивами и стеком на языке ассемблера»
- •Тема №4 «Работа с математическим сопроцессором в среде Assembler»
- •Тема №5 «Программирование на языке ассемблера задач с использованием системных ресурсов bios. Работа в графическом режиме»
- •Тема №6 «Работа с файлами в языке Assembler»
Тема №6 «Работа с файлами в языке Assembler»
Условие задачи
Отсортировать строки файла по количеству одинаковых букв
Исходный текст программы
masm
model small
JUMPS ; Разрешаем дальние переходы
.stack 100h
.data
message db 13,10,"Введите имя обрабатываемого файла: $"
message1 db 13,10,"Введите имя создаваемого файла: $"
nameFile db 13 dup(?)
message2 db 10,"Содержимое файла до обработки: ",13,10,'$'
message3 db 10,"Содержимое файла после обработки: ",13,10,'$'
fileStr db 255 dup(?)
MessageErrorOpen db 10,'Ошибка при открытии файла!!!$'
MessageErrorRead db 10,'Ошибка при чтении исходного файла!!!$'
nameFileAfter db 13 dup (?) ; Имя создаваемого файла
handle1 dw 0 ; Дескриптор первого файла
handle2 dw 0 ; Дескриптор второго файла
lengthStr dw 0 ; Длина считанной строки
flagEndFile db 0 ; Флаг для обозначения конца исходного файла
bufStr db '$$' ; Буфер для вывода полученного файла
kolvo db 0
flagOut db 0
.code
start:
mov ax,@data
mov ds,ax ; настройка ds на сегмент данных
mov es,ax
mov ah,9h ; вывод приглашения к вводу
int 21h
cld ; направление работы со строками - прямое
lea di,nameFile ; в di - смещение формируемой строки
mov cl,0FEh
input:
mov ah,1
int 21h ; ввод символа с клавиатуры
cmp al,13 ; проверка на нажатие Enter
je endInput ; если нажат Enter конец ввода
stosb ; записываем введеный символ в цепочку
loop input
endInput:
mov al,0 ; формируем окончание цепочки
stosb
mov al,'$'
stosb
mov ah,9h ; вывод приглашения к вводу
lea dx,message1
int 21h
cld ; направление работы со строками - прямое
lea di,nameFileAfter; в di - смещение формируемой строки
mov cl,0FEh
input2:
mov ah,1
int 21h ; ввод символа с клавиатуры
cmp al,13 ; проверка на нажатие Enter
je endInput2 ; если нажат Enter конец ввода
stosb ; записываем введеный символ в цепочку
loop input2
endInput2:
mov al,0 ; формируем окончание цепочки
stosb
mov al,'$'
stosb
mov ax,3D00h ; Открытие файла
mov dx,offset nameFile
int 21h
jc ErrorOpenFile
mov handle1,ax ; Сохраняем дескриптор
mov ah,3Ch ; Создаем файл
xor cx,cx
mov dx,offset nameFileAfter
int 21h
mov handle2,ax
mov ah,9
lea dx,message2
int 21h
mov kolvo,0 ; Обнуляем текущую длину
working1:
mov ah,42h
mov al,0
mov bx,handle1
mov cx,0
mov dx,0
int 21h
mov flagEndFile,0 ; Перемещаем указатель на начало файла
working: ; Часть программы, в которой происходит прочитываение строки из исходного файла и запись в результирующий файл
lea dx,FileStr
mov bx,handle1
mov cx,1
readString:
mov ah,3Fh
int 21h ; Читаем символ
jc ErrorReadFile ; Проверяем на ошибку при чтении файла
cmp ax,cx
je read ; Был ли прочитан символ?
mov flagEndFile,1 ; Если нет, устанавливаем флаг
dec dx
jmp endRead
read: ; Если символ был прочитан
mov si,dx ; Высчитываем его положение в строке
sub si,offset FileStr
cmp FileStr[si],13 ; Переход, если код - 13
je endRead1
inc dx
jmp readString
endRead1:
inc dx
mov ah,3Fh ; Считываем следующий символ
int 21h
mov si,dx
sub si,offset FileStr
cmp FileStr[si],10 ; Сравниваем с кодом 10
je endRead
jmp readString
endRead:
inc dx
mov si,dx
sub si,offset FileStr
mov FileStr[si],'$' ; Обозначаем конец строки
mov lengthStr,si ; Сохраняем длину строки
cmp flagOut,1
je CmpLetters
lea dx,FileStr
mov ah,9
int 21h ; Выводим строку на экран
CmpLetters:
mov bx,0
mov al,0
FindLetters1:
mov dl,FileStr[bx] ; считываем текущий символ из строки
mov si,bx
inc si
FindLetters2:
mov dh,FileStr[si]
jne NotE
inc al ; если находим, увеличиваем счетчик
NotE:
inc si
cmp si,lengthStr
jb FindLetters2
inc bx
cmp bx,lengthStr
jb FindLetters1
cmp al,kolvo ; Проверяем равенство количества одинаковых букв со счетчиком
jne CheckEndWork
endCreateStr: ; Если длины равны
mov ah,40h
mov bx,handle2 ; Запись во второй файл
mov cx,lengthStr
lea dx,FileStr
int 21h ; запись строки
CheckEndWork:
cmp flagEndFile,1 ; Если был установлен флаг конца файла, окончиваем работу внутреннего цикла
jne working
EndWorking:
mov flagOut,1
inc kolvo ; Увеличиваем счетчик количества букв
mov al,kolvo
cmp al,255
jb working1 ; Если счетчик превысил максимальное возможное количество букв, завершаем работу
endWork: ; Вывод полученного файла
mov ah,9
lea dx,message3
int 21h
mov ax,4200h
mov bx,handle2
xor cx,cx
xor dx,dx
int 21h ; Позиционируем
inc cx
lea dx,bufStr
readBuf:
mov ah,3Fh
int 21h ; Читаем посимвольно
jc ErrorReadFile
cmp ax,cx
jne closeFiles
mov ah,9h
int 21h ; И выводим на экран
jmp readBuf
closeFiles: ; Закрытие файлов
mov ah,3Eh
mov bx,handle1
int 21h
mov bx,handle2
int 21h
exit: ; Выход из программы
mov ah,10h
int 16h
mov ah,4ch
int 21h
ErrorOpenFile: ; Ошибка при открытии файла
mov ah,9
lea dx,MessageErrorOpen
jmp closeFiles
ErrorReadFile: ; Ошибка при чтении файла
mov ah,9
lea dx,MessageErrorRead
int 21h
jmp closeFiles
end start
Результат работы программы
Исходный файл:
Выровнять все строки в файле по правому краю
Выровнять все строки в файле по центру
Выровнять все строки в файле по левому краю
Отформатировать файл таким образом, чтобы длина каждой строки не превышала заданного пользователем значения
Отсортировать строки файла по длинам
Отсортировать строки файла по количеству гласных букв
Отсортировать строки файла по алфавиту по первым трем буквам
Отсортировать строки файла по количеству одинаковых букв
Найти в каждой строке файла заданную пользователем последовательность символов и заменить на введенное слово
Полученный файл:
Выровнять все строки в файле по центру
Отсортировать строки файла по длинам
Выровнять все строки в файле по левому краю
Выровнять все строки в файле по правому краю
Отформатировать файл таким образом, чтобы длина каждой строки не превышала заданного пользователем значения
Отсортировать строки файла по количеству гласных букв
Отсортировать строки файла по количеству одинаковых букв
Найти в каждой строке файла заданную пользователем последовательность символов и заменить на введенное слово
Отсортировать строки файла по алфавиту по первым трем буквам