
- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Xor ecx,ecx ;обнуление есx
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •3) Создать и открыть новый файл
- •4) Чтение из файла или устройства
- •5) Переместить указатель чтения/записи
- •1) HFile – хэндл того файла, в котором перемещается указатель.
- •7) Запись в файл или устройство
- •8) Закрыть файл
- •9) Удаление файла
- •Функция 01h – ожидание ввода символа с эхопечатью
- •Функция 0ah – получение строки символов
- •1) Создать каталог
- •2) Удалить каталог
- •5) Определить текущий каталог
- •Перечень функций прерывания 21h, работающих с файлами, которые имеют длинные имена и соответствующие функции api Win32.
- •Перечислим функции api Win32, имеющие отношение к работе с файловой системой.
- •1) В Win32 получить время создания, время последнего доступа и время последней модификации файла можно с помощью функции GetFileTime.
- •3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:
- •Обзор прерываний bios
- •Int 10h, функция 0Dh. Чтение пиксела.
- •02H/03h - Чтение/запись секторов.
- •Прямое программирование видеобуфера в текстовом режиме
- •Текстовый режим. Доступ к памяти
- •Организация памяти в графическом режиме 12h
- •Вычисление адреса Пикселя по экранным координатам.
- •Рисование с помощью регистров Графического Контроллера
- •Установка цвета отдельных пикселей.
- •Прокрутка областей экрана, копирование областей экрана.
- •Чтение отдельных пикселей с экрана.
- •Рисование с помощью регистров Указателя Последовательности
- •Установка цвета ячейки пикселей.
Функция 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,DX
MOV 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 ;АН = 2
MOV DL,'A' ;DL = 41h (код символа А)
INT 21h ;вызываем функцию DOS 02h
MOV AH,2 ;АН = 2
MOV 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 — недопустимый дескриптор.
Время и дата файла получаются в следующих форматах.
CX=Время |
DX=Дата |
||
Биты |
Описание |
Биты |
Описание |
15-11 |
Часы (0-23) |
15-9 |
Год |
10-5 |
Минуты |
8-5 |
Месяц |
4-0 |
Секунды |
4-0 |
День |
Установить дату и время создания или последней модификации файла
Вход: АХ = 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. Она требует указания двух спецификаций файла - исходной, чтобы можно было его найти, и новой, присваиваемой файлу.
Если в обеих спецификациях указан один и тот же путь к файлу (или имеется только имя файла), осуществляется его переименование; если же пути различаются, функция выполняет перенос файла в другой каталог. Перенос файла в другой каталог не требует копирования файла на другое место диска; файл остается на том же месте, изменяются только записи об этом файле в каталогах.
Адрес исходной спецификации должен содержаться в регистрах DS:DX; адрес новой спецификации - в регистрах ES:DI.
Пример 8. Переименование файла
; В сегменте команд
push DS ; Настроим ES на
pop ES ;наш сегмент данных
mov AH,56h ;Функция переименования
mov DX,offset fname1 ;Исходная спецификация
mov DI,offset fname2 ;Новая спецификация
int 21h
;B сегменте данных
fnamel db 'myfile.txt',0
fname2 db 'myfile0l.txt',0
На самом низком уровне каталог — тот же файл, в атрибуте которого бит 4 установлен в 1 и который содержит список имен вложенных файлов, их атрибутов и физических адресов на диске.