С третьего байта записывается вводимая строка, включая последний символ 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 символов. После того как файл создан, в него консольно записана информация необходимо изменить файл, дописав в конец файла Вашу Фамилию, Имя, Отчество. Изменённый файл вывести на консоль.
Получить дату и время создания или последней модификации файла Получить/изменить дату и время создания или модификации файла можно с помощью подфункций функции 57h. Вход: АХ = 5700h; ВХ = дескриптор файла. Выход: Если CF = 0: СХ = время, DX = дата. Если CF = 1: АХ = код ошибки (CF = п. 1 — недопустимый номер подфункции в А1; 6 — недопустимый дескриптор. Время и дата файла получаются в следующих форматах.
Установить дату и время создания или последней модификации файла Вход: АХ = 5701h; ВХ - дескриптор файла; СХ - новое время, DX = новая дата. Выход: Если CF = 0: СХ = время, DX = дата. Если CF = 1 — АХ = код ошибки: 1 — недопустимый номер подфункции в Аl; 6 — недопустимый дескриптор. Изменение характеристик файлов Рассмотрим в качестве примера программу задания даты и времени создания файла (пример 13.4). Пример 7. Назначение файлу даты и времени создания. ;В сегменте команд ;---------------------------Откроем файл --------------------------------- mov AH,3Dh; Функция открытия файла mov AL,2 mov DX,offset fname; Адрес имени файла int 21h mov handle,ax; Получили дескриптор ;---------------Изменим дату и время создания файла --------------- mov ah,57h; Функция даты/времени mov al,1; Установить дату/время mov bx,handle; Дескриптор файла mov сх.,0; очистим Сх or cx,sec; добавим секунды cx=0000 0000 0000 0110 or cx,min; добавим минуты cx=0000 0001 1110 0110 or cx,hour;добавим часы cx=0110 0001 1110 0110 xor dx,dx; очистим dx or dx,day; добавим день or dx,month;добавим месяц or dx,year; добавим год int 21h ;В сегменте данных handle dw 0; ячейка для дескриптора fname db ‘MYFILE.TXT’,0; имя файла sec dw 6; 6 секунд = 110 min dw 15*32; 15 минут =1111 => 001111 00110 hour dw 12*2048; 12 часов =1100 => 01100 001111 00110 day dw 10; 10 число month dw 3*32; март
year dw 21*512 21 год от 1980, то есть 2001 г.
Для установки даты и времени создания файла используется функция 5701h. Она требует указания даты (в регистре DX) и времени (в регистре СХ) в том же формате, в котором эти данные хранятся в элементе каталога. Сдвиг составляющих даты/времени в соответствующие места осуществляется с помощью команд умножения на этапе трансляции. Например, для сдвига числа минут в группу битов 5... 10 число необходимо умножить на 25=32. Переименование имеющегося файла Для переименования имеющегося файла предусмотрена функция 56h. Она требует указания двух спецификаций файла - исходной, чтобы можно было его найти, и новой, присваиваемой файлу. Если в обеих спецификациях указан один и тот же путь к файлу (или имеется только имя файла), осуществляется его переименование; если же пути различаются, функция выполняет перенос файла в другой каталог. Перенос файла в другой каталог не требует копирования файла на другое место диска; файл остается на том же месте, изменяются только записи об этом файле в каталогах.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|