Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка_СПРГ_зо_без заданий.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
701.95 Кб
Скачать

Команды работы с адресами и указателями памяти

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.

  1. использовать цикл для инициализации значениями область памяти, которую можно трактовать как массив.

Все элементы массива в памяти располагаются последовательно. Нумерация элементов массива начинается с нуля. Адрес элемента линейного массива в памяти вычисляется по формуле:

база + размер элемента * индекс.

Для адресации элементов одномерного массива используется индексная адресация, при которой адрес формируется из 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 – в доступе отказано.