Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
100
Добавлен:
09.12.2018
Размер:
1 Мб
Скачать
☆

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

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

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