Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx56 / kursach.docx
Скачиваний:
21
Добавлен:
01.08.2013
Размер:
87.59 Кб
Скачать

5.4 Циклы

Для организации циклического выполнения участка кода используется команда loop:

loop метка - декремент счетчика; короткий переход.

Команду loop применяют для организации цикла со счетчиком. Количество повторений цикла задается значением в регистре ecx/cx перед входом в последовательность команд, составляющих тело цикла. Циклическое выполнение, пока содержимое СХ не равно нулю.

5.5 Процедуры

На языке ассемблера процедура оформляется следующим образом:

метка proc тип_адресации

;тело процедуры

метка endp

call цель – вызов процедуры или задачи. Передаёт управление близкой или дальней процедуре с запоминанием в стеке адреса точки возврата.

ret – возврат ближний (дальний) из процедуры. Возврат управления из процедуры вызывающей программе.

5.6 Операции над битами и байтами

В данной курсовой работе использовались также такие операции, как bts и btr.

metka3:

push cx

Call ReadMY

shr [bufer1],2

jc m1

btr [word1], di

inc di

jmp m2

m1:

bts [word1],di

inc di

m2:

Call SetKursor2

Call ReadMY2

Рассмотрим подробно каждую из них:

BTS источник, индекс - извлечение значения заданного бита операнда в флаг cf и установка этого бита в единицу.

Алгоритм работы:

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

- установить флаг cf значением выбранного бита;

- установить значение исходного бита в операнде источник в 1.

BTR источник, индекс - извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.

Алгоритм работы:

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

- установить флаг cf значением выбранного бита;

- установить значение исходного бита в операнде в 0.

6 Используемые функции dos

В программе проводятся действия с различными файлами (Uk64.dat, My.dat, Result.dat). Происходит их закрытие, создание, открытие, запись, считывание из них. Для этого использовались определенные коды, прерывания и функции.

3Dh – функция открытия файла;

3Eh – функция закрытия файла;

3Ch – функция создания файла;

3Fh – функция чтения варианта из файла;

40h – функция записи варианта в файл.

42h – функция установки указателя файла

Для работы с отдельным файлом необходимо указать в регистре BX дескриптор этого файла.

Открытие файла

Вход:

  • AH = 3dH

  • DS:DX = адрес строки ASCIIZ с именем файла

  • AL = режим открытия

Выход:

  • AX = код ошибки если CF установлен и описатель файла если нет ошибки.

Описание:

  • DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0. Если диск и/или путь опущены, они принимаются по умолчанию.

  • файл должен существовать. См. функцию 3cH (создать файл).

  • файл открывается в выбранном режиме доступа / режиме открытия для совместимости с DOS 2.x и избежания сетевых режимов, задавайте:

  • AL = 0 чтобы открыть для чтения

  • AL = 1 чтобы открыть для записи

  • AL = 2 чтобы открыть для чтения и записи

  • указатель чтения/записи устанавливается в 0. См. 42H (LSEEK)

  • вы должны сохранить описатель (handle) для последующих операций

  • разделение файлов должно быть активизировано (команда DOS SHARE), если запрашивается открытие в одном из режимов разделения.

  • CONFIG.SYS специфицирует число доступных описателей файлов.

OpenUK:

; открытие файла UK64.dat

mov ah, 3dh

mov al, 0

lea dx, [UK]

int 21h

mov [dUK],ax

ret

Создание файла

Вход:

  • AH = 3cH

  • DS:DX = адрес строки ASCIIZ с именем файла

  • CX = атрибут файла

Выход:

  • AX = код ошибки если CF установлен и описатель файла если ошибки нет

Описание:

  • DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0. если диск и/или путь опущены, они принимаются по умолчанию.

  • файл создается в указанном (или умалчиваемом) оглавлении

  • файл открывается в режиме доступа чтение/запись

  • следует сохранить описатель (handle) для последующих операций

  • если файл уже существует:

  • при открытии файл усекается до нулевой длины

  • если атрибут файла - только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)

CreateMY:

; Создание файла My.dat

mov ah, 3ch

mov cx, 0

lea dx, [MY]

int 21h

mov [dMY], ax

ret

Чтение данных из файла

Вход:

  • AH = 3fH

  • BX = описатель файла

  • DS:DX = адрес буфера для чтения данных

  • CX = число считываемых байт

Выход:

  • AX = код ошибки если CF установлен или число действительно прочитанных байт

Описание:

  • CX байт данных считываются из файла или устройства с описателем, указанным в BX. данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX.

  • Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла, подготавливая его к последующим операциям чтения или записи.

  • Вы должны всегда сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

  • если AX = CX, (и CF сброшен) - чтение было корректным без ошибок

  • если AX = 0, достигнут конец файла (EOF)

  • если AX < CX (но ненулевой):

  • при чтении с устройства - входная строка имеет длину AX байт

  • при чтении из файла - в процессе чтения достигнут EOF

ReadUK:

; Чтение из файла UK64.dat

mov ah, 3fh

mov bx, [dUK]

lea dx, [str1]

mov cx, 16

int 21h

ret

Закрытие файла

Вход:

  • AH = 3eH

  • BX = описатель файла

Выход:

  • AX = код ошибки если CF установлен

Описание:

  • BX содержит описатель файла (handle), возвращенный при открытии. файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой.

  • Из-за нехватки описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).

CloseUK:

; Закрытие файла UK64.dat

mov ah,3eh

mov bx,[dUK]

int 21h

ret

Запись в файл

Вход:

  • AH = 40H

  • BX = описатель файла

  • DS:DX = адрес буфера, содержащего записываемые данные

  • CX = число записываемых байт

Выход:

  • AX = код ошибки если CF установлен

  • AL = число реально считанных байт (лучший тест для ошибок)

Описание:

  • CX байт данных записывается в файл или на устройство с описателем, заданным в BX. данные берутся из буфера, адресуемого через DS:DX. данные записываются, начиная с текущей позиции указателя чтения/записи файла.

  • Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи.

  • Вы должны всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи).

  • если AX = CX, запись была успешной

  • если AX < CX, встретилась ошибка (скорее всего, переполнение)

RecordMY:

; Запись в файл My.dat

mov ah, 40h

mov bx, [dMY]

mov cx, 16

lea dx, [str1]

int 21h

ret

Установка указателя файла

Вход:

  • AH = 42H

  • BX = описатель файла

  • CX:DX = на сколько передвинуть указатель: (CX * 65536) + DX

  • AL = 0 переместить к началу файла + CX:DX

  • AL = 1 переместить к текущей позиции + CX:DX

  • AL = 2 переместить к концу файла + CX:DX

Выход:

  • AX = код ошибки если CF установлен

  • DX:AX = новая позиция указателя файла (если нет ошибки)

Описание:

  • перемещает логический указатель чтения/записи к нужному адресу. Очередная операция чтения или записи начнется с этого адреса.

Замечание:

Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536)

SetKursor:

; Установка курсора на 7 байт файла My.dat

mov ah, 42h

mov al, 0

xor cx, cx

mov dx, 7

mov bx, [dMY]

int 21h

ret

Соседние файлы в папке docx56