- •Содержание
- •Введение
- •1 Нормативные ссылки
- •2 Спецификация задачи
- •3 Формулировка задачи
- •4 Используемые регистры
- •4.2 Сегментные регистры
- •5 Используемые команды
- •5.1 Команды пересылки и загрузки
- •5.2 Арифметические команды
- •5.2.1 Сложение
- •5.2.2 Вычитание
- •5.2.3 Умножение
- •5.2.4 Деление
- •5.2.5 Изменение знака операнда
- •5.2.6 Увеличение операнда на 1
- •5.2.7 Уменьшение операнда на 1
- •5.3 Команды сдвига
- •5.4 Циклы
- •5.5 Процедуры
- •5.6 Операции над битами и байтами
- •6 Используемые функции dos
- •7 Алгоритм решения задачи
- •7.1 Разработка алгоритма основной программы
- •7.2 Разработка алгоритма процедуры поиска нулевой строки
- •7.3 Разработка алгоритма процедуры формирования слов
- •8 Описание программы
- •8. 1 Программа выбора варианта №5, формирования и записи слов (Приложение а)
- •8.2 Программа построения графика (Приложение б)
- •9 Результаты машинного тестирования
- •Заключение
- •Список используемых источников
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