Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Безусловные переходы




 

В ассемблере все команды безусловного перехода обозначаются одинаково:

JMP <операнд>

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

1) Внутрисегментный относительный короткий переход.

JMP i8 (IP:=IP+i8)

Здесь i8 обозначает непосредственный операнд размеров в байт, который интерпретируется как знаковое целое от -128 до 127. Команда прибавляет это число к текущему значению регистра IP, получая в нем адрес (смеще­ние) той команды, которая должна быть выполнена следующей. Регистр CS при этом не меняется.

Необходимо учитывать следующую особенность регистра IP. Выполнение любой команды начинается с того, что в IP заносится адрес следующей за ней команды, и только затем выполняется собственно команда. Для команды относительного перехода это означает, что операнд i8 прибавляется не к адресу этой команды, а к адресу команды, следующей за ней, поэто­му, к примеру, команда JMP 0 - это переход на следующую команду программы.

При написании машинной программы сдвиги для относительных переходов приходится вычислять вручную, однако ассемблер избавляет от этого неприятного занятия: в ассемблере в командах относительного перехода всегда указывается метка той команды, на которую надо передать управление, и ассемблер сам вычисляет сдвиг, который и записывает в машинную команду. Отсюда следует, что в ассемблере команда перехода по метке воспринимается не как абсолютный переход, а как относительный.

По короткому переходу можно передать управление только на ближайшие команды программы - отстоящие от команды, следующей за командой перехода, до 128 байтов назад или до 127 байтов вперед. Для перехода на более дальние команды используется

2) Внутрисегментный относительный длинный переход.

JMP i16 (IP:=IP+i16)

Здесь i16 обозначает непосредственный операнд размером в слово, кото­рый рассматривается как знаковое целое от -32768 до 32767. Этот пере­ход аналогичен короткому переходу.

Встретив команду перехода с меткой, которой была помечена одна из предыдущих (по тексту) команд программы, ассемблер вычисляет разность между адресом этой метки и адресом команды перехода и по этому сдвигу определяет, какую машинную команду относительного перехода - короткую или длинную - надо сформировать. Но если метка еще не встречалась в тексте программы, т.е. делается переход вперед, тогда ассемблер, не зная еще адреса метки, не может определить, какую именно машинную команду относительного перехода формировать, поэтому он на всякий случай выбирает команду длинного перехода. Однако эта машинная команда занимает 3 байта, тогда как команда короткого перехода - 2 байта, и если автор программы на ассемблере стремится к экономии памяти и знает заранее, что переход вперед будет на близкую метку, то он должен сообщить об этом ассемблеру, чтобы тот сформировал команду короткого перехода. Такое указание делается с помощью оператора SHORT:

JMP SHORT L

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

3) Внутрисегментный абсолютный косвенный переход.

JMP r16 (IP:=[r])

или JMP m16 (IP:=[m16])

Здесь r16 обозначает любой 16-битовый регистр общего назначения, а m16 - адрес слова памяти. В этом регистре (слове памяти) должен находиться адрес, по которому и будет произведен переход. Например, по команде JMP BX осуществляется переход по адресу, находящемуся в регистре BX.

4) Межсегментный абсолютный прямой переход.

JMP seg:ofs (CS:=seg, IP:=ofs)

Здесь seg - начало (первые 16 битов начального адреса) некоторого сегмента памяти, а ofs - смещение в этом сегменте. Пара seg:ofs определяет абсолютный адрес, по которому делается переход. В ассемблере эта пара всегда задается конструкцией FAR PTR <метка>, которая "говорит", что надо сделать переход по указанной метке, причем эта метка - "дальняя", из другого сегмента. Ассемблер сам определяет, какой это сегмент, и сам подставляет в машинную команду его начало, т.е. seg.

Команды межсегментного перехода используются тогда, когда команды программы размещены не в одном сегменте памяти, а в нескольких (например, команд столь много, что в совокупности они занимают более 64Кб, т.е. более максимального размера сегмента памяти). При переходе из одного такого сегмента в другой необходимо менять не только счетчик команд IP, но и содержимое регистра CS, загружая в последний начальный адрес второго сегмента. Такое одновременное изменение обоих этих регистров и делают команды межсегментного перехода.

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

JMP A

- как переход по метке A или как переход по адресу, хранящемуся в ячейке с именем A? Кроме того, какой это переход - внутрисегментный или межсегментный? Ответ зависит от того, как описано имя A, и от то­го, когда описано имя A - до или после команды перехода.

Пусть A описано до команды перехода ("ссылка назад"). Если именем A помечена некоторая команда текущего сегмента команда (т.е. A - мет­ка), тогда ассемблер формирует машинную команду внутрисегментного от­носительного перехода. Если же A - имя переменной, тогда ассемблер формирует машинную команду косвенного перехода - внутрисегментного, если A описано в директиве DW, или межсегментного, если A описано в директиве DD.

В случае же, если имя A описано после команды перехода ("ссылка вперед"), ассемблер всегда формирует машинную команду внутрисегментно­го относительного длинного перехода. С учетом этого имя A обязательно должно метить команду из текущего сегмента команд, иначе будет зафиксирована ошибка. Если такая трактовка ссылки вперед не удовлетворяет автора программы, тогда он обязан с помощью оператора SHORT или PTR уточнить тип имени A:

JMP SHORT A; внутрисегментный короткий переход по метке

JMP WORD PTR A; внутрисегментный косвенный переход

JMP DWORD PTE A; межсегментный косвенный переход

Отметим, что переход по метке A из другого сегмента команд всегда должен указываться с помощью FAR PTR (независимо от того, описана мет­ка A до или после команды перехода):

JMP FAR PTR A; межсегментный переход по метке

 




Поделиться с друзьями:


Дата добавления: 2014-11-09; Просмотров: 816; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.