Функция DOS 3Eh — Закрыть файл 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функция DOS 3Eh — Закрыть файл



Ввод:

АН = 3Eh

ВХ = идентификатор

Вывод:

CF = 0, если не произошла ошибка

CF = 1 и АХ = 6, если неправильный идентификатор

 

Если файл был открыт для записи, все файловые буфера сбрасываются на диск, устанавливается время модификации файла и записывается его новая длина.

 

Удаление файла

Функция DOS 41h — Удаление файла

Ввод:

АН = 41h

DS:DX = адрес ASCIZ-строки с полным именем файла

Вывод:

CF = 0, если файл удален

CF = 1 и АН = 02h, если файл не найден, 03h — если путь не найден, 05h — если доступ запрещен

 

Удалить файл можно только после того, как он будет закрыт, так как DOS будет продолжать выполнять запись в несуществующий файл, что может привести к разрушению файловой системы. Функция 41h не позволяет использовать маски (символы * и? в имени файла) для удаления сразу нескольких файлов, хотя этого можно добиться, вызывая ее через недокументированную функцию 5D00h.

 


Основные функции для ввода символов с клавиатуры

Функции 7 и 8 прерывания 21H ожидают ввода символа, если буфер клавиатуры пуст; появление символа на экране не отображается.

Разница между этими функциями в том, что функция 8 распознаёт специальное сочетание клавиш "Ctrl+Break" (при активизации Ctrl+Break выполняется прерывание INT 23h – останов программы), а функция 7 игнорирует это сочетание клавиш.

Функции 7 и 8 возвращают введённый символ в регистр AL. Если AL содержит ASCII 0, то получен расширенный код. При этом необходимо повторить вызов прерывания с теми же параметрами, и в AL появится второй байт расширенного кода.

Расширенные клавишы ASCII (F1-F12, PageUp и т.п.)

Вход: АН 07h
Выход: AL код символа
Вход: АН 08h
Выход: AL код символа

Пример 1.

;--- получаем введённый символMOV AH,8; номер функцииINT 21HCMP AL,0; проверяем на расширенный кодJE EXT_COD; если да, то переход на анализ кода иначе –; обработка символа анализ расширенного кодаEXT_COD: INT 21H; берём второй байт кода CMP AL, 75; проверяем на "стрелка влево" JE CUR_LEFT; переход к обработчику CMP AL, 77; проверяем на "стрелка вправо" JE CUR_RIGHT; переход к обработчику

Функция 01h – ожидание ввода символа с эхопечатью

Вход: АН 01h
Выход: AL символ, полученный из STDIN

Функция 1 прерывания 21H ожидает ввода символа с клавиатуры, если её буфер пуст, а затем выводит его на экран в текущую позицию курсора.

Функция обрабатывает нажатие "Ctrl+Break". Введённый символ сохраняется в регистре AL. Если содержимое AL равно ASCII 0, то для получения расширенного кода необходимо повторить прерывание.

Функция 02h – вывод символа на STDOUT с проверкой на Ctrl+Break

Вход: АН 02h
DL символ, выводимый на устройство стандартного вывода
Выход: Нет ---

Эта функция посылает символ из регистра DL на устройство стандартного вывода.

В DL можно записать как ASCII-код символа, так сам символ. В последнем случае символ заключается в одинарные кавычки. Если при выполнении этой функции была нажата комбинация клавиш Ctrl+Break, то выполняется прерывание INT 23h, которое по умолчанию осуществляет выход из программы.

Данная функция обрабатывает некоторые управляющие символы:

Выводимый символ Действие
BEL (07h) появляется звуковой сигнал
BS (08h) курсор перемещается на одну позицию влево
НТ (09h) используется для замены на несколько пробелов
LF (0Ah) перевод курсора на одну позицию вниз
CR (0Dh) переход на начало текущей строки

Функция 0AH – получение строки символов

Функция 0AH прерывания 21H позволяет вводить строку длиной до 254 символов, выдавая эхо на терминал. Эта функция продолжает ввод символов до тех пор, пока не нажата клавиша "Enter". DS:DX указывает на строку, куда помещаются вводимые символы.

 

Вход: АН 0Ah
DS:DX адрес буфера
Выход: = буфер содержит введенную строку

Первый байт буфера должен содержать максимальное число символов для ввода (от 1 до 254);

Второй байт буфера будет содержать длину реально введенной строки без учета последнего символа CR (клавиша Enter);

С третьего байта записывается вводимая строка, включая последний символ CR (0Dh).

Таким образом, для получения 50 - символьной строки надо отвести под буфер минимум 53 байта памяти:

– в первый байт памяти записать число ASCII 51;

– после ввода 50 символов второй байт дескриптора будет содержать ASCII 50;

– 53-й байт отведённой памяти будет содержать ASCII 13 (0Dh).

Пример 2:

; - - - в сегменте данныхSTRING DB 53 DUP(?); область для 50 символов; - - - получение строки с клавиатурыLEA DX, STRING; DS:DX - адрес строкиMOV BX,DXMOV AL,51; установка длины строки (+1 для CR)MOV [BX], AL; посылаем в первый байт дескриптора; длину строкиMOV AH, 0AH; номер функцииINT 21H; - - - получаем в AH длину строкиMOV AH, [BX]+1; теперь реальная длина в AH

