Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Команды косвенных переходов (внутрисегментных и межсегментных) передают управление на команду, адрес которой определяется содержимым регистра или ячеек оперативной памяти, на которые указывает закодированный в команде перехода постбайт.
Команды условных переходов являются только внутрисегментными. По своему формату и способу формирования нового значения IP они полностью аналогичны команде внутрисегментного прямого перехода с 8-разрядным смещением. Отличие их заключается в том, что в командах условного перехода механизм формирования нового значения IP включается лишь при выполнении определенных условий, а именно, при определенном состоянии регистра флагов. При невыполнении проверяемого условия в IP остается его текущее значение, то есть адрес команды, следующей за командой условного перехода.
Ниже приведены примеры команд переходов различных типов.
· Команды условного перехода:
формат:
![]()
IP = IP + 2, если условие не выполнено;
IP = IP +2 + disp L, если условие выполнено;
пример:
JZ MARK; переход на метку MARK, если ZF = 1.
· Команды прямого внутрисегментного перехода:
формат:
![]()
IP = IP + Δ + disp, где Δ - длина команды перехода (2 или 3 в зависимости от длины смещения);
примеры:
JMP short ptr MARK; переход на метку MARK, с использованием 8-разрядного смещения;
JMP near ptr MARK; переход на метку MARK, с использованием 16-разрядного смещения.
· Команды прямого межсегментного перехода
формат:
![]()
IP = IP_H, IP_L,
CS = CS_H, CS_L;
пример:
JMP far ptr MARK; переход на метку MARK к команде, находящейся в другом сегменте.
· Команды косвенного внутрисегментного перехода:
формат:
![]()
IP = [EA + 1, EA]; или
IP = <регистр>, если в постбайте задано обращение к регистровой памяти;
пример:
JMP word ptr [BX + SI]; новое значение IP берется из двух последовательных байт памяти, эффективный адрес первого из которых определяется суммой регистров BX и SI.
· Команды косвенного межсегментного перехода:
формат:
![]()
IP = [EA + 1, EA],
CS = [EA + 3, EA + 2];
пример:
JMP dword ptr [BX + SI]; сумма регистров BX и SI определяет эффективный адрес области памяти, первые два байта которой содержат новое значение IP, а следующие два байта - новое значение CS.
Команды циклов идентичны по формату и очень близки по выполняемым действиям командам условных переходов. Однако по сравнению с последними они имеют ряд особенностей, позволяющих эффективно использовать их при программировании циклических участков алгоритмов.
Один из наиболее распространенных видов циклического участка программы представлен на рис. 6.3.

Рис. 6.3. Структура счетного цикла с постпроверкой
Команды циклов предназначены для упрощения действий декремента (уменьшения на 1) счетчика цикла, проверки условия выхода из цикла и перехода.
Некоторые команды цикла реализуют выход из цикла не только по значению счетчика, но и при выполнении некоторых других условий.
Описание команд цикла сведено в табл. 6.5. За исключением команды JCXZ, которая не изменяет значения регистра CX, при выполнении команд циклов производятся следующие действия: CX=(CX)-1. Затем, если проверяемое условие выполнено, то IP=(IP)+disp8 с расширением смещения знаком до 16 разрядов, в противном случае IP не изменяется, и программа продолжает выполнение в естественном порядке.
Таблица 6.5. Команды циклов | ||||
Название | Мнемоника | Альтернативная мнемоника | КОП | Проверяемое условие |
Зациклить | LOOP | 11100010 | (CX)=0 | |
Зациклить пока ноль (равно) | LOOPZ | LOOPE | 11100001 | (ZF=1)&(CX)=0) |
Зациклить пока не ноль (неравно) | LOOPNZ | LOOPNE | 11100000 | (ZF=0)&((CX)=0) |
Перейти по (CX) | JCXZ | 11100011 | (CX)=0 |
Кодирование команд
С целью лучшего понимания архитектуры ЭВМ рассмотрим машинное представление команд различных форматов, использующих различные режимы адресации операндов.
Рассмотрим это на примере операции сложения. Так как в системе команд ЭВМ, базирующихся на микропроцессорах фирмы Intel, результат операции записывается на место первого операнда, то данная операция будет иметь вид: a=a+b.
Для наглядного представления команды будем пользоваться ее символической записью, приближенной к записи на языке Ассемблер. Общий формат ассемблерной команды имеет следующий вид:
[Метка:] Мнемоника_операции Операнд, Операнд [; Комментарий]
Метка - это идентификатор, присваиваемый адресу первого байта команды. Наличие метки в команде необязательно. При отсутствии метки двоеточия быть не должно.
Во всех командах необходимо наличие мнемоники, обозначающей выполняемую команду.
Наличие и количество (один или два) операндов зависит от команды. В случае двух операндов они разделяются запятой, при этом первым указывается операнд-приемник, а вторым - операнд-источник. Примеры обозначения операндов при различных режимах адресации будут рассмотрены ниже.
Поле комментария предназначено для пояснения программы и может содержать любую комбинацию символов. При отсутствии комментария точка с запятой может не ставиться.
Кодирование линейных команд
Пример 1.
Оба операнда находятся в регистрах общего назначения: (AX)=a; (CX)=b. Для обращения к операндам используется прямая регистровая адресация.
Символическая запись команды:
ADD AX, CX
Согласно таблица 6.2 машинное представление этой команды имеет вид:
000000dw md reg r/m
По условию операнды занимают полноразрядные регистры длиной 1 слово, следовательно, необходимо установить w=1.
Так как оба операнда располагаются в регистрах общего назначения, то любой из них можно закодировать в поле reg. Поэтому команда может иметь два различных представления в машинном коде. При этом, если в поле reg закодирован номер регистра AX, то бит приемника результата d=1. Если в поле reg закодирован номер регистра CX, то бит приемника результата d=0.

или

Здесь и далее в записи команд b означает двоичное представление, h - 16-е.
После выполнения команды в AX будет записана сумма содержимого регистров AX и CX, а указатель команды IP увеличится на длину выполненной команды (2 байта) и будет указывать на первый байт следующей команды.
Здесь и далее представление информации будем давать в 16-м виде, если другое не оговорено особо.
Если перед началом выполнения команды (AX)=0C34, (CX)=1020, (IP)=0012, то после ее выполнения (AX)=1C54, (CX)=1020, (IP)=0014.
Пример 2.
Операнд a находится в регистре AX, b - непосредственный операнд, равный 56B3h.
Символическая запись команды:
ADD AX,56B3h
Машинное представление:

Если непосредственный операнд имеет величину, которая может быть закодирована в одном байте, например, 77 (в десятичной системе счисления), что при представлении в дополнительном коде дает 0100 1101b = 4Dh, то за счет использования признака s удается сократить длину команды:

Данное представление команды построено по общей схеме команд суммирования любого регистра с непосредственным операндом. Так как в нашем случае непосредственный операнд суммируется с содержимым регистра AX, то команда может быть записана в специальном формате работы с регистром - аккумулятором и иметь меньшую длину:

для операнда 56B3h.
Возможность использования признака s в этом формате отсутствует.
Пусть перед началом выполнения команды (AX)=03A4, (IP)=0012.
Тогда результатом выполнения команды ADD AX,56B3h будет: (AX)=5A57, (IP)=0016, а результатом выполнения команды ADD AL, B3h будет: (AX)=0357, (IP)=0015, если команда закодирована по общей схеме, и (IP)=0014 - если по схеме суммирования с аккумулятором.
Отметим, что в последнем случае действие выполняется лишь с младшим байтом регистра AX, то есть с регистром AL, и его результат не влияет на содержимое AH.
Пример 3.
Операнд a находится в AX, операнд b - в оперативной памяти по прямому адресу 3474h.
Символическая запись команды:
ADD AX,[3474h]
Ее машинное представление:

Пусть перед выполнением команды (AX)=1234, [3474h]=1A, [3475h]=25, (IP)=0012. Напомним, что адрес слова в оперативной памяти - это адрес его младшего байта. Тогда после выполнения команды: (AX)=374E, (IP)=0016.
Пример 4.
Если операнд a находится в оперативной памяти по прямому адресу 3474h, а операнд b представляет собой непосредственный операнд, равный 56B3h, то символическая запись команды имеет вид:
ADD [3474h],56B3h
а ее машинное представление:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |


