Lectures / 09
.pdfКоманда jmp: Примеры (VI)
6
data segment
addr_m1 dd m1 data ends
code1 segment ….
jmp addr_m1 ….
jmp m1 code1 ends
code2 segment
….
m1 label far ….
code2 ends
Косвенный межсегментный
Прямой межсегментный
Команда сравнения cmp
cmp оп1, оп2
Сравнивает два операнда: оп1 - оп2
Устанавливает флаги: cf
pf
af - по этому флагу нет условного перехода zf
sf of
Команды условного перехода jxx
jcc метка_перехода
Значение аббревиатур в командах jcc:
|
Англ. |
Рус. |
Тип операнда |
|
|
|
|
e |
Equal |
Равно |
Любой |
n |
Not |
Не |
Любой |
|
|
|
|
g |
Greater |
Больше |
Числа со знаком |
l |
Less |
Меньше |
Числа со знаком |
|
|
|
|
a |
Above |
Выше (>) |
Числа без знака |
b |
Below |
Ниже (<) |
Числа без знака |
|
|
|
|
Команды условного перехода jxx
Мнемо- |
|
Типы |
|
Критерий |
|
Значение |
|
|
|
|
|||||
код |
|
операндов |
|
перехода |
|
флагов |
|
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 and zf=0 |
jge/gnl |
|
Со знаком |
|
оп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 and zf=0 |
|
jae/jnb |
|
Без знака |
|
оп1 >= оп2 |
|
cf = 0 |
|
|
|
|
|
|
|
|
|
Команды условного перехода: Пример 1
.data
n equ 50
m db n dup (?)
Обнулить поле длиной 50 байтов
.code
…
xor m1: mov
inc cmp
jne
...
bx,bx
m[bx],0 bx
bx, n m1
Другой способ (короче):
mov bx,n
m1: mov m[bx-1],0 dec bx
jne m1 ;или jnz m1
Команды условного перехода: Пример 2
.data |
|
|
|
mas |
db 50 dup (?) |
||
.code |
|
|
|
… |
cmp |
mas[si], 5 |
|
|
|||
|
je |
eql |
|
|
После команды, |
||
|
устанавливающей флаги, |
||
|
jl |
less |
|
|
можно использовать |
||
|
jg |
grt |
несколько команд |
|
условного перехода |
eql: … ;если элемент=5 less: … ;если элемент<5 grt: ... ;если элемент>5
Команды условного перехода по
значению флага
Мнемокод |
Название |
Значение флага |
|
флага |
для переноса |
||
|
|||
jc |
Переноса |
cf = 1 |
|
jp/jpe |
Четности |
pf = 1 |
|
jz |
Нуля |
zf = 1 |
|
js |
Знака |
sf = 1 |
|
jo |
Переполнения |
of = 1 |
|
|
|
|
|
jnc |
Переноса |
cf = 0 |
|
jnp/jpo |
Четности |
pf = 0 |
|
jnz |
Нуля |
zf = 0 |
|
jns |
Знака |
sf = 0 |
|
jno |
Переполнения |
of = 0 |
Команды условного перехода по
значению регистра cx/ecx
jcxz метка_перехода
Переход, если cx =0
jecxz метка_перехода
Переход, если ecx =0
Команда цикла loop
loop метка
•Декремент cx
•Сравнение cx с нулем:
если cx>0, то переход на метку
если cx=0, то выполнение следующей после loop команды
Команда цикла loop: Пример
.data |
|
|
|
|
|
|
Увеличить |
||
mas |
dw 5,7,-4,…,78 |
|||
каждый из |
||||
.code |
|
|
20 |
|
|
|
элементов |
||
…. |
|
|
||
|
|
массива на 5 |
||
|
|
|
||
|
|
|
||
|
mov cx,20 ; счетчик цикла |
|||
|
xor |
si,si |
|
|
m1: |
add |
mas[si],5 |
|
|
|
add |
si,2 ; к след. элементу |
loop m1
….