Не более 35-40 команд (-128 байтов)
Jmp m1
…
При прямом внутрисегментном переходе длина машинной jmp составляет 3 байта, т.к в этом случае адрес_перехода расширяется до двух байт, что позволяет осуществлять переход в пределах 64 Кбайт.
Косвенный внутрисегментный переход подразумевает «косвенность» задания адреса перехода. Это означает, что в команде указывается не сам адрес перехода, а место, где он «лежит». Приведем несколько примеров, в которых двухбайтовый адрес перехода выбирается либо из регистра, либо из области памяти.
Пример 1:
Lea bx, m1
Jmp bx ; адрес перехода в регситре bx
…
m1:
…
Data
Addr_m1 dw m1
…
Code
…
Jmp addr _ m 1 ; адрес перехода в ячейке памяти addr_m1
…
M1:
(слайд №6)
Пример 2:
…
Data
Addr dw m1
Dw m2
…
Code
…
cycl:
Mov si, 0
jmp addr [ si ] ; адрес перехода в слове памяти addr+(si)
…
Mov si, 2
Jmp cycl
m1:
…
m2:
…
В этом примере одна команда jmp может производить переходы на разные метки. Выбор конкретной метки перехода определяется содержимым si. Операнд команды jmp определяет адрес перехода косвенно, после вычисления выражения addr+(si).
Пример 3:
Data
Addr dw m1
…
Code
…
Lea si, addr
jmp near ptr [ si ] ; адрес перехода в ячейки памяти addr
…
m1:
В данном примере указание near ptr обязательно, т.к. адрес ячейки памяти addr с адресом перехода транслятору передается неявно.
|
|
(слайд №7)
Межсегментный переход предполагает другой формат машинной команды jmp. При осуществлении межсегментного перехода кроме регистра eip/ip модифицируется также и регистр cs. Аналогично внутрисегментному переходу, межсегментный переход поддерживают два варианта команд безусловного перехода: прямой и косвенный.
Команда межсегментного перехода имеет длину 5 байтов, из которых 2 байта составляют значение смешения и 2 байта – значение сегментной составляющей адреса.
Пример:
Seg_1 segment
…
Jmp far ptr m 2 ; здесь far обязательно
...
M1 label far
…
Seg_1 ends
Seg_1 segment
…
M 2 label far ; здесь far не обязательно
Jmp m1
Команда косвенного межсегментного перехода в качестве операнда имеет адрес области памяти, в которой содержатся смещение и сегментная часть целевого адреса перехода.
Пример:
Data segment
Addr _ m 1 dd m 1 ; в поле addr_m1 значения смещения и адреса сегмента метки m1
Data ends
Code_1 segment
...
Jmp m1
…
Code_1 ends
Code_2 segment
…
M1 label far
Mov ax, bx
…
Code_2 ends
(слайд №8)
Как вариант косвенно межсегментного перехода необходимо отметить косвенный регистровый межсегментный переход. В этом виде перехода адрес перехода указывается косвенно; он содержится в регистре. Это очень удобно для программирования динамических переходов, в которых адрес перехода может изменяться на стадии выполнения программы.
|
|
Пример:
Data segment
Addr _ m 1 dd m 1 ; в поле addr_m1 значения смещения и адреса сегмента метки m1
Data ends
Code_1 segment
…
Lea bx, addr_m1
jmp dword ptr[bx]
…
Code_1 ends
Code_2 segment
…
M1 label far
Mov ax, bx
…
Code_2 ends
Таким образом, модификаторы short ptr, near ptr и word ptr применяются для организации внутрисегментных переходов, а far ptr и dword ptr – межсегментных.
(слайд №9)
Условные переходы.
В системе команд микропроцессора есть большая группа команд, умеющих принимать решение о том, какая команда должна выполняться следующей. Решение принимается в зависимости от определенных условий. Условие определяется выбором конкретной команды перехода. Микропроцессор имеет 18 команд условного перехода, позволяющие проверить:
1. отношение между операндами со знаком («больше-меньше»);
2. отношение между операндами без знака («выше-ниже»);
|
|
3. состояние арифметических флагов zf, sf, cf, of, pf (но не af).
Команды условного перехода имеют одинаковый синтаксис:
Jcc метка_перехода
Как видно мнемокод всех команд начинается с «j» - от слова jump (прыжок), cc – определяет конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то эта метка может находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается.
Для того, чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления. Источниками такого условия могут быть:
1. любая команда, изменяющая состояние арифметических флагов;
2. команда сравнения cmp, сравнивающая значения двух операндов;
3. состояние регистра ecx/cx.
(слайд №10)
3.3.1. Команда сравнения cmp.
Команда сравнения cmp имеет такой же принцип работы, как и команда вычитания
S ub операнд_1, операнд_2
Она тоже выполняет вычитание операндов и устанавливает флаги, но не записывает результат вычитания в первый операнд.
Синтаксис команды следующий:
|
|
С mp операнд_1, операнд_2
(compare) – сравнивает 2 операнда и по результатам сравнения устанавливает флаги.
Флаги, устанавливаемые командой cmp, можно анализировать специальными командами условного перехода. Мнемоника этих команд следующая:
Мнемоника | Англ. | Русский | Тип операнда |
E e | equal | равно | любые |
N n | not | не | любые |
G g | greater | больше | числа со знаком |
L l | less | меньше | числа со знаком |
A a | above | выше, в смысле «больше» | числа без знака |
B b | below | ниже, в смысле «меньше» | числа без знака |
(слайд №11)
3.3.2. Команды условного перехода следующие:
Типы операндов | Мнемокод | Критерий перехода | Значения флагов |
любые | je | операнд_1 = операнд_2 | zf = 1 |
любые | jne | операнд_1 <> операнд_2 | zf = 0 |
со знаком | jl/jnge | операнд_1 < операнд_2 | sf <> of |
со знаком | jle/jng | операнд_1 <= операнд_2 | sf <> of or zf = 1 |
со знаком | jg/jnle | операнд_1 > операнд_2 | sf = of or zf = 0 |
со знаком | jge/jnl | операнд_1 => операнд_2 | sf = of |
без знака | jb/jnae | операнд_1 < операнд_2 | cf = 1 |
без знака | jbe/jna | операнд_1 <= операнд_2 | cf = 1 or zf = 1 |
без знака | ja/jnbe | операнд_1 > операнд_2 | cf = 0 or zf = 0 |
без знака | jae/jnb | операнд_1 => операнд_2 | cf = 0 |
(слайд №12)
В качестве примера применения команды cmp рассмотрим фрагмент программы, который заносит в поле pole_m длиной n байт числа от 1 до 50:
Model small
Stack 100h
Data
N equ 50
Pole_m db n dup (?)
Code
start:
…
Xor bx, bx
Xor cx, cx
Mov cx, 1
m1:
mov pole_m[bx], cx
Inc cx
Inc bx
Cmp bx, n
Jne m1
exit:
Mov ax, 4c00h
Int 21h
End start
Так как команды условного перехода не изменяют флагов, то после одной команды cmp вполне могут следовать несколько команд условного перехода. Это может быть сделано для того, например, чтобы исследовать каждую из альтернативных ветвей: «больше», «меньше», или «равно».
Пример:
Data
Mas db dup (?)
Code
…
cmp mas [ si ], 5 ; сравнить очередной элемент массива с 5
Дата добавления: 2022-07-02; просмотров: 21; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!