Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
15.04.2015
Размер:
1.15 Mб
Скачать

Второй сегмент

seg2 segment

…………..

m2 label far

jmp m1 ;здесь far ptr необязательно

seg2 ends

Если метка в тексте программы встречается раньше, чем обращение к ней, то модификатор far ptr можно не указывать.

Косвенный межсегментный переход.

Адрес метки должен быть записан в сегмент данных, а в команде jmp указывается адрес памяти, где расположен адрес метки.

data segment

adr dd m1

data ends

code1 segment

……………………

jmp adr

………………….…

code1 ends

code2 segment

m1 label far

mov ax,bx

…………..

code2 ends

Косвенный регистровый межсегментный переход

Адрес перехода указывается косвенно в регистре. Применяется, когда адрес перехода меняется во время выполнения прграммы.

data segment

adr dd m1

data ends

code1 segment

……………………

lea bx,adr

jmp dword ptr [bx]

………………….…

code1 ends

code2 segment

m1 label far

mov ax,bx

…………..

code2 ends

Команды условного перехода

Передача управления возможна в пределах одного сегмента.

Для принятия решения о том, куда будет передано управление, должно быть сформировано условие.

Способы формирования условия:

  1. Любая команда, изменяющая состояние арифметических флагов.

  2. Команда сравнения: cmp опер.1,опер.2 (из опер.1 вычитается опер.2, а результат никуда не записывается, воздействует только на флаги)

  3. Состояние регистра cx/ecx

Операнды Команда

Условие

Состояние флага

любые

je

=

zF=1

jne

zF=0

со знаком

jl

<

SF#OF

jle

<=

SF#OFor ZF=1

jg

>

SF=OF and ZF=0

jge

>=

SF=OF

без знака

jb

<

CF=1

jbe

<=

CF=1 or ZF=1

ja

>

CF=0 and ZF=0

jae

>=

CF=0

Пример:

.data

n equ 50 ; в сегменте данных выделяется const=50

pole db n dup(?)

.code

start:

mov bx,0

m1:

mov pole [bx],0 ; обнуляется массив данных в m1

inc bx ; увеличивается bx на 1

cmp bx,n ; сравниваем bx с n

jne m1 ; если bx ≠ n, то переход в m1 для обнуления

…; если bx=50, то выходим из программы.

end start

  1. Команды условного перехода и флаги

Команды передачи управления анализируют состояния флагов

jc/jnc - cf=1/0 – флаг переноса

jp/jnp - pf=1/0 – флаг паритета

jz/jnz - zf=1/0 – флаг нуля

js/jns - sf=1/0 – флаг знака

jo/jno - sf=1/0 – флаг переполнения

  1. Процедуры

Это любой участок программы, который заканчивается директивой ret.

имяproc [модификатор]

ret

имя endp

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

  1. Процедура в начале кодового сегмента

. code

main proc near ;ближняя процедура

ret

main endp

start:

mov ax, 4c00h

int 21h

end start

  1. Процедура в конце кодового сегмента

.code

start:

mov ax, 4c00h; выход в систему

int 21h

main proc near

ret

main endp

end start

  1. Процедура в теле сегмента

start:

jmp m1

main proc near

ret

main endp

m1:

mov ax, 4c00h

int 21h

end start