Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_8-11_Massivy-struktury.doc
Скачиваний:
11
Добавлен:
21.12.2018
Размер:
1.47 Mб
Скачать

Функция 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 и который содержит список имен вложенных файлов, их атрибутов и физических адресов на диске.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]