Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Функция 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 и т.п.)
Пример 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 – ожидание ввода символа с эхопечатью
Функция 1 прерывания 21H ожидает ввода символа с клавиатуры, если её буфер пуст, а затем выводит его на экран в текущую позицию курсора. Функция обрабатывает нажатие "Ctrl+Break". Введённый символ сохраняется в регистре AL. Если содержимое AL равно ASCII 0, то для получения расширенного кода необходимо повторить прерывание. Функция 02h – вывод символа на STDOUT с проверкой на Ctrl+Break
Эта функция посылает символ из регистра DL на устройство стандартного вывода. В DL можно записать как ASCII-код символа, так сам символ. В последнем случае символ заключается в одинарные кавычки. Если при выполнении этой функции была нажата комбинация клавиш Ctrl+Break, то выполняется прерывание INT 23h, которое по умолчанию осуществляет выход из программы. Данная функция обрабатывает некоторые управляющие символы:
Функция 0AH – получение строки символов Функция 0AH прерывания 21H позволяет вводить строку длиной до 254 символов, выдавая эхо на терминал. Эта функция продолжает ввод символов до тех пор, пока не нажата клавиша "Enter". 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; просмотров: 333; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.186.27 (0.007 с.) |