-
Ассемблер (продолжение) Команды управления потоком
Группа команд управления потоком представлена в табл. 7.1. Эта группа делится на четыре части.
Таблица 7.1. Команды управления потоком.
Мнемокод / Операнды |
Описание |
Команды безусловного перехода |
|
call адрес |
вызов процедуры |
jmp адрес |
безусловный переход |
ret адрес |
возврат из процедуры |
retn адрес |
возврат из ближней процедуры |
retf адрес |
возврат из дальней процедуры |
Команды условного перехода |
|
ja/jnbe короткий адрес |
переход, если выше/не ниже или равно |
ja/jnbe короткий адрес |
переход, если выше или равно/не ниже |
jb/jnae короткий адрес |
переход, если ниже/не выше или равно |
jbe/jna короткий адрес |
переход, если ниже или равно/не выше |
jc короткий адрес |
переход, если был перенос |
je/jz короткий адрес |
переход, если равно/нуль |
jg/jnle короткий адрес |
переход, если больше/не меньше или равно |
jl/jnge короткий адрес |
переход, если больше или равно/не меньше |
jle/jng короткий адрес |
переход, если меньше или равно/не больше |
jnc короткий адрес |
переход, если нет переноса |
jne/jnz короткий адрес |
переход, если не равно/не нуль |
jno короткий адрес |
переход, если нет переполнения |
jnp/jpo короткий адрес |
переход, если нет паритета/ паритет нечетный |
jns короткий адрес |
переход, если нет знака |
jo короткий адрес |
переход, если по переполнению |
jp/jpe короткий адрес |
переход, если есть паритет/ паритет четный |
js короткий адрес |
переход, если есть знак |
Команды цикла |
|
jcxz короткий адрес |
переход, если cx=0 |
loop короткий адрес |
цикл, пока cx<>0 |
loope/loopz короткий адрес |
цикл, если равно или нуль |
loopne/loopnz короткий адрес |
цикл, если не равно или не нуль |
Команды прерывания |
|
int номер прерывания |
вызов прерывания |
into |
прерывание по переполнению |
iret |
возврат из процедуры обработки прерывания |
Безусловный переход
Безусловный переход изменяет адрес следующей исполняемой программы. При безусловных переходах в регистр ip, а в некоторых случаях также в регистр кодового сегмента cs загружаются значения новых адресов.
Пример 7.1. Использование подпрограммы AddReg.
IDEAL
MODEL small
STACK 100h
DATASEG
exCode db 0
CODESEG
Start: mov ax,@data
mov ds,ax
mov al,1
mov bl,2
call AddReg
call AddReg
call AddReg
Exit: mov ah,04Ch
mov al,[exCode]
int 21h
Proc AddReg
xor ah,ah
xor bh,bh
adc ax,bx
ret
ENDP AddReg
END Start
Во время пошагового выполнения программы (пример 7.1.) в отладчике td можно заметить, что при исполнении команды call адрес возврата (адреса команды, следующей за командой call) проталкивается в стек. А во время исполнения команды ret адрес возврата выталкивается из стека в регистр ip.
Пример 7.2. Использование команды jmp в качестве задержки.
jmp $+2
Пример 7.3. Использование команды jmp для коротких переходов (длина команды 2 байта).
jmp short ptr m1
;… не более 35-40 команд
m1: ;…
или
m1:
;…не более 35-40 команд
jmp m1
Пример 7.4. Использование команды jmp для внутрисегментных переходов (длина команды 3 байта).
m1:
;…расстояние более 128 байт и менее 64 КБайт
jmp m1
или
.data
addr_m1 dw m1
;…
.code
jmp addr_m1
;…
m1:
или
lea bx,m1
jmp bx
;…
m1: …
Пример 7.5. Использование команды jmp для межсегментных переходов (длина команды 5 байт).
seg_1 segment
;…
jmp far ptr m1; far здесь обязательно
;…
m1 label far
;…
seg_1 ends
seg_2 segment
;…
m2 label far
jmp m1