
- •Утверждаю
- •Системное программирование
- •Содержание
- •Пояснительная записка
- •Тематический план
- •Методические рекомендации по изучению тем дисциплины
- •Раздел 1. Системы программирования.
- •Раздел 2. Основы программирования на языке ассемблера.
- •Методические рекомендации по оформлению и выполнению домашней контрольной работы
- •Критерии оценки домашней контрольной работы
- •Теоретические сведения
- •Команды работы с адресами и указателями памяти
- •ПримерЫ решения задач
- •Раздел 1 Системы программирования
- •Раздел 2 Основы программирования на языке ассемблера.
- •Литература Основная
- •Дополнительная
Команды работы с адресами и указателями памяти
LEA назначение,источник - загрузка эффективного адреса;
LDS назначение,источник - загрузка указателя в регистр сегмента данных DS;
Дополнительные сегменты данных:
LES назначение,источник – загрузка указателя в регистр доп. сегмента данных ES;
LGS назначение,источник – загрузка указателя в регистр доп. сегмента данных GS;
LFS назначение,источник – загрузка указателя в регистр доп. сегмента данных FS;
LSS назначение,источник – загрузка указателя в регистр сегмента стека SS.
Команда LEA похожа на команду MOV тем, что она также производит пересылку, но команда lea производит пересылку не данных, а эффективного адреса данных (т.е. смещения данных относительно начала сегмента данных) в регистр, указанный операндом назначение.
МАССИВ – сложный тип данных, состоящий из совокупности элементов одного типа.
Способы описания массива:
1. перечислить элементы массива через запятую в поле операндов директивы описания данных: mas dd 1,2,3,4,5; массив из пяти элементов, размером по 4-е байта
2. использовать оператор повторения dup: mas dw 5 dup(0); зарезервировано место в памяти для пяти элементов массива типа слово
3. использовать директивы label и rept.
использовать цикл для инициализации значениями область памяти, которую можно трактовать как массив.
Все элементы массива в памяти располагаются последовательно. Нумерация элементов массива начинается с нуля. Адрес элемента линейного массива в памяти вычисляется по формуле:
база + размер элемента * индекс.
Для адресации элементов одномерного массива используется индексная адресация, при которой адрес формируется из 2-х компонентов:
- постоянного (базового) - указанием прямого адреса массива в виде имени идентификатора, обозначающего начало массива;
- переменного (индексного) - указанием именем индексного регистра
МП позволяет масштабировать индекс, т.е. имя регистра умножается на 2, 4, 8, это облегчает работу с массивами.
Адрес элемента (i,j) вычисляется по формуле:
база + количество элементов в строке * размер элемента * i + j, где i - номер строки, j - номер столбца.
Пример: массив 4*4, эффективный адрес mas(2,3) = mas+4*1*2+3=mas+ll.
Для организации адресации двухмерного массива используется базоиндексная адресация. Возможны два основных варианта выбора компонентов для формирования эффективного адреса:
- сочетание прямого адреса, как базового компонента адреса, и двух индексных регистров для хранения индексов (mov ax,mas[bx][si]);
-сочетание двух индексных регистров, один из которых является и базовым и индексным одновременно, а другой - только индексным (mov ax,[bx][si] при этом в вх предварительно записывается адрес массива).
ЦЕПОЧКА (СТРОКА) – последовательность байт, слов или двойных слов, находящихся в смежных ячейках памяти и воспринимаемых как единое целое.
Цепочечные команды:
MOVS - команда передачи данных между двумя цепочками (SI и DI). MOVS dst,src dst:=(src)
CMPS – команда сравнения цепочек. CMPS dst,src (src)-(dst)
SCAS – сканирование (просмотр) цепочки. SCAS dst (ac)-(dst)
LODS – загрузка цепочки в аккумулятор. LODS src ac:=(src)
STOS – запоминание содержимого аккумулятора в цепочке. STOS dst dst:=(ac)
Циклическое выполнение команды обеспечивает однобайтный префикс повторения REP, который используется с командами MOVS, STOS, заставляя их выполняться, пока не достигнут конец цепочки, т.е. регистра СХ≠0. Благодаря такому префиксу повторения цепочки данных обрабатываются значительно быстрей, чем при организации программного цикла.
Префиксы REPE и REPZ используются с командами CMPS и SCAS и оперируют с флажками ZF=0, состояние, которого определяется результатом выполнения этих команд.
Префиксы REPNE и REPNZ действуют аналогично предыдущим префиксам, но флажок ZF должен быть равен нулю. В противном случае повторение заканчивается.
СТРУКТУРА – это сложный тип данных, состоящий из фиксированного числа элементов разного типа. Синтаксис описания шаблона структуры:
имя_структуры struc
<описание полей> ;последовательность директив описания данных db, dw, dd, dq и dt. Их операнды определяют размер полей и при необходимости, начальные значения
имя_структуры ends
Синтаксис определения данных с типом структуры:
[имя переменной] имя структуры <[список значений]>
Если не указывать имя переменной, будет выделена область памяти размером в сумму длин всех элементов структуры. Если список значений указывается не полностью, то все поля структуры для данной переменной инициализируется значениями из шаблона, если таковы заданы. Допускается инициализация отдельных полей, но в этом случае пропущенные поля должны отделяться запятыми. Примеры переменных с типом структуры worker:
sort1 worker <'Гурко Андрей Васильевич', ,'художник','33','15','1800','26.01.64'>
sort2 worker <'Степанов Юрий Петрович', ,'художник','38','20','1750','01.01.58'>
Для того чтобы обратиться к полю структуры, используется оператор '.' (точка):
адресное_выражение.имя_поля_структуры
Размещение одинаковых по содержанию экземпляров структур в одном месте, последовательно друг за другом образует логическую структуру данных, называемую таблицей.
Язык ассемблера разрешает определять не только отдельную переменную с типом структура, но и массив структур. Определим массив из 10-ти структур типа worker: mas_sort worker 10 dup(0)
Работа с массивом структур производится так же, как и с одномерным массивом. Транслятор назначает имени типа структуры и имени переменной с типом структуры атрибут типа. Значением этого атрибута является размер в байтах, занимаемый полем этой структуры. Извлечь это значение можно с помощью оператора type.
ПРОЦЕДУРА – группа команд для решения конкретной подзадачи. Обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку. Для описания процедуры (подпрограммы) используются две директивы: PROC и ENDP.
Синтаксис описания процедуры:
имя_процедуры PROC [расстояние] - заголовок процедуры
ARG список_аргументов
RETURN список_элементов
команды, директивы - тело процедуры
имя_процедуры ENDP
Каждая процедура имеет уникальное имя, которое и используется при вызове этой процедуры. Атрибут [расстояние] может принимать значения NEAR или FAR и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение NEAR.
Расположение процедуры в программе:
- в начале программы, до первой исполняемой команды;
- в конце программы, после команды, возвращающей управление операционной системе;
- промежуточный вариант, тело процедуры располагается внутри другой процедуры или основной программы. Обход тела процедуры осуществляется с помощью команды безусловного перехода JMP;
- в другом модуле (часто используемые процедуры выносятся в отдельный файл).
Команды вызова и возврата
CALL [модификатор] имя_процедуры – вызов процедуры. Команда передает управление процедуры и при этом в стеке сохраняет адрес возврата - это адрес команды, следующей за командой CALL.
RET [число] – возвращает управление основной программе. Команда считывает адрес возврата из стека и загружает его в CS и IP/EIP, тем самым она возвращает управление на команду, следующей за командой CALL. [Число] – необязательный параметр, обозначающий количество элементов, удаляемых из стека при возврате из процедуры.
Вызов процедуры командой CALL может быть: внутрисегментным и межсегментным.
Примечание: одна и та же процедура не может быть процедурой ближнего и дальнего типа. Если процедура используется в текущем сегменте, но может вызываться и из другого сегмента программы, то она должна быть объявлена процедурой типа FAR.
МАКРООПРЕДЕЛЕНИЕ
Синтаксис описания: <имя> MACRO [<список формальных параметров>] … ENDM
Имя макрокоманды начинается только с буквы и содержит только буквы, цифры и символ подчёркивания. В операторе макроопределения указывается список фиктивных параметров. В программе для .exe файла макроопределение располагается после директивы модели памяти (MODEL SMALL), а для .com файла – после начального адреса смещения программы (ORG 100h).
Макровызов имеет следующий формат:
<имя макрокоманды> [<список фактических параметров>]
Если в теле макроопределения встречается метка она описывается с помощью директивы LOCAL: LOCAL <список локальных меток>. Например: LOCAL MET1, MET2, MET3
АССЕМБЛЕР, ВСТРОЕННЫЙ В ПРОГРАММУ НА ЯЗЫКЕ PASCAL
Встроенный ассемблер становится доступным с помощью операторов ASM.
Синтаксис оператор ASM: ASM оператор ассемблера разделитель оператор ассемблера END;
где оператор_ассемблера представляет собой оператор ассемблера, а разделитель – это точка с запятой, новая строка или комментарий Паскаля.
Локальные метки – это метки, которые начинаются с символа @. Локальная метка известна только в определяющем ее операторе ASM. В отличие от обычной метки, локальную метку перед ее использованием не требуется описывать в разделе LABEL.
Функции BIOS int16h для работы с клавиатурой.
Назначение |
Номер функции |
Вход |
Выход |
Чтение символа с ожиданием |
AH=10h |
|
АН=скан-код AL-ASCII-код символа |
Проверка наличия символа |
AH=llh |
|
Если zf=0, то в АН=скан-код, в AL= ASCII-код; Если zf=1, то буфер пуст |
Запись символа в буфер клавиатуры |
AH=05h |
СН=скан-код CL=ASCII-код |
AL=00h- успешная запись; AL=01h- ошибка |
Функции BIOS int 10h для работы с экраном.
Назначение |
Номер функции |
Вход |
Выход |
Установка видеорежима |
AH=00h |
Аl=номер видеорежима: Если а1.7=0-экран очищается, если al. 7=1-не изменяется |
|
Установка позиции курсора |
AH=02h |
ВН=номер видеостраницы DH=cтрока DL=колонка |
|
Получение позиции курсора |
AH=03h |
ВН=номер видеостраницы |
DH=строка текущей позиции курсора DL=колонка СН=номер начальной строки курсора СL=номер последней строки курсора |
Запись символа и его атрибута в видеопамять |
AH=09h |
ВН=номер видеостраницы AL=ASCII-код символа ВL=байт-атрибут, СХ-число повторений |
Запись символа и его атрибута в текущую позицию курсора |
Чтение символа и его атрибута из видеопамяти |
AH=08h |
ВН=номер видеостраницы AL=ASCII-код, АН=байт-атрибут |
Чтение символа и его атрибута в текущей позиции курсора |
Запись символа в видеопамять |
AH=0Ah |
ВН=номер видеостраницы AL=ASCII-код символа СХ=число повторений |
Запись символа в текущую позицию курсора, но позиция курсора не изменяется |
Запись символа в режиме телетайпа |
AH=0Eh |
ВН=номер видеостраницы AL=ASCII-код символа CX= число повторении |
Запись символа в текущую позицию курсора с автоматическим ее смещением |
Вывод строки |
AH=13h |
AL=режим записи:0-ой бит – после вывода курсор перемещается в конец строки; 1-ый бит – каждый символ в строке представлен двумя байтами:ASCII-кодом и байтом- атрибутом; 2-7 биты – резерв; BH=номер видеостраницы; BL=байт-атрибут, если строка содержит только символы AL.1=0; CX=число символов в строке; DH,DL- начальная строка и столбец на экране; ES:BP=адрес начала строки |
|
Функции MS DOS для работы с клавиатурой.
Назначение |
Номер функции |
Вход |
Выход |
Ввод символа с клавиатуры с ожиданием и отображением на экране |
AH=01h |
|
A L=ASСII-код символа или 0 |
Ввод символа с клавиатуры без ожидания и отображением на экране |
AH=06h |
DL=0ffh-признак того, что функция используется для ввода |
Если zf=0, то AL=ASСII-код символа; если zf=l, то символа в буфере нет |
Читает символ с клавиатуры без ожидания и без вывода на экран |
AH=07h или AH=08h |
|
АL=А8СП-код символа или 0 |
Ввод строки символов специального формата |
В первый байт буфера надо поместить значение максимальной длины строки AH=0Ah |
DS:DX=адрес буфера |
Введенная строка |
Проверка наличия вводимого символа в буфере |
AH=Bh |
|
AL=0flh -есть символ ; AL=0 – буфер пуст |
Очистка буфера |
AH=0Ch |
АL=номер фикции (01h,06h,07h, 08h,0ah) |
|
Функции MS DOS для вывода данных на экран.
Назначение |
Номер функции |
Вход |
Выводит один символ на экран |
AH=02h |
DL=символ для вывода |
Вывод символа на экран |
AH=06h |
DL=символ для вывода |
Вывод строки на экран |
AH=09h |
DS:DX=aдpec строки для вывода |
РАБОТА С ФАЙЛАМИ
назначение |
вход |
выход |
Создание файла, если он уже существует, то прежняя информация стирается |
AH=3Ch, CХ= атрибуты: 0-ой=1 - только чтение; 1-ый=1 - скрытый файл; 2-ой=1 -системный файл; 3-ий=0 - игнорируется; 4=0 - зарезервирован; 5 - архивация; 6=0 - резерв; 7 - общий файл; 8-15 - резерв DS.DX= адрес ASCII - цепочки с именем файла |
CF=0; АХ= дескриптор файла; CF=1; АХ= код ошибки (3-нет такого пути;4-нет свободного дескриптора файла; 5-откаг в доступе. |
Открытие существующего файла, указатель в начало файла |
AH=3Dh; AL-режим доступа (2-0.000-только чтение; 001-запись; 010-чтение/запись;) (4-6:000-режим совместимости; 001-запрет чтения и записи другими программами; 100-разрешение полного доступа другими программами; 111-сетевой(доступ серверного вызова DS:DX=ASCII имя файла |
CF-0; АХ= дескриптор файла; CF=l; АХ= код ошибки: 3-нет такого пути;4-нет свободного дескриптора файла; 5-доступ отказан; 12h-недействительный код доступа. |
Создание нового файла с сохранением существующего |
AH=5Bh; СХ= атрибуты файла; DS:DX=ASCII имя файла |
CF=0; АХ = дескриптор файла; CF=1; АХ= код ошибки:3-нет такого пути;4-нет свободного дескриптора; 5-отказ в доступе; 50h- файл существует |
Открытие или создание файла с расширенными возможностями |
AX = 6C00h; ВL = флаги (7-наследование; 4-6-разделение; 3-резерв; 0-2-режим доступа; ВН= флаги (6=1-отменить буферизацию: 5=0-ислользовать обычный обработчик ошибок; 5=1-не использовать его;) СХ= атрибуты (0-обычный файл); CL= действия (0000-вернуть ошибку; 0001-открыть файл; 0002-открыть без сохранения существующего) 4-7=действия, если файл не существует (0000-вернуть ошибку; 0001-открыть файл;0002-создать и открыть файл; DH=00h; DS.SI-ASCII-имя файла |
CF = O; АХ = дескриптор файла; СХ= состояние (0-файл открыт; 1-файл создан и открыт; 2-файл открыт без сохранения существующего; CF= 1; АХ= код ошибки |
Закрытие файла |
AH=3Eh; ВХ = дескриптор |
CF=0;AX = He определен CF=1; АХ= код ошибки |
Установка указателя |
AH=42h; ВХ= дескриптор; АL=начальное положеш1е:00-смещение от начала; 01-от текущей позиции; 02-от конца файла; DS:DX-Смещение новой позиции от начального положения |
CF=0; DХ:АХ= значение новой позиции в байтах относительно начала файла; CF=1, АХ= код ошибки 1 -неверное значение в AL; 6- недопустимый дескриптор |
Запись в файл |
AH=40h; ВХ= дескриптор, СХ= количество байт для записи; DS:DX-указатель на область из которой записываются данные |
CF=0; АХ= число действительно записанных байтов в файл; CF=1; АX= код ошибки: 5-в доступе отказан; 6-недоступный дескриптор; В конце каждой записываемой строки 0dh,0ah |
Чтение из файла |
AH=3Fh; ВХ= дескриптор; СХ= количество байтов для чтения; DS:DX-указатель на область, в которую помещается прочитанный байт |
CF=0; АХ= число действительно прочитанных байтов из файла; CF=1; АХ= код ошибки: 5-в доступе отказано; 6-недопустимнй дескриптор |
Удаление файла |
AH=41h; DS:DX – ASSCII имя файла; CL=атрибуты удаляемого файла |
CF=0; AX=не определен; CF=1; AX=код ошибки: 2 – файл не найден; 3 – нет такого пути; 5 – в доступе отказано. |