Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 17 - 18 - Система команд IA-32.ppt
Скачиваний:
47
Добавлен:
18.02.2023
Размер:
612.35 Кб
Скачать

Команды передачи управления

Команда вызова прерывания:

INT номер

INT 3

INTO

Номер – непосредственное 8-ми разрядное значение.

Вызывает переход на обработчик прерывания, адрес которого находится в таблице векторов прерываний. В стек заносится адрес возврата и регистр флагов.

Пример:

int 10h

Команды передачи управления

Возврат из вызова прерывания:

IRET

Осуществляет дальний переход по адресу возврата сохраненному в стеке командой INT с восстановлением регистра флагов.

Пример:

iret

Команды передачи

управленияКоманды условных переходов: Jcc Адрес

Адрес – непосредственное значение разрядностью 8, 16 или 32 бита, представляющее собой относительное смещение следующей команды. На языке Ассемблер представляются в виде меток, которые затем транслируются в непосредственные значения.

Команды условных переходов осуществляют только ближние переходы. Если необходимо выполнить дальний переход, то приходится комбинировать команду условного перехода с командой безусловного перехода.

 

Мнемоника

Значение

Тип операндов

 

 

 

 

 

 

 

E e

Equal (равно)

Любые

 

 

 

 

 

 

 

N n

Not (не)

Любые

 

 

 

 

 

 

 

G g

Greater (больше)

Числа со знаком

 

 

 

 

 

 

 

L l

Less (меньше)

Числа со знаком

 

 

 

 

 

 

 

A a

Above (выше, «больше»)

Числа без знака

 

 

 

 

 

 

 

B b

Below (ниже, «меньше»)

Числа без знака

 

 

 

 

 

 

 

 

 

 

 

Команды передачи управления

Мнемоника

 

 

Флаги

 

 

Описание

 

 

 

 

 

 

 

 

 

 

OF

CF

 

ZF

 

PF

SF

 

 

 

 

 

 

 

 

 

 

JE / JZ

X

X

 

1

 

X

X

Переход если ZF==1

JP / JPE

X

X

 

X

 

1

X

Переход если PF==1

 

 

 

 

 

 

 

 

 

JO

1

X

 

X

 

X

X

Переход если OF==1

JC

X

1

 

X

 

X

X

Переход если CF==1

JS

X

X

 

X

 

X

1

Переход если SF==1

JNE / JNZ

X

X

 

0

 

X

X

Переход если ZF==0

 

 

 

 

 

 

 

 

 

JNP / JPO

X

X

 

X

 

0

X

Переход если PF==0

 

 

 

 

 

 

 

 

 

JNO

0

X

 

X

 

X

X

Переход если OF==0

JNC

X

0

 

X

 

X

X

Переход если CF==0

JNS

X

X

 

X

 

X

0

Переход если SF==0

 

 

 

 

 

 

 

 

 

Команды передачи управления

Мнемоника

 

 

Флаги

 

 

Описание

 

 

 

 

 

 

 

 

 

 

 

 

 

OF

CF

 

ZF

 

PF

SF

 

 

 

 

 

 

 

 

 

 

 

JL / JNGE

A

X

 

X

 

X

B

Переход если OF!=SF, оп_1 < оп_2

 

 

 

 

 

 

 

 

 

JLE / JNG

A

X

 

1

 

X

B

Переход если Z==1 или OF!=SF, оп_1 <= оп_2

 

 

 

 

 

 

 

 

 

JNL / JGE

A

X

 

X

 

X

B

Переход если OF==SF, оп_1 >= оп_2

 

 

 

 

 

 

 

 

 

JNLE / JG

A

X

 

0

 

X

B

Переход если Z==0 или OF==SF, оп_1 > оп_2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JB / JNAE

X

1

 

X

 

X

X

Переход если CF==1, оп_1 < оп_2

 

 

 

 

 

 

 

 

 

JBE / JNA

X

1

 

1

 

X

X

Переход если CF==1 or ZF==1, оп_1 <= оп_2

 

 

 

 

 

 

 

 

 

JNB / JAE

X

0

 

X

 

X

X

Переход если CF==0, оп_1 >= оп_2

 

 

 

 

 

 

 

 

 

JNBE / JA

X

0

 

0

 

X

X

Переход если CF==0 and ZF==0, оп_1 > оп_2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Команды передачи управления

Команда проверки регистра (E)CX:

JECXZ / JCXZ

Адрес

Выполняет проверку регистра (E)CX и выполняет переход, если его значение равно нулю. Используется для организации циклов с постусловием, для проверки необходимости выполнения первой итерации цикла.

Команды передачи управления

Команды циклов:

LOOP Адрес

LOOPE Адрес

LOOPNE Адрес

Адрес – 8-ми разрядное относительное смещение, задаваемое на языке Ассемблер в виде метки.

Все команды уменьшают значение регистра (E)CX на единицу.

Условие выполнения LOOP:

CX != 0

Условие выполнения LOOPE:

CX != 0 and ZF==1

Условие выполнения LOOPNE:

CX != 0 and ZF==0

 

 

Пример 1

Разработать программу выводящую на экран количество символов ‘A’ находящихся на экране. Количество вывести в левом верхнем углу экрана в десятичной системе счисления.

Пример 1

.486 model tiny

Code SEGMENT use16

ASSUME cs:Code, ds:Code, ss:Code

 

org

100h

 

 

start:

mov

ax, 0b800h

;Загрузка в AX адреса сегмента видеобуфера

 

 

 

 

mov

ds, ax

;Установка DS на видеобуфер

 

 

xor

ax, ax

;Очистка AX

 

 

mov

si, ax

;Запись начала видеобуфера в SI

 

 

mov

dx, ax

;Инициализация счетчика

 

 

mov

cx, 25*80

;Запись в CX количества повторений

loop0:

lodsw

 

;Загрузка в AX из DS:[SI]

 

 

cmp

al,'A‘

;Сравнение с ‘A’

 

 

jnz

next0

;Если не ‘A’, то переход на next0

 

 

inc

dx

;Инкремент DX

next0:

loop

loop0

;Цикл

 

 

 

 

 

Пример 1

 

push

ds

;Установка регистра ES на адрес видеобуфера

 

pop

es

;из регистра DS

 

xor

di, di

;Очиска DI

 

push

cs

;Установка сегмента данных DS

 

pop

ds

;на сегмент кода CS

 

lea

si, Strk

;В SI загружаем смещение Strk

 

add

si, 6

;Переход в конец строки

 

mov

cx, 10

;В регистр CX записываем 10

 

mov

ax, dx

;В AX заносим количество символов ‘A’ из DX

next1:

 

 

 

xor

dx, dx

;Очистка DX

 

div

cx

;Делим DX:AX на CX

 

add

dl, 48

;Прибавляем к остатку код 0

 

mov

ds:[si],dl

;Записываем в строку символ числа

 

or

ax, ax

;Проверка AX на ноль

 

jz

next2

;Если AX=0, то переход на next2

 

dec

si

;Декремент SI

 

jmp

next1

;Переход на следующую итерацию