Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебн пособ по арх и прогр МП.doc
Скачиваний:
64
Добавлен:
10.12.2013
Размер:
1.59 Mб
Скачать

10.2 Команда безусловного перехода jmp

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

Форматы команды: JMP <атрибут> етка>

Атрибут указывает диапазон перехода и может иметь значения NEAR (диапазон байт) илиFAR. Прямой переход типа FAR указывает на переход в другой сегмент. Выполнение команды безусловного перехода JMP (см. рис.20.).

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

Используются при реализации ветвлений в алгоритмах.

В основном большинстве используются после команд CMP (команда сравнения двух операндов),ADD,SUB. КомандаCMPпроизводит вычитание операнда-источника из операнда-приемника и, в зависимости от результата, изменяет флаги, но в отличие от команды SUB команда CMP не сохраняет результат вычитания.

Напоминаем формат команды CMP :

CMP <что сравниваем – источник>,<с чем сравниваем – источник>

Команды условного перехода всегда имеют атрибут NEAR. Т.к. метка является 8-битным смещением относительно текущего состояния указателя команд IP, поэтому команды могут выполнить переход только на 127 байт вперед или на 128 байт назад.

Формат команды : J<условие> <метка>

Команда осуществляет переход если выполнено условие,закодированое в мнемонике команды, иначе – переход на слеующую за командой перехода команду.

Применяемые условия можно разделить на 2 группы:

1)Флаги и их отрицания: S,NS,C,NC,Z,NZ,O,NO,P,NP. СимволN– сокращение от словаnot (отрицание).

2)Результаты сравнения двух операндов, выраженые через мнемокоды, приведеные в табл. 4. Причем для чисел без знака и со знаком используются различные мнемокоды.

Табл.4.

Результат сравнения: операнд1 и операнд2

Мнемокод для чисел

без знака

со знаком

Равны

E

E

Больше

A

G

Меньше

B

L

Не равны

NE

(AB)

NE

(LG)

Не больше

NA

(EB)

NG

(EL)

Не меньше

NB

(EA)

NL

(EG)

Выполнение команды условного перехода дано на рис.21. Здесь J** – одна из команд условного перехода, а ** - условие перехода.

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

10.4. Создание разветвленной программы.

Рассмотрим создание программы сравнения двух констант и если они равны, переменной RESULT присваивается 1, иначе - 0.

10.4.1. Составление текста программы.

В любом текстовом редакторе создадим текст программы.

1)Определим сегмент стека. Так как наша программа невелика, следовательно и стек в ней может быть небольшой.

_STACK SEGMENT PARA STACK 'STACK' ; определение сегмента

;стека

DB 32 DUP ('ST') ; стек размером 64 байта (32 повторения символов ST)

_STACK ENDS ; закроем описание сегмента стека _STACK

2) Определим сегмент данных. В сегменте данных должны содержаться все данные, используемые в программе.

_DATA SEGMENT PUBLIC 'DATA' ; сегмент данных

CONS_1 DB 10 ; первая константа с именем CONS_1 размером в байт и

;значением =10

CONS_2 DB 10 ; вторая константа

RESULT DB ? ; резервируем байт под результат

_DATA ENDS ; закроем описание сегмента данных _DATA

3) Определим сегмент кода. В нем содержатся команды программы.

_CODE SEGMENT PUBLIC 'CODE' ; Объявление сегмента кода

ASSUME SS:_STACK, CS:_CODE, DS:_DATA ; Ассоциируем

;сегменты и сегментные регистры

OUR_PROG PROC FAR ; описываем нашу программу как процедуру

;OUR_PROG помещаем в стек такие начальные значения, чтобы

; программа могла по завершению возвратить управление

; вызвавшей ее программе (например ОС)

PUSH DS ; поместить в регистр номер блока адреса возврата

MOV AX,0 ; обнулить регистр AX

PUSH AX ; поместить в стек нулевое смещение адреса возврата

; инициализируем адрес сегмента данных

MOV AX,_DATA ;

MOV DS,AX ; загрузка через AX указателя сегмента данных в DS

MOV RESULT,0 ; обнуляем переменную результата

MOV AL,CONS_1 ; пересылаем первую константу в младшие 8

; бит регистра AX

CMP AL,CONS_2 ; сравниваем со второй константой

JNE EQ ; если они не равны, то переход по метке EQ

MOV RESULT,1 ; иначе переменной результата присваиваем 1

EQ: RET ; команда возврата из процедуры, она

; извлекает данные, которые мы положили в

; стек в начале программы

OUR_PROG ENDP ; закрываем описание процедуры OUR_PROG

_CODE ENDS ; закрываем описание сегмента кода _CODE

END OUR_PROG ; закрываем описание программы