- •3.11.1 Команды пересылки данных
- •Команды пересылки общего назначения
- •Xchg приемник, источник
- •Команды загрузки адресных значений
- •Команды обращения к стеку
- •Команды пересылки флагов
- •Команды ввода/вывода
- •In аккумулятор, порт
- •In аккумулятор, dx.
- •3.11.2. Арифметические команды
- •Типы арифметических данных
- •Команды инкрементирования и декрементирования
- •Inc приемник
- •Команды сложения и вычитания
- •Команды расширения знака
- •Команды умножения и деления
- •Imul источник.
- •Команды десятичной коррекции
- •Сложение в bdc-формате
- •Вычитание в bcd-формате
- •Сложение в ascii-формате
- •Вычитание в ascii-формате
- •Умножение в ascii-формате
- •Деление в ascii-формате
- •3.11.3 Логические команды
- •Команды логических операций
- •Команды сравнения
- •Команды сдвигов
- •Команды логических сдвигов
- •Команды арифметических сдвигов
- •Команды циклических сдвигов
- •3.11.4. Команды передачи управления
- •Команды безусловных переходов
- •Команды условных переходов
- •Команды перехода по состоянию арифметических флагов
- •Команды перехода по соотношению между числами
- •Команды перехода по состоянию регистра cx
- •Команды управления циклами
- •Команды для организации подпрограмм
- •Команды прерываний
- •3.11.5. Команды обработки строк
- •Строковые примитивы
Команды циклических сдвигов
К этой подгруппе относятся команды ROL, ROR и RCL, RCR. Они осуществляют сдвиг в соответствии со схемами, приведенными на рис. 3.5,в. Особенностью этих команд является сохранение выдвинутых за пределы операнда битов путем включения их обратно в операнд. Очевидно, что команды RCL и RCR включают флаг переноса CF в кольцо сдвига, а команды ROL и ROR нет.
Команды циклического сдвига изменяют только флаги CF и OF. При этом CF формируется в соответствии со схемами, а OF идентично командам логического сдвига.
Пример 3.89:
Пусть перед выполнением каждой команды (AL)=11011010b и CF=0. Тогда после выполнения команд циклического сдвига получим:
ROL AL, 1 ; (AL)=10110101, CF=1
ROR AL, 1 ; (AL)=01101101, CF=0
RCL AL, 1 ; (AL)=10110100, CF=1
RCR AL, 1 ; (AL)=01101101, CF=0
Команды циклического сдвига позволяют изменять порядок следования битов в операнде.
Пример 3.90:
Выполнить зеркальную перестановку битов в регистре AL.
Если расположение битов в регистре AL до операции имеет вид A7A6A5A4A3A2A1A0, то после нее оно должно быть A0A1A2A3A4A5A6A7.
Подобные задачи решаются путем выделения очередного бита операнда на флаге CF за счет сдвига в одну сторону с последующим включением его в накопитель результата сдвигом в другую сторону.
Фрагмент программы для решения этой задачи имеет вид:
RCL AL, 1 ; Выделение бита операнда на CF
RCR DL, 1 ; Включение бита операнда в накопитель результата
После 8-кратного повторения этого фрагмента в регистре DL будет получен требуемый результат.
3.11.4. Команды передачи управления
Команды передачи управления предназначены для изменения естественного порядка выполнения команд. Их можно разделить на следующие подгруппы:
1) команды безусловных переходов;
2) команды условных переходов;
3) команды управления циклами;
4) команды для организации подпрограмм;
5) команды прерываний.
Все команды передачи управления не изменяют состояния флагов.
Команды безусловных переходов
К этой подгруппе относится единственная команда JMP, которая передаст управление по указанному адресу независимо от каких-либо условий. При этом переход может совершаться по прямому или косвенному адресу.
Команда прямого перехода записывается в формате JMP Labl и передает управление команде, помеченной меткой Labl. В зависимости от положения метки Labl относительно команды JMP могут совершаться короткий, ближний и дальний переходы.
Формат JMP Labl соответствует ближнему переходу (тип NEAR), когда команда JMP и метка Labl находятся в одном сегменте программного кода. В этом случае машинный код команды JMP содержит два байта для хранения дистанции disp до метки. При выполнении команды вычисляется адрес перехода (IP)=(IP)+disp(Labl) и управление передается в пределах всего сегмента.
Если метка находится в диапазоне от (128) до (+127) байтов от команды JMP, то для хранения дистанции может использоваться один байт. Для этого команда должна записываться в формате JMP SHORT Labl, что соответствует выполнению короткого перехода. Короткий переход является разновидностью ближнего перехода и выполняется за то же время. При коротком и ближнем переходах модифицируется только указатель команд IP.
В случае, если команда JMP и метка Labl находятся в различных сегментах программного кода, то переход является дальним (тип FAR). Для выполнения дальнего перехода команда в общем случае записывается в виде JMP FAR PTR Labl. В машинном коде этой команды находится полный логический адрес точки назначения в формате segment:offset, который и загружается в регистры CS:IP при ее выполнении.
Дальний переход может быть выполнен и командой JMP Labl, если где-то выше метка описана директивой LABEL как дальняя.
Пример 3.91:
; Прямые переходы
JMP Next ; Ближний переход на метку Next
JMP SHORT Cont ; Короткий переход на метку Cont
JMP FAR PTR Start ; Дальний переход на метку Start
JMP Begin ; Дальний переход на метку Begin, если
; Begin LABEL FAR
Команда косвенного перехода записывается в формате:
JMP источник
и передает управление по адресу, являющемуся содержимым операнда-источника. В качестве источника могут использоваться 16-битные РОН или ячейка памяти, адресуемая любым способом. Если адрес перехода задается регистром или словом в памяти, то команда JMP выполняет ближний косвенный переход. Если адрес перехода задается двойным словом в памяти, то выполняется дальний косвенный переход. При этом содержимое младшего слова указанного двойного слова загружается в регистр IP, а старшего в регистр CS.
Пример 3.92:
; Косвенные переходы
JMP AX ;Ближний косвенный переход по адресу (AX)
JMP Alfa ;Ближний косвенный переход по
;ячейке памяти (Alfa DW ?)
JMP DWORD PTR [BX] ;Дальний косвенный переход