Команды передачи управления. Реализация разветвлений. (Лекция 12)

Содержание

Слайд 2

Безусловные переходы: JMP

Безусловные переходы различаются:
по типу:
∙ «внутрисегментный» переход в текущем

Безусловные переходы: JMP Безусловные переходы различаются: по типу: ∙ «внутрисегментный» переход в
кодовом сегменте. Изменяет только регистр IP
∙ «межсегментный» переход в другой кодовый сегмент. Изменяет CS и IP
по способу указания адреса перехода:
∙ «прямой» - адрес перехода указан в команде
∙ «косвенный» - адрес перехода задан в регистре/памяти

Слайд 3

Прямой внутрисегментный JMP

jmp m1 ; переход на команду с симв. адресом

Прямой внутрисегментный JMP jmp m1 ; переход на команду с симв. адресом
m1
next: команда
. . . . .
m1: mov ax, bx
Машинный код внутрисегментного JMP содержит не адрес перехода, а «расстояние» перехода в байтах. Расстояние перехода в сегменте (Δ) вычисляется транслятором так:
Δ = адрес перехода – адрес следующей за JMP команды
Для нашего примера это будет разница адресов: m1 – next
Выполнение процессором прямого внутрисегментного JMP:
IP ← текущий IP + Δ

Слайд 4

«Короткий» прямой внутрисегментный JMP

Указание short для транслятора позволяет сократить создаваемый им машинный

«Короткий» прямой внутрисегментный JMP Указание short для транслятора позволяет сократить создаваемый им
код команды, если ваше расстояние перехода - в диапазоне от +127 до -128 байт. Транслятор будет выделять не 2 байта на расстояние, а 1 байт.
Примеры: протоколы трансляции обычного и короткого внутрисегментных JMP.
jmp n3 jmp short n3

Слайд 5

Косвенный внутрисегментный JMP

Новое значение для регистра IP задается для процессора косвенно: в

Косвенный внутрисегментный JMP Новое значение для регистра IP задается для процессора косвенно:
регистре или в памяти.
При исполнении косвенного внутрисегментного JMP процессор заносит в IP новое значение.
Примеры: Команда Исполнение процессором
переход по адресу, заданному в регистре BX
JMP BX ; IP ← BX
переход по адресу, записанному в память по адресу ds: [si].
JMP word ptr ds:[si] ; IP ← слово из ds:[si]

Слайд 6

Прямой межсегментный JMP

Используют в программах с
несколькими кодовыми
сегментами
JMP far ptr имя

Прямой межсегментный JMP Используют в программах с несколькими кодовыми сегментами JMP far
сегмента:
внутрисегментный адрес
Указание far ptr позволяет транслятору отличить межсегментный переход от внутрисегментного

Пример: два кодовых сегмента

Слайд 7

Косвенный межсегментный JMP

Значения CS и IP для перехода в другой кодовый сегмент

Косвенный межсегментный JMP Значения CS и IP для перехода в другой кодовый
считываются процессором из памяти: первое слово - в IP, следующее слово – в CS.
Для транслятора надо давать указание dword ptr, чтобы он отличил межсегментный косвенный переход от внутрисегментного.
Пример:
Межсегментный переход по адресу, записанному в памяти по адресу ds:[bx]
JMP dword ptr ds:[bx]
Исполнение команды процессором: IP ← слово из ds:[bx]
CS ← слово из ds:[bx+2]

Слайд 8

Условные переходы: Jxx

Команда условного перехода выполняется процессором только, если соблюдается условие перехода.

Условные переходы: Jxx Команда условного перехода выполняется процессором только, если соблюдается условие
Иначе, она пропускается
Условием перехода может быть состояние арифметического флага или соотношение двух величин
Условные переходы бывают только одного типа - прямые внутрисегментные
Замечание: в системе команд в описании команд условных переходов через слэш (/) записаны альтернативные мнемоники этих команд. Использовать можно любую.

Слайд 9

Переходы по состоянию арифметических флагов

Есть условные переходы по состоянию флагов CF, SF,

Переходы по состоянию арифметических флагов Есть условные переходы по состоянию флагов CF,
ZF, PF и OF:
JC m1; переход по адресу
m1, если СF=1
JNC .. ; переход, если СF=0
JZ … ; переход, если ZF=1
JNZ .. ; переход, если ZF=0
Аналогично:
JS и JNS – переходы по SF
JP и JNP - переходы по PF
JO и JNO – переходы по OF

Фрагмент алгоритма: если при сложении кодов из AL и BL возник перенос, занести в AH единицу.
Реализация:

Слайд 10

Переходы по соотношению двух величин

Сначала надо сравнить две величины командой CMP, что

Переходы по соотношению двух величин Сначала надо сравнить две величины командой CMP,
сформирует актуальные арифметические флаги
Далее, использовать команду условного перехода по нужному соотношению величин (см. систему команд):
>, <, =, ≠ , =>, <=
Для проверки соотношения величин процессор проверяет как отдельные флаги, так и комбинации арифметических флагов
Команды условных переходов по соотношению различны для беззнаковых и знаковых сравниваемых величин !!

Слайд 11

Команды условных переходов по соотношению величин

Система команд содержит две группы команд условных

Команды условных переходов по соотношению величин Система команд содержит две группы команд
переходов по соотношению двух кодов: одна – для беззнаковых, другая – для знаковых.
для соотношения беззнаковых кодов используются термины «выше» и «ниже»
для соотношения знаковых кодов – «больше» и «меньше»
«равно» - для любых кодов
Примеры:
cmp al, bl
JA m1 ; переход на m1, если al > bl («выше»). Коды в регистрах процессор рассматривает, как беззнаковые
cmp al, bl
JG m1 ; переход на m1, если al > bl («больше»). Коды в регистрах процессор рассматривает, как знаковые

Слайд 12

Пример. В регистрах al и bl находятся беззнаковые коды. Если они равны,

Пример. В регистрах al и bl находятся беззнаковые коды. Если они равны,
в байт памяти с адресом ds:res записать 1. Если al > bl, то записать число 2, иначе - 3


cmp al, bl
je short f1 ; если =
ja short f2 ; если >
mov ds:rez, 3
fin: mov ah, 4ch
int 21h
f1: mov ds:rez, 1
jmp short fin
f2: mov ds:rez, -2
jmp short fin

ВАЖНО:
Условие разветвления ставьте так, чтобы по «нет» идти в алгоритме вниз, по «да» - в бок

!! При реализации алгоритма пишите код, проходя алгоритм по «нет» до завершения. Затем – дописывайте ветки ответвлений «в бок».