Команды управления процессором ассемблер
По своим функциям все команды процессоров семейства x86 делятся на шесть категорий:
команды передачи данных;
команды управления потоком;
команды управления процессором;
команды для работы со строками.
Основные команды
Команда mov работает следующим образом:
Операнды «назначение» и «источник» могут быть записаны в разных режимах адресации. Режимом адресации называется способ определения адреса операнда. Рассмотрим режимы адресации данных.
1. Непосредственный. Значение операнда длиной 8 или 16 бит является непосредственной частью команды.
Пример 6.1: mov ax, 10
2. Прямой. Смещение адреса операнда указано прямо в команде.
Пример 6.2: mov i, ax
Пример 6.3: inc cx
4. Регистровый косвенный. Смещение адреса операнда находится в базовом регистре bx или bp или в индексном регистре si или di.
Пример 6.4: subax, [bx]
Пример 6.5: add ax, [bp+2]
6. Базовый индексный. Смещение адреса операнда определяется как сумма содержимого базового (bx или bp) и индексного регистров (si или di).
Пример 6.6: mov ax, [bx+si]
Пример 6.7: mov ax, [bx+si+2]
Команды pop иpush, а также другие команды, образованные на их основе (popa,pushfwи т.д.) являются командами пересылки данных между стеком и регистрами.
Стек – это специальный сегмент памяти, который выполняет следующие основные функции:
временно сохраняет значения регистров;
хранит адреса возврата из подпрограмм;
хранит динамические переменные.
Стек организован по принципу LIFO(last-in-first-out) – последним вошел, первым вышел. В регистреssсодержится адрес начала стекового сегмента. Регистрspуказывает на смещение относительно этого начального адреса.
Команда pushпомещает регистр в стек, а команда pop– извлекает. Поэтому правильное управление стеком заключается в том, чтобы на каждую командуpushбыла соответствующая команда pop:
Команда xchgпредназначена для двунаправленной пересылки данных.
Пример 6.8:xchg ax, bxменяет значения регистров между собой.
Обмен регистров можно осуществить и через стек, но только в три команды:
Пример 6.9:xchg ah, al меняет старшую и младшую часть регистраax.
Такой обмен можно проделать в три команды через третий регистр, который, в отличие от стека, может хранить восьмибитовые значения:
Команда xlatпредназначена для перекодировки символов по таблице перекодировки.
Базовую систему команд микропроцессора можно условно разделить на несколько групп по функциональному назначению:
Кроме базовой системы команд микропроцессора существуют также команды расширений:
- X87 – расширение, содержащее команды математического сопроцессора (работа с вещественными числами)
- MMX – расширение, содержащее команды для кодирования/декодирования потоковых аудио/видео данных;
- SSE – расширение включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных;
- SSE2 – модификация SSE, содержит инструкции для потоковой обработки целочисленных данных, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX, появившегося гораздо раньше;
- SSE3, SSE4 – содержат дополнительные инструкции расширения SSE.
В таблице команд приняты следующие обозначения:
r – регистр
m – ячейка памяти
c – константа
8, 16, 32 – размер в битах
На все базовые команды процессора накладываются следующие ограничения:
- Нельзя в одной команде оперировать двумя областями памяти одновременно. Если такая необходимость возникает, то нужно использовать в качестве промежуточного буфера любой доступный в данный момент регистр общего назначения.
- Нельзя оперировать сегментным регистром и значением непосредственно из памяти. Поэтому для выполнения такой операции нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек.
- Нельзя оперировать двумя сегментными регистрами. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных регистры общего назначения. Например,
Команды передачи данных
Основной командой передачи данных является команда MOV , осуществляющая операцию присваивания:
Команда MOV присваивает значению операнда приемника значение операнда источника. В качестве приемника могут выступать регистр общего назначения, сегментный регистр или ячейка памяти, в качестве источника могут выступать константа, регистр общего назначения, сегментный регистр или ячейка памяти. Оба операнда должны быть одного размера.
Команды передачи данных представлены в таблице.
Команды установки единичного бита
Проверяют условие состояния битов регистра EFLAGS и, если условие выполняется, то младший бит операнда устанавливается в 1, в противном случае в 0. Анализ битов производится аналогично условным переходам.
Команды работы со стеком
Команды ввода-вывода
Команды целочисленной арифметики
Особого внимания среди рассмотренных команд целочисленной арифметики заслуживает команда CMP , которая вычитает второй операнд из первого и не сохраняет результат, а устанавливает биты OF, SF, ZF, AF, PF, CF регистра признаков EFLAGS в соответствии с результатом. Команда CMP чаще всего предшествует командам знакового или беззнакового условных переходов.
Логические команды
Выполнение логических операций описано здесь
Сдвиговые команды
Выполнение сдвиговых операций в языке Си рассмотрено здесь .
Команды циклического сдвига выполняются в соответствии со схемой
Команды коррекции двично-десятичных чисел
Команды коррекции двоично-десятичных чисел не имеют операндов и используют операнд по умолчанию, хранящийся в регистре AX (паре регистров AH:AL ).
Команды преобразования типов
Команды преобразования типов предназначены для корректного изменения размера операнда, заданного неявно в регистре-аккумуляторе ( EAX , AX , AL ). Непосредственно после аббревиатуры команды операнд не указывается.
Команды управления флагами
Команды управления флагами предназначены для сброса или установки соответствующего бита регистра признаков EFLAGS . Команды управления флагами не имеют операндов.
Команды прерываний
Команды передачи управления
Команды обращения к процедуре (функции)
Команды поддержки языков высокого уровня
Команды организации циклов — используют регистр ECX по умолчанию в качестве счетчика числа повторений цикла. Каждый раз при выполнении команды LOOPсс значение регистра ECX уменьшается на 1, а затем сравнивается с 0. Если ECX =0 , выполнение цикла заканчивается, и продолжает выполняться код программы, записанный после команды LOOPcc . Если ECX содержит ненулевое значение, то осуществляется переход по адресу операнда команды LOOPcc .
Команды условных переходов — проверяют состояние одного или нескольких битов регистра признаков и при выполнении условия осуществляют передачу программного управления в другую точку кода, задаваемую операндом. Указанный класс команд не запоминает информацию для возврата. Операнд определяет адрес команды, которой должно быть передано управление.
Справочная система по языку Assembler
Программная модель микропроцессора
На современном компьютерном рынке наблюдается большое разнообразие различных типов компьютеров. Поэтому возможно предположить возникновение у потребителя вопроса — как оценить возможности конкретного типа (или модели) компьютера и его отличительные особенности от компьютеров других типов (моделей). Рассмотрения для этого одной лишь только структурной схемы компьютера недостаточно, так как она принципиально мало чем различается у разных машин: у всех компьютеров есть оперативная память, процессор, внешние устройства.
Различными являются способы, средства и используемые ресурсы, с помощью которых компьютер функционирует как единый механизм. Чтобы собрать воедино все понятия, характеризующие компьютер с точки зрения его функциональных программно-управляемых свойств, существует специальный термин — архитектура ЭВМ .
Впервые понятие архитектура ЭВМ стало упоминаться с появлением машин 3-го поколения для их сравнительной оценки.
Пользовательские регистры
- восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (их еще называют регистрами общего назначения (РОН)):
- eax/ax/ah/al ;
- ebx/bx/bh/bl ;
- edx/dx/dh/dl ;
- ecx/cx/ch/cl ;
- ebp/bp ;
- esi/si ;
- edi/di ;
- esp/sp .
- регистр флагов eflags/flags ;
- регистр указателя команды eip/ip .
Рис. 1. Пользовательские регистры микропроцессоров i486 и Pentium
Почему многие из этих регистров приведены с наклонной разделительной чертой?
Нет, это не разные регистры — это части одного большого 32-разрядного регистра. Их можно использовать в программе как отдельные объекты.
Так сделано для обеспечения работоспособности программ, написанных для младших 16-разрядных моделей микропроцессоров фирмы Intel, начиная с i8086.
Микропроцессоры i486 и Pentium имеют в основном 32-разрядные регистры. Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в их обозначениях — они имеют
приставку e ( E xtended ).Разберемся подробнее с составом и назначением пользовательских регистров.
Регистры общего назначения
- 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 , он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.
- esi/si (Source Index register) — индекс источника .
Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике; - edi/di (Destination Index register) — индекс приемника (получателя).
Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
- esp/sp (Stack Pointer register) — регистр указателя стека .
Содержит указатель вершины стека в текущем сегменте стека. - ebp/bp (Base Pointer register) — регистр указателя базы кадра стека .
Предназначен для организации произвольного доступа к данным внутри стека.
Сегментные регистры
В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs .
Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами . Соответственно, такая организация памяти называется сегментной .- Сегмент кода . Содержит команды программы.
Для доступа к этому сегменту служит регистр cs (code segment register) — сегментный регистр кода . Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть эти команды загружаются в конвейер микропроцессора). - Сегмент данных . Содержит обрабатываемые программой данные.
Для доступа к этому сегменту служит регистр ds (data segment register) — сегментный регистр данных , который хранит адрес сегмента данных текущей программы. - Сегмент стека . Этот сегмент представляет собой область памяти, называемую стеком .
Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым . Для доступа к этому сегменту служит регистр ss (stack segment register) — сегментный регистр стека , содержащий адрес сегмента стека. - Дополнительный сегмент данных .
Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds .
Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds , при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде.
Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).
Регистры состояния и управления
- регистр флагов eflags/flags ;
- регистр указателя команды eip/ip .
eflags/flags (flag register) — регистр флагов . Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086. На рис. 2 показано содержимое регистра eflags .
Рис. 2. Содержимое регистра eflags
- 8 флагов состояния . Эти флаги могут изменяться после выполнения машинных команд.
Флаги состояния регистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. В табл. 1 приведены флаги состояния и указано их назначение; - 1 флаг управления . Обозначается df (Directory Flag).
Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу ( df = 0) либо наоборот, от конца строки к ее началу ( df = 1).
Для работы с флагом df существуют специальные команды: cld (снять флаг df ) и std (установить флаг df ).
Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками; - 5 системных флагов , управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.
Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы. В табл. 2 перечислены системные флаги, их назначение.
Таблица 1. Флаги состояния
Таблица 2. Системные флаги
eip/ip (Instraction Pointer register) — регистр -указатель команд .
Регистр eip/ip имеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip .Системные регистры микропроцессора
Само название этих регистров говорит о том, что они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Их также можно рассматривать как часть архитектуры микропроцессора, которая намеренно оставлена видимой для того, чтобы квалифицированный системный программист мог выполнить самые низкоуровневые операции.
Регистры управления
Эти регистры предназначены для общего управления системой.
Регистры управления доступны только программам с уровнем привилегий 0.Хотя микропроцессор имеет четыре регистра управления, доступными являются только три из них — исключается cr1 , функции которого пока не определены (он зарезервирован для будущего использования).
- pe (Protect Enable), бит 0 — разрешение защищенного режима работы .
Состояние этого флага показывает, в каком из двух режимов — реальном (pe=0) или защищенном (pe=1) — работает микропроцессор в данный момент времени. - mp (Math Present), бит 1 — наличие сопроцессора . Всегда 1.
- ts (Task Switched), бит 3 — переключение задач .
Процессор автоматически устанавливает этот бит при переключении на выполнение другой задачи. - am (Aligment Mask), бит 18 — маска выравнивания .
Этот бит разрешает (am = 1) или запрещает (am = 0) контроль выравнивания. - cd (Cache Disable), бит 30, — запрещение кэш-памяти .
С помощью этого бита можно запретить (cd = 1) или разрешить (cd = 0) использование внутренней кэш-памяти (кэш-памяти первого уровня). - pg (PaGing), бит 31, — разрешение (pg = 1) или запрещение (pg = 0) страничного преобразования .
Флаг используется при страничной модели организации памяти.
Регистр cr2 используется при страничной организации оперативной памяти для регистрации ситуации, когда текущая команда обратилась по адресу, содержащемуся в странице памяти, отсутствующей в данный момент времени в памяти.
В такой ситуации в микропроцессоре возникает исключительная ситуация с номером 14, и линейный 32-битный адрес команды, вызвавшей это исключение, записывается в регистр cr2 . Имея эту информацию, обработчик исключения 14 определяет нужную страницу, осуществляет ее подкачку в память и возобновляет нормальную работу программы;Регистр cr3 также используется при страничной организации памяти.
Это так называемый регистр каталога страниц первого уровня . Он содержит 20-битный физический базовый адрес каталога страниц текущей задачи. Этот каталог содержит 1024 32-битных дескриптора, каждый из которых содержит адрес таблицы страниц второго уровня. В свою очередь каждая из таблиц страниц второго уровня содержит 1024 32-битных дескриптора, адресующих страничные кадры в памяти. Размер страничного кадра — 4 Кбайт.Регистры системных адресов
Эти регистры еще называют регистрами управления памятью .
Они предназначены для защиты программ и данных в мультизадачном режиме работы микропроцессора.- глобальное — общее для всех задач;
- локальное — отдельное для каждой задачи.
- регистра таблицы глобальных дескрипторов gdtr (Global Descriptor Table Register) имеющего размер 48 бит и содержащего 32-битовый (биты 16—47) базовый адрес глобальной дескрипторной таблицы GDT и 16-битовое (биты 0—15) значение предела, представляющее собой размер в байтах таблицы GDT;
- регистра таблицы локальных дескрипторов ldtr (Local Descriptor Table Register) имеющего размер 16 бит и содержащего так называемый селектор дескриптора локальной дескрипторной таблицы LDT. Этот селектор является указателем в таблице GDT, который и описывает сегмент, содержащий локальную дескрипторную таблицу LDT;
- регистра таблицы дескрипторов прерываний idtr (Interrupt Descriptor Table Register) имеющего размер 48 бит и содержащего 32-битовый (биты 16–47) базовый адрес дескрипторной таблицы прерываний IDT и 16-битовое (биты 0—15) значение предела, представляющее собой размер в байтах таблицы IDT;
- 16-битового регистра задачи tr (Task Register), который подобно регистру ldtr, содержит селектор, то есть указатель на дескриптор в таблице GDT. Этот дескриптор описывает текущий сегмент состояния задачи (TSS — Task Segment Status). Этот сегмент создается для каждой задачи в системе, имеет жестко регламентированную структуру и содержит контекст (текущее состояние) задачи. Основное назначение сегментов TSS — сохранять текущее состояние задачи в момент переключения на другую задачу.
Регистры отладки
Это очень интересная группа регистров, предназначенных для аппаратной отладки. Средства аппаратной отладки впервые появились в микропроцессоре i486. Аппаратно микропроцессор содержит восемь регистров отладки, но реально из них используются только 6.
Регистры dr0, dr1, dr2, dr3 имеют разрядность 32 бит и предназначены для задания линейных адресов четырех точек прерывания. Используемый при этом механизм следующий: любой формируемый текущей программой адрес сравнивается с адресами в регистрах dr0. dr3 , и при совпадении генерируется исключение отладки с номером 1.
Регистр dr6 называется регистром состояния отладки. Биты этого регистра устанавливаются в соответствии с причинами, которые вызвали возникновение последнего исключения с номером 1.
- b0 — если этот бит установлен в 1, то последнее исключение (прерывание) возникло в результате достижения контрольной точки, определенной в регистре dr0 ;
- b1 — аналогично b0 , но для контрольной точки в регистре dr1 ;
- b2 — аналогично b0 , но для контрольной точки в регистре dr2 ;
- b3 — аналогично b0 , но для контрольной точки в регистре dr3 ;
- bd (бит 13) — служит для защиты регистров отладки;
- bs (бит 14) — устанавливается в 1, если исключение 1 было вызвано состоянием флага tf = 1 в регистре eflags ;
- bt (бит 15) устанавливается в 1, если исключение 1 было вызвано переключением на задачу с установленным битом ловушки в TSS t = 1.
- место регистрации контрольной точки — только в текущей задаче или в любой задаче. Эти биты занимают младшие восемь бит регистра dr7 (по два бита на каждую контрольную точку (фактически точку прерывания), задаваемую регистрами dr0, dr1, dr2, dr3 соответственно).
Первый бит из каждой пары — это так называемое локальное разрешение; его установка говорит о том, что точка прерывания действует если она находится в пределах адресного пространства текущей задачи.
Второй бит в каждой паре определяет глобальное разрешение, которое говорит о том, что данная контрольная точка действует в пределах адресных пространств всех задач, находящихся в системе; - тип доступа , по которому инициируется прерывание: только при выборке команды, при записи или при записи/чтении данных. Биты, определяющие подобную природу возникновения прерывания, локализуются в старшей части данного регистра.
Большинство из системных регистров программно доступны. Не все из них понадобятся в нашем дальнейшем изложении, но, тем не менее, я коротко рассмотрел их с тем, чтобы возбудить у читателя интерес к дальнейшему исследованию архитектуры микропроцессора.
По своим функциям все команды процессоров семейства x86 делятся на шесть категорий:
команды передачи данных;
команды управления потоком;
команды управления процессором;
команды для работы со строками.
Основные команды
Команда mov работает следующим образом:
Операнды «назначение» и «источник» могут быть записаны в разных режимах адресации. Режимом адресации называется способ определения адреса операнда. Рассмотрим режимы адресации данных.
1. Непосредственный. Значение операнда длиной 8 или 16 бит является непосредственной частью команды.
Пример 6.1: mov ax, 10
2. Прямой. Смещение адреса операнда указано прямо в команде.
Пример 6.2: mov i, ax
Пример 6.3: inc cx
4. Регистровый косвенный. Смещение адреса операнда находится в базовом регистре bx или bp или в индексном регистре si или di.
Пример 6.4: subax, [bx]
Пример 6.5: add ax, [bp+2]
6. Базовый индексный. Смещение адреса операнда определяется как сумма содержимого базового (bx или bp) и индексного регистров (si или di).
Пример 6.6: mov ax, [bx+si]
Пример 6.7: mov ax, [bx+si+2]
Команды pop иpush, а также другие команды, образованные на их основе (popa,pushfwи т.д.) являются командами пересылки данных между стеком и регистрами.
Стек – это специальный сегмент памяти, который выполняет следующие основные функции:
временно сохраняет значения регистров;
хранит адреса возврата из подпрограмм;
хранит динамические переменные.
Стек организован по принципу LIFO(last-in-first-out) – последним вошел, первым вышел. В регистреssсодержится адрес начала стекового сегмента. Регистрspуказывает на смещение относительно этого начального адреса.
Команда pushпомещает регистр в стек, а команда pop– извлекает. Поэтому правильное управление стеком заключается в том, чтобы на каждую командуpushбыла соответствующая команда pop:
Команда xchgпредназначена для двунаправленной пересылки данных.
Пример 6.8:xchg ax, bxменяет значения регистров между собой.
Обмен регистров можно осуществить и через стек, но только в три команды:
Пример 6.9:xchg ah, al меняет старшую и младшую часть регистраax.
Такой обмен можно проделать в три команды через третий регистр, который, в отличие от стека, может хранить восьмибитовые значения:
Команда xlatпредназначена для перекодировки символов по таблице перекодировки.
Команды передачи данных
Группа команд передачи данных представлена в табл. 6.1. Эта группа делится на четыре части.
Таблица 6.1. Команды передачи данных.
Основные команды
mov назначение, источник
переслать байт или слово
извлечение слова из стека
занесение слова в стек
xchg назначение, источник
перестановка байтов и слов
Команды ввода / вывода
in аккумулятор, порт
ввод байта или слова из порта
out порт, аккумулятор
вывод байта или слова в порт
Адресные команды
lds назначение, источник
загрузка регистра сегмента данных (ds)
lea назначение, источник
загрузка эффективного адреса
les назначение, источник
загрузка регистра дополнительного сегмента (es)
Команды флагов
загрузка флагов в регистр ah
извлечение регистра флагов из стека
занесение регистра флагов в стек
установка флагов из регистра ah
Команды передачи данных
Группа команд передачи данных представлена в табл. 6.1. Эта группа делится на четыре части.
Таблица 6.1. Команды передачи данных.
Основные команды
mov назначение, источник
переслать байт или слово
извлечение слова из стека
занесение слова в стек
xchg назначение, источник
перестановка байтов и слов
Команды ввода / вывода
in аккумулятор, порт
ввод байта или слова из порта
out порт, аккумулятор
вывод байта или слова в порт
Адресные команды
lds назначение, источник
загрузка регистра сегмента данных (ds)
lea назначение, источник
загрузка эффективного адреса
les назначение, источник
загрузка регистра дополнительного сегмента (es)
Команды флагов
загрузка флагов в регистр ah
извлечение регистра флагов из стека
занесение регистра флагов в стек
установка флагов из регистра ah
Команды передачи данных
Группа команд передачи данных представлена в табл. 6.1. Эта группа делится на четыре части.
Таблица 6.1. Команды передачи данных.
Основные команды
mov назначение, источник
переслать байт или слово
извлечение слова из стека
занесение слова в стек
xchg назначение, источник
перестановка байтов и слов
Команды ввода / вывода
in аккумулятор, порт
ввод байта или слова из порта
out порт, аккумулятор
вывод байта или слова в порт
Адресные команды
lds назначение, источник
загрузка регистра сегмента данных (ds)
lea назначение, источник
загрузка эффективного адреса
les назначение, источник
загрузка регистра дополнительного сегмента (es)
Команды флагов
загрузка флагов в регистр ah
извлечение регистра флагов из стека
занесение регистра флагов в стек
установка флагов из регистра ah
Основные команды
Команда mov работает следующим образом:
mov назначение источник.
Операнды «назначение» и «источник» могут быть записаны в разных режимах адресации. Режимом адресации называется способ определения адреса операнда. Рассмотрим режимы адресации данных.
1. Непосредственный. Значение операнда длиной 8 или 16 бит является непосредственной частью команды.
Пример 6.1: mov ax, 10
2. Прямой. Смещение адреса операнда указано прямо в команде.
Пример 6.2: mov i, ax
Пример 6.3: inc cx
4. Регистровый косвенный. Смещение адреса операнда находится в базовом регистре bx или bp или в индексном регистре si или di.
Пример 6.4: sub ax, [bx]
Пример 6.5: add ax, [bp+2]
6. Базовый индексный. Смещение адреса операнда определяется как сумма содержимого базового (bx или bp) и индексного регистров (si или di).
Пример 6.6: mov ax, [bx+si]
Пример 6.7: mov ax, [bx+si+2]
Команды pop и push, а также другие команды, образованные на их основе (popa, pushfw и т.д.) являются командами пересылки данных между стеком и регистрами.
Стек – это специальный сегмент памяти, который выполняет следующие основные функции:
временно сохраняет значения регистров;
хранит адреса возврата из подпрограмм;
хранит динамические переменные.
Стек организован по принципу LIFO (last-in-first-out) – последним вошел, первым вышел. В регистре ss содержится адрес начала стекового сегмента. Регистр sp указывает на смещение относительно этого начального адреса.
Команда push помещает регистр в стек, а команда pop – извлекает. Поэтому правильное управление стеком заключается в том, чтобы на каждую команду push была соответствующая команда pop:
Команда xchg предназначена для двунаправленной пересылки данных.
Пример 6.8: xchg ax, bx меняет значения регистров между собой.
Обмен регистров можно осуществить и через стек, но только в три команды:
Пример 6.9: xchg ah, al меняет старшую и младшую часть регистра ax.
Такой обмен можно проделать в три команды через третий регистр, который, в отличие от стека, может хранить восьмибитовые значения:
Команда xlat предназначена для перекодировки символов по таблице перекодировки.
По своим функциям все команды процессоров семейства x86 делятся на шесть категорий:
команды передачи данных;
команды управления потоком;
команды управления процессором;
команды для работы со строками.
Читайте также: