Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
16.04.2013
Размер:
27.92 Кб
Скачать
Лабораторная работа №2
Программная модель компьютера
Цель работы: ознакомиться с программной моделью компьютера i8086, используя специализированные программы MS-DOS и Windows.
Основные понятия
Любая запущенная программа получает в свое распоряжение определенный набор ресурсов микропроцессора. Эти ресурсы необходимы для выполнения и хранения в памяти команд программы, данных и информации о текущем состоянии программы и микропроцессора. Набор этих ресурсов представляет собой программную модель микропроцессора:
* набор регистров общего назначения (eax/ax/ah/al, edx/dx/dh/dl, eсx/сx/ch/cl, ebx/bx/bh/bl; ebp/bp, esi/si, edi/di, esp/sp);
* набор сегментных регистров (cs, ds, ss, es, fs, gs);
* набор регистров состояния и управления (eip/ip, eflags/flags);
* пространство адресуемой памяти;
* программный стек.
Перечислим регистры, относящиеся к группе регистров общего назначения. Так как эти регистры физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), то их еще называют регистрами АЛУ:
* eax/ax/ah/al (Accumulator register) – аккумулятор. Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно;
* ebx/bx/bh/bl (Base register) – базовый регистр. Применяется для хранения базового адреса некоторого объекта в памяти;
* ecx/cx/ch/cl (Count register) – регистр-счетчик. Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;
* edx/dx/dh/dl (Data register) – регистр данных. Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.
Следующие два регистра используются для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:
* esi/si (Source Index register) – индекс источника. Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике;
* edi/di (Destination Index register) – индекс приемника (получателя). Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры:
* esp/sp (Stack Pointer register) — регистр указателя стека.
Содержит указатель вершины стека в текущем сегменте стека.
* ebp/bp (Base Pointer register) – регистр указателя базы кадра стека. Предназначен для организации произвольного доступа к данным внутри стека.
Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, как мы увидим далее, в этих регистрах содержатся адреса памяти, с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:
1. Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) – сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор, то есть эти команды загружаются в конвейер микропроцессора.
2. Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) – сегментный регистр данных, который хранит адрес сегмента данных текущей программы.
3. Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) – сегментный регистр стека, содержащий адрес сегмента стека.
4. Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде.
Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).
В микропроцессор включены несколько регистров (см.рис. 1), которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:
* регистр флагов eflags/flags;
* регистр указателя команды eip/ip.
Используя эти регистры, можно получать информацию о результатах выполнения команд и влиять на состояние самого микропроцессора. Рассмотрим подробнее назначение и содержимое этих регистров:
eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086. На Рис_2 показано содержимое регистра eflags.

Рис. 2. Содержимое регистра eflags
Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:
* 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд. Флаги состояния регистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. В табл. 1 приведены флаги состояния и указано их назначение;
* 1 флаг управления. Обозначается df (Directory Flag). Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1). Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df). Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;
* 5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086. Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы. В табл. 2 перечислены системные флаги, их назначение.
Таблица 1. Флаги состояния
Мнемоника флага
Флаг
Номер бита в eflags
Содержание и назначение
cf
Флаг переноса
(Carry Flag)
0
1 – арифметическая операция произвела перенос из старшего бита результата. Старшим является 7, 15 или 31-й бит в зависимости от размерности операнда; 0 – переноса не было
pf
Флаг паритета
(Parity Flag)
2
1 – 8 младших разрядов (этот флаг — только для 8 младших разрядов операнда любого размера) результата содержат четное число единиц; 0 – 8 младших разрядов результата содержат нечетное число единиц
af
Вспомогательный флаг переноса
(Auxiliary carry Flag)
4
Только для команд работающих с BCD-числами. Фиксирует факт заема из младшей тетрады результата: 1 – в результате операции сложения был произведен перенос из разряда 3 в старший разряд или при вычитании был заем в разряд 3 младшей тетрады из значения в старшей тетраде; 0 – переносов и заемов в(из) 3 разряд(а) младшей тетрады результата не было
zf
Флаг нуля (Zero Flag)
6
1 – результат нулевой; 0 – результат ненулевой
sf
Флаг знака
(Sign Flag)
7
Отражает состояние старшего бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно): 1 – старший бит результата равен 1; 0 – старший бит результата равен 0
of
Флаг переполнения
(Overflow Flag)
11
Флаг of используется для фиксирования факта потери значащего бита при арифметических операциях: 1 – в результате операции происходит перенос (заем) в(из) старшего, знакового бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно); 0 – в результате операции не происходит переноса (заема) в(из) старшего, знакового бита результата
iopl
Уровень Привилегий ввода-вывода
(Input/Output Privilege Level)
12, 13
Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи
nt
флажок вложенности задачи
(Nested Task)
14
Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую
Таблица 2. Системные флаги
Мнемоника флага
Флаг
Номер бита в eflags
Содержание и назначение
tf
Флаг трассировки (Trace Flag)
8
Предназначен для организации пошаговой работы микропроцессора. 1 — микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды. Может использоваться при отладке программ, в частности отладчиками;
0 — обычная работа
if
Флаг прерывания (Interrupt enable Flag)
9
Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по входу INTR). 1 — аппаратные прерывания разрешены; 0 — аппаратные прерывания запрещены
rf
Флаг возобновления (Resume Flag)
16
Используется при обработке прерываний от регистров отладки.
vm
Флаг виртуального 8086 (Virtual 8086 Mode)
17
Признак работы микропроцессора в режиме виртуального 8086. 1 — процессор работает в режиме виртуального 8086; 0 — процессор работает в реальном или защищенном режиме
ac
Флаг контроля выравнивания
(Alignment Check)
18
Предназначен для разрешения контроля выравнивания при обращениях к памяти. Используется совместно с битом am в системном регистре cr0. К примеру, Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию
eip/ip (Instraction Pointer register) – регистр-указатель команд. Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.
Стек
Во многих ситуациях программе требуется временно запомнить информацию, а затем считывать ее в обратном порядке. Одним из примеров может служить запоминание и восстановление счетчиков при организации вложенных циклов. В процессоре Intel 8086 для реализации необходимых в циклах счета, проверки и перехода удобно применять регистр CX и команды организации циклов. Но так как последние предназначены для использования только регистра CX, при вложении циклов возникает проблема нехватки регистров.
Проблема временного хранения данных решается путем реализации в компьютере структуры, называемой стеком. Стек - это область памяти, взаимодействие программ с которой построено по принципу LIFO (Last In - First Out, последним пришел - первым ушел), т. е. помещаемая в стек информация считывается в обратном порядке. Наиболее важная область применения стека - организация подпрограмм.
Стек рассчитан на косвенную адресацию через специальный регистр - указатель стека (SP - Stack Pointer). При включении элементов в стек производится автоматический декремент указателя стека, а при извлечении - инкремент, таким образом стек растет в сторону младших адресов. Помещение элемента в стек называется включением (push), а обратное действие - извлечением (pop). Адрес последнего включенного в стек элемента (он содержится в регистре указателя стека) называется вершиной стека (TOS - Top Of Stack).
В процессоре Intel 8086 реализовано 4 команды, предназначенных для непосредственного включения и извлечения информации из стека, - POP, POPF, PUSH, PUSHF. Эти команды не допускают непосредственной адресации, хотя все остальные режимы адресации разрешены. Стек оперирует только словами, так что попытка включения байта все равно приведет к включению целого слова. На регистр flags влияет только команда POPF, которая извлекает содержимое вершины стека в регистр флагов.
Физический адрес стека формируется из содержимого регистров sp и ss или bp и ss, причем sp служит неявным указателем стека для всех операций включения и извлечения, а ss - сегментным регистром стека. Значение регистра ss является самым младшим адресом (т. е. границей) области стека и называется базой стека. Начальное значение регистра sp есть наибольшее смещение, которого может достигать стек. Регистр bp предназначен для произвольных обращений к стеку.
Стек эффективнее обычной памяти в двух отношениях. Команды PUSH и POP короче команды MOV, так как один из операндов косвенно адресуется через регистр SP, а инкремент или декремент регистра SP с образованием нового целевого адреса производится автоматически.
Организация памяти
Слово адреса процессора Intel 8086 - 20 бит, поэтому этот процессор непосредственно может адресовать не более 220 = 1М оперативной памяти. Адрес памяти в общем случае определяется парой 16-разрядных чисел: номером сегмента и величиной смещения, каждое из которых может изменяться в пределах от 0 до 216 = 64K. Сегмент - это непрерывная область памяти объемом 64K, адрес нижней границы которой (номер сегмента) кратен 16, а смещение - это номер байта внутри этой области. Используя эту пару, процессор вычисляет целевой адрес так: номер сегмента сдвигается на 4 бита влево (что соответствует умножению на 16) и к результату прибавляется смещение, образуя 20-разрядный линейный адрес. Это позволяет 16-разрядному процессору Intel 8086 адресовать пространство оперативной памяти в 2^20 = 1M, которое логически разделено на перекрывающиеся сегменты, каждый из которых имеет размер 64K и начинается на 16-байтной границе.
Использование механизма сегментации обеспечивает несколько преимуществ:
1. Емкость оперативной памяти может достигать 1M, хотя команды процессора оперируют 16-битными адресами;
2. Упрощается использование отдельных областей памяти для кода программы, ее данных и стека;
3. При каждом выполнении программы ее код или данные могут размещаться в различных областях памяти (сегментах); работоспособность программы обеспечивается за счет того, что в командах используются не полные адреса, а только смещения относительно базового адреса сегмента.
Однако этот механизм имеет и свои недостатки:
1. В любой момент времени через сегментный регистр адресуется не более 64K памяти, поскольку 64K - это максимальный объем памяти, адресуемый 16-битным смещением; поэтому при работе с большими объектами в памяти приходится вручную обеспечивать правильную установку сегментных регистров;
2. В отличие от регистров общего назначения, сегментные регистры не могут использоваться в качестве источников или приемников значений операндов в арифметических и логических командах; фактически, единственная операция, которую можно выполнять с сегментными регистрами, - это копирование значений между сегментными регистрами и регистрами общего назначения или памятью;
3. Поскольку сегменты могут перекрываться, то одна и та же физическая ячейка памяти может адресоваться множеством возможных сочетаний значений сегмент/смещение.
Вообще, сегментированная модель памяти достаточно сложна, а принципы ее работы не отвечают интуитивным представлениям человека о работе памяти. Из всего этого следует, что процессор Intel 8086 весьма ограничен в использовании памяти и лучше подходит для работы с памятью в блоках, объем которых не превышает 64K.
Хотя процессор Intel 8086 может обращаться к слову по любому адресу, при нечетном адресе требуется два обращения к памяти вместо одного: для младшего и для старшего байтов.

