Назад | Начало урока | Вперед
Содержание

Глава 2 стр 18
Считываем из файла в массив, из массива в файл в 16-ричном виде (5)
То же, что предыдущее, но запись в новый файл оформлена в виде отдельной функции write_file
MASM
MODEL small

.data ;сегмент данных

File_name db 'bukva04e.bmp',0
tek_el DB 00h
stroka DB 00h ;номер строки ввывода сообщения
kolonka DB 00h ;номер колонки ввывода сообщения
firstp_val DB 00h ;1-я шестнадцатиричная цифра в коде ASCII
secondp_val DB 00h ;2-я шестнадцатиричная цифра в коде ASCII
Handle DW 0FFFFh
temp DB 00h
dlina_str DB 10h ;длина строки в выходном файле
chislo_byte DW 20h ;сколько байт считать и записать
;---------------------------
file_name2 DB "prg_1_2.txt",0
firstp_val1 DB 0Dh ;
secondp_val1 DB 0Ah ;

mas_w label byte
rept 20

db 00h
endm

.stack 256 ;сегмент стека ************************************************

.code ;начало сегмента кода
; === Процедуры (подпрограммы) ===

;******************************************************************************
;Открытие файла ****************************************************************

open_file proc
cmp Handle,0FFFFh
jne Quit_open
mov ax,3D00h
int 21h
mov Handle,ax
ret
Quit_open:
stc
ret
;Handle dw 0FFFFh
open_file endp

;******************************************************************************
;Закрытие файла ****************************************************************

close_file proc
push ax
push bx

;закрытие файла
mov ah,3Eh
mov bx,Handle
int 21h

pop bx
pop ax
ret

close_file endp

;******************************************************************************
;Создание файла****************************************************************
;входные параметры
;dx - ссылка на имя файла

create_file proc
push ax
push cx

mov ah,3Ch ;создать файл
mov cx,00h ;атрибут файла
int 21h
mov Handle,ax ;запоминаем дескриптор (номер) файла

pop cx
pop ax
ret

create_file endp

;******************************************************************************
;Чтение из файла****************************************************************
;входные параметры
;cx - сколько байт будет считано
;dx - адрес, куда будут читаться данные

read_file proc
push ax
push bx

mov bx,Handle ;поместим в bx номер файла
mov ah,3Fh ;Функция чтения файла
int 21h

pop bx
pop ax
ret

read_file endp

;******************************************************************************
;запись в файл****************************************************************
;входные параметры
;cx - сколько байт будет записано
;mas_w[si] - адрес, откуда будут считываться данные
write_file proc

compare:
push cx
mov bl,mas_w[si]
mov tek_el,bl ;в tek_el элемент из массива

call filter
;------------------------------

mov ah,40h ;писать в файл
mov bx,Handle ;дескриптор в bx
mov cx,1 ;число записываемых байт
mov dx,offset firstp_val ;адрес данных для записи
int 21h

mov ah,40h ;писать в файл
mov bx,Handle ;дескриптор в bx
mov cx,1 ;число записываемых байт
mov dx,offset secondp_val ;адрес данных для записи
int 21h

;----------------------------------
inc si ;на следующий элемент
pop cx
dec cx ;условие для выхода из цикла
jcxz exit_new ;cx=0? Если да — на выход

;---зададим длину выводимой строке
inc temp
mov bl,dlina_str
cmp temp,bl
jne pisk
mov temp,00h

;---перенос строки
call perenos_str

pisk: jmp compare ; повторить цикл
exit_new:
ret
write_file endp

;******************************************************************************
;фильтр ввывода на экран, преобразовывает число в шестнадцатиричную форму
*********************
;входные параметры
;tek_el - выводимое число

filter proc
push ax
push dx

;обработка второй тетраэдры ******************************************
mov ah,tek_el ;в ah фильтруемое значение
and ah,00001111b ;выделяем вторую тетраэдру

cmp ah,0Ah ;сравниваем ее с 0Ah
jae symb1 ;переход если AL>=0Ah

add ah,30h ;в al ASCII код цифры соответствующий цифре в al
mov secondp_val,ah ;передача к.с.ц. во внешнюю переменную
jmp tetr2

symb1: ;если цифре соответствует шестнадцатеричная цифра - ABCDEF

add ah,37h ;в al ASCII код цифры соответствующей цифре в al
mov secondp_val,ah ;передача к.с.ц. во внешнюю переменную
jmp tetr2

tetr2: ;обработка второй тетраэдры ***********************************

mov ah,tek_el ;в al фильтруемое значение
shr ah,4 ;сдвиг в вправо на четыре бита для получения первой тетраэдры

cmp ah,0Ah ;сравниваем al с 0Ah
jae symb2 ;переход если AL>=0Ah

add ah,30h ;в al ASCII код цифры соответствующей цифре в al
mov firstp_val,ah ;передача к.с.ц. во внешнюю переменную
jmp exit


symb2:
add ah,37h ;в al ASCII код цифры соответствующей цифре в al
mov firstp_val,ah ;передача к.с.ц. во внешнюю переменную

exit: pop dx

pop ax
ret
filter endp

;******************************************************************************
;процедура перехода на следующую строку **************************************
;входные параметры
;Handle - дескриптор файла
perenos_str proc
push ax
push dx
push cx
xor cx,cx ;обнуление cx

mov ah,40h ;писать в файл
mov bx,Handle ;дескриптор в bx
mov cx,1 ;число записываемых байт
mov dx,offset firstp_val1 ;возврат каретки
int 21h

mov ah,40h ;писать в файл
mov bx,Handle ;дескриптор в bx
mov cx,1 ;число записываемых байт
mov dx,offset secondp_val1 ;перевод строки
int 21h

pop cx
pop dx
pop ax

ret

perenos_str endp

;******************************************************************************
;******************************************************************************
main proc ;начало процедуры main
;инициализация сегмента данных
mov ax,@data
mov ds,ax
mov es,ax
xor ax,ax

; ------------- Откроем файл ----------------
mov dx,offset File_name
call open_file ;Открываем файл
jc error_file ;Ошибка?

; ------------- Прочитаем файл ----------------
mov cx, chislo_byte ;сколько байт будет считано
lea dx, mas_w ;! Адрес, куда будут читаться данные
call read_file

; ------------- Закроем файл ----------------
call close_file

; ------------ Создание нового файла --------
mov dx,offset file_name2
call create_file
jc error_file ;прыжок, если ошибка создания файла
jmp metka2

; --- Не смогли найти / открыть файл
error_file:
mov ah,2
mov dl,7
int 21h
ret

; -------Запишем данные в новый файл ----------------
metka2:
xor ax,ax ;обнуление ax
xor bx,bx ;обнуление bx

mov cx, chislo_byte ;в cx - сколько байт будет записано
mov si,0 ;индекс в si
call write_file

; ------------- Выход ----------------

exit1:
call close_file
mov ax,4c00h ;стандартный выход
int 21h
main endp ;конец процедуры main
end main ;конец программы с точкой входа main



Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz