Не более 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!