Программирование на Ассемблере для процессора Intel 8086
Понятие языка Ассемблера
Язык Ассемблера является ориентированной на человека формой команд процессора (машинного языка). Машинный язык и язык Ассемблера функционально эквивалентны, но на Ассемблере намного проще программировать, поскольку он позволяет использовать мнемонические имена команд машинного языка. При этом компилятор Ассемблера последовательно транслирует команды из мнемонического вида в их машинный эквивалент. Таким образом, язык Ассемблера в основном представляет собой прямой аналог машинного языка, но реализованный в том виде, с которым люди могут более эффективно работать.
Полезным качеством Ассемблера является то, что он позволяет управлять действиями процессора по операциям и с максимальной эффективностью. К числу его недостатков можно отнести тот факт, что при каждой операции выполняется совсем немного функций, что отражает ограниченные возможности того, на что в действительности способен процессор. Например, процесс сложения двух длинных целых чисел и сохранения результата в третьем целом значении занимает на языке Pascal только одну строку:
i := j + k;
а на Ассемблере процессора 8088 это потребует шести строк:
mov ax, j
mov dx, j+2
add ax, k
addc dx, k+2
mov i, ax
mov i+2, dx
Конечно, объем скомпилированного кода на языке Pascal будет не меньше (а больше), чем на языке Ассемблера, но легче написать одну строку на Pascal , чем шесть на Ассемблере.
Причина использования Ассемблера состоит в том, что он напрямую позволяет делать все то, на что способен процессор. С другой стороны, хорошо написанная на Ассемблере программа позволит получить код наименьшего объема с наименьшим временем выполнения. Качество выполняемого кода, получаемого в других языках, страдает от того, что приходится выполнять трансляцию с этого языка на машинный язык, а код на языке Ассемблера отображается в машинный язык непосредственно, без малейшей потери эффективности. На языке Ассемблера вы указываете компьютеру, что нужно делать, и он делает именно это - не больше и не меньше.

Формат операторов Ассемблера
Общий формат оператора Ассемблера имеет следующий вид:
[Метка[:]] Мнемоника [Операнд1 [{,Операнд2}]] [;Комментарий]
Здесь элементы, указанные в квадратных скобках, могут отсутствовать, а элементы в фигурных скобках могут повторяться 1 или более раз. Пробелы вводятся произвольно, но как минимум один пробел должен следовать после кода операции.
Метка - это идентификатор, связанный с адресом первого байта того оператора, в котором она появляется. Мнемоника - это мнемоническое обозначение соответствующей команды процессора или директивы Ассемблера. Комментарий - это любая последовательность символов, начиная с символа ";" до конца строки, которая поясняет соответствующий оператор.
Метки используются как операнды в операторах программы для ссылки на адреса команд (например, при условных и безусловных переходах) и данных (например, переменных, массивов, структур). Имена меток могут состоять из следующих символов: "A" - "Z", "a" - "z", "_", "@", "$", "?", "0" - "9". Символы "0" - "9" не могут использоваться в качестве первых символов имени метки. Символы "$" и "?" имеют специальное значение, поэтому их не следует использовать в именах пользовательских меток. Имена меток не должны совпадать с именами регистров, мнемониками команд процессора, а также с ключевыми словами Ассемблера (встроенными переменными, операциями, директивами).
Каждая метка должна определяться только один раз, то есть имена меток должны быть уникальными (исключением являются локальные метки, см. далее). Как операнды метки могут использоваться любое число раз.
Метка может занимать всю строку. В этом случае значением метки является адрес команды или директивы, которая должна следовать в следующей строке программы. При определении метки следует завершать ее двоеточием в случае, если после метки следует команда процессора. Если же метка определяется для директивы (при описании данных, сегментов, подпрограмм), то двоеточие не ставится.
Основным полем в строке программы на Ассемблере является поле мнемоники. Мнемоники команды компилируются непосредственно в те команды процессора Intel 8086, которым они соответствуют. В отличие от мнемоник команд, директивы не компилируются в исполняемый код, они лишь управляют различными аспектами работы компилятора - от типа генерируемого кода (для процессоров 8086, 80286, 80386 и т. д.) до определения сегментов и формата создаваемых файлов листингов, и, таким образом, обеспечивают высокоуровневые средства программирования на Ассемблере.
Операнды оператора Ассемблера описываются выражениями. Выражения конструируются на основе операций над целочисленными и символьными константами, метками переменных и именами регистров с использованием знаков и имен операций.
Система команд процессора Intel 8086
Для программиста ключевым ресурсом вычислительной машины является система реализуемых ей команд. Каждая машинная команда разделяется на группы бит (поля): поле кода операции и одно или несколько полей операндов. Код операции показывает, что нужно делать, а операнды определяют необходимую команде информацию и могут содержать данное, адрес данного, косвенный указатель на данное или другую информацию, относящуюся к обрабатываемым командой данным. Каждой команде сопоставлена мнемоника. Процессор Intel 8086 реализует следующую систему команд, которые в соответствии с выполняемыми ими функциями можно разделить по группам.
Команды пересылки данных
IN - ввод байта или слова
LAHF - загрузка регистра ah из регистра флагов
LDS - загрузка указателя с использованием регистра ds
LEA - загрузка исполнительного адреса
LES - загрузка указателя с использованием регистра es
MOV - пересылка байта или слова
OUT - загрузка в порт
POP - извлечение слова из стека
POPF - извлечение слова из стека в регистр флагов
PUSH - включение слова в стек
PUSHF - включение регистра флагов в стек
SAHF - загрузка регистра ah в регистр флагов
XCHG - обмен значениями
Арифметические операции
ADC - сложение с переносом
ADD - сложение
CBW - преобразование байта в слово
CMP - сравнение
CWD - преобразование слова в двойное слово
DEC - декремент
DIV - деление без учета знака
IDIV - деление с учетом знака
IMUL - умножение с учетом знака
INC - инкремент
MUL - умножение без учета знака
NEG - получение дополнительного кода
SBB - вычитание с заемом
SUB - вычитание
Логические операции
AND - логическое умножение
NOT - логическое отрицание
OR - логическое сложение
RCL - циклический сдвиг влево через CF
RCR - циклический сдвиг вправо через CF
ROL - циклический сдвиг влево
ROR - циклический сдвиг вправо
SAL - арифметический сдвиг влево
SAR - арифметический сдвиг вправо
SHL - логический сдвиг влево
SHR - логический сдвиг вправо
TEST - тест
XOR - исключающее ИЛИ
Команды условного перехода
JA - переход если выше
JAE - переход если выше или равно
JB - переход если ниже
JBE - переход если ниже или равно
JC - переход если перенос
JCXZ - переход если регистр CX равен 0
JE - переход если равно
JG - переход если больше
JGE - переход если больше или равно
JL - переход если меньше
JLE - переход если меньше или равно
JNA - переход если не выше
JNAE - переход если не выше и не равно
JNB - переход если не ниже
JNBE - переход если не ниже и не равно
JNC - переход если нет переноса
JNE - переход если не равно
JNG - переход если не больше
JNGE - переход если не больше и не равно
JNL - переход если не меньше
JNLE - переход если не меньше и не равно
JNO - переход если нет переполнения
JNP - переход если нечетно
JNS - переход если положительный результат
JNZ - переход если не ноль
JO - переход если есть переполнение
JP - переход если четно
JPE - переход если четно
JPO - переход если нечетно
JS - переход если отрицательный результат
JZ - переход если ноль
LOOP - переход по счетчику
LOOPE - переход пока равно
LOOPNE - переход пока не равно
LOOPNZ - переход пока не ноль
LOOPZ - переход пока ноль
Команды передачи управления
CALL - вызов подпрограммы
JMP - безусловный переход
RET - возврат из подпрограммы
Команды обработки строк
CMPS - сравнение строк
CMPSB - сравнение строк из байтов
CMPSW - сравнение строк из слов
LODS - загрузка строки
LODSB - загрузка строки из байтов
LODSW - загрузка строки из слов
MOVS - пересылка строки
MOVSB - пересылка строки из байтов
MOVSW - пересылка строки из слов
REP - повтор
REPE - повторять пока равно
REPNE - повторять пока не равно
REPNZ - повторять пока не ноль
SCAS - просмотр строки
SCASB - просмотр строки из байтов
SCASW - просмотр строки из слов
STOS - запись в строку
STOSB - запись в строку из байтов
STOSW - запись в строку из слов
Команды прерывания
INT - прерывание
INTO - прерывание по переполнению
IRET - возврат после обработки прерывания
Команды управления состоянием процессора
CLС - сброс признака переноса
CLD - сброс признака направления
CLI - сброс признака разрешения прерывания
CMC - инвертирование признака переноса
ESC - выборка кода операции и операнда
HLT - останов
LOCK - блокирование шины
NOP - нет операции
STC - установка признака переноса
STD - установка признака направления
STI - установка признака разрешения прерывания
WAIT - ожидание

Более подробное описание каждой из команд приводится в справочнике
intro.hlp.
Режимы адресации процессора Intel 8086
Режимом адресации называется способ определения адреса операнда. Режимы адресации разделяются на два класса - режимы адресации данных и режимы адресации переходов. Рассмотрим режимы адресации данных.
1. Непосредственный. Значение операнда длиной 8 или 16 бит является непосредственной частью команды.
Пример: mov ax, 10
2. Прямой. Смещение адреса операнда указано прямо в команде.
Пример: mov i, ax
3. Регистровый. Операнд содержится в указанном командой регистре; 16-битный операнд может находиться в регистрах ax, bx, cx, dx, si, di, sp, bp, а 8-битный - в регистрах al, ah, bl, bh, cl, ch, dl, dh.
Пример: inc cx
4. Регистровый косвенный. Смещение адреса операнда находится в базовом регистре bx или bp или в индексном регистре si или di.
Пример: sub ax, Vector[bx]
5. Регистровый относительный. Смещение адреса операнда определяется как сумма 8- или 16-битного относительного смещения и содержимого базового (bx или bp) или индексного (si или di) регистров.
Пример: add ax, [bp+2]
6. Базовый индексный. Смещение адреса операнда определяется как сумма содержимого базового (bx или bp) и индексного регистров (si или di).
Пример: mov ax, [bx+si]
7. Относительный базовый индексный. Смещение адреса операнда определяется как сумма 3-х слагаемых: 8- или 16-битного относительного смещения, содержимого индексного регистра (si или di) и содержимого базового регистра (bx или bp).
Пример: mov ax, [bx+si+2]

1


13


Соседние файлы в папке Лаба2 по ВМСиС ЭТМО-31