Пример 3:

; Программа считывает строку символов и выводит ее на экран.

;------------------------------------------------------------------------

masm

model small

.stack 100h

.data

crlf DB 0Dh, 0Ah, '$'; символы перехода на начало новой строки

buf DB 6; выделяем буфер для ПЯТИ видимых символов

.code

start:

mov ax,@data

mov ds,ax

MOV DX,offset buf;DX = адрес буфера

MOV AH,0Ah;AH = номер функции 0Аh

INT 21h;вызов функции 0Ah

 

;Если введенную с клавиатуры строку необходимо вывести на экран, то в

;конец строки нужно записать символ $. Для этого нужно получить адрес

;буфера, узнать длину реально введенной строки и прибавить к полученному

;значению 2, т.к. первые 2 байта содержат служебную информацию. Это

;значение будет адресом байта, который следует за последним символом

;строки. В этот адрес и записывается символ $

MOV DХ,offset buf; DХ = адрес буфера

MOV BX,0h; ВХ = 0

MOV BL,[DХ+1]; BL = длинa строки

MOV BYTE PTR [DХ+BX+2], '$'; DХ+BX+2 - адрес, который следует

;за последним символом строки

MOV DX,offset buf; DX = адрес буфера

ADD DX,2h; прибавляем к DX число 2, т.к. первые

; 2 байта не содержат символов строки

MOV AH,9h; вызываем функцию вывода строки

INT 21h

;------------------------------------------------------------------------

mov AX,4C00h

int 21h

end start

 


Пример 4: Эта программа выводит на экран подряд два символа "А" (латинские);------------------------------------------------------------------------

masm

model small

.stack 100h

.data

start:

mov ax,@data

mov ds,ax

MOV AH,2;АН = 2MOV DL,'A';DL = 41h (код символа А)INT 21h;вызываем функцию DOS 02hMOV AH,2;АН = 2MOV DL,41h;DL = 41h (код символа А)INT 21h;вызываем функцию DOS 02h

 

mov AX,4C00h

int 21h

end start

 


Пример 5. Программа с консоли заполняет файл my_file.txt, который находится в текущей папке. Длина строки, вводимой в файл с консоли не более 80 символов. Ввод с консоли прекращается, когда в новой строке в начале вводится «пробел». (WFile1.asm)

________________________________________________________

masm

model small

.stack 100h

buf_0ah struc

len_buf db 83; длина буфера buf_0ah

len_in db 0; количество реально введенных символов строки

buf_in db 82 dup (20h); буфер для ввода строки + 0dh0ah

ends

 

.data

handle dw 0

filename db 'my_file.txt',0

buf buf_0ah <>

 

.code

start:

mov ax,@data

mov ds,ax

;------------- Открываем файл

mov ah,3dh

mov al,2

mov dx,offset filename

int 21h

jc exit

mov handle,ax

;------------- Позиционируем файловый указатель на начало файла

mov ah,42h

xor al,al

xor cx,cx

xor dx,dx

mov bx,handle

int 21h

;--------------Вводим очередную строку с клавиатуры

cycl:

lea dx,buf

mov ah,0ah

int 21h

;--------------для красоты выводим на экран символ 0аh

mov dl,0ah

mov ah,2

int 21h

 

cmp buf.buf_in,20h

je exit

 

lea si,buf.buf_in

mov al,buf.len_in; в al количество реально введённых символов

mov ah,0h

push si

add si,ax

inc si; учитываем в len_in символ 0dh

mov byte ptr [si],0ah; добавляем 0ah в конец введённой строки

;--------------вывод в файл

pop dx

mov bx,handle

add ax,2; учитываем в len_in символы 0dh0ah

mov cx,ax

mov ah,40h

int 21h

jmp cycl

 

exit:

xor ax,ax

mov ah,3eh

mov bx,handle

int 21h

mov AX,4C00h

int 21h

end start

 


Вывод на экран строки

Вход: AH=40h

BX – дескриптор файла;

СХ – Количество байт для запси;

DS:DX – указатель на область из которой записываются данные;

 

Пример 6: Вывести на консоль строку 'Stroka dlya vivoda na ekran funkcieu 40h'. (Vivod1.asm)

masm

model small

.stack 100h

.data

string db 'Stroka dlya vivoda na ekran funkcieu 40h',0

len_string=$-string

 

.code

start:

mov ax,@data

mov ds,ax

mov bx,1

mov cx,len_string

mov dx,offset string

mov ah,40h

int 21h

jc exit

jnc exit1

exit1:

xor ax,ax

mov ah,3eh

mov bx,1

int 21h

exit:

mov AX,4C00h

int 21h

end start

 


Самостоятельно на практике: Разработать программу, которая бы с консоли заполняла файл my_file1.txt в текущей папке. При этом, длина строки, вводимой в файл с консоли должна содержать не более 60 символов. После того как файл создан, в него консольно записана информация необходимо изменить файл, дописав в конец файла Вашу Фамилию, Имя, Отчество. Изменённый файл вывести на консоль.

 


Получить дату и время создания или последней модификации файла



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 288; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.235.150.151 (0.037 с.)