Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПР№6_ПЗТ23.doc
Скачиваний:
12
Добавлен:
17.09.2019
Размер:
150.02 Кб
Скачать

Практическая работа №6

ТЕМА: "Система команд CPU i8086. Команды передачи управления. Безусловный переход. Ближняя (near) и дальняя (far) адресации".

ЦЕЛЬ:

  • закрепить особенности выполнения команд безусловного перехода;

  • сформировать умения по использованию ближней (near) и дальней (far) адресации памяти;

  • научиться классифицировать команды безусловных переходов и определять механизм работы процессора по каждому виду безусловных переходов;

  • сформировать умения по вычислению смещения при выполнении прямых относительных безусловных переходов.

  • научиться пользоваться командами ближних и дальних безусловных переходов при составлении программ разветвляющейся структуры на языке ассемблера;

  • сформировать умения по кодированию и декодированию машинного представления команд безусловного перехода.

Ход работы.

  1. Познакомиться с необходимой теоретической информацией.

  2. Ответить на контрольные вопросы.

  3. Выполнить предложенные задания.

  4. Оформить отчет.

  5. Защитить работу.

Основные сведения из теории

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

Эти команды можно разбить на две группы.

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

  • команда безусловного перехода JMP — это аналог GOTO в языках высокого уровня

  • команды условной передачи управления. Их много, например, JG — переход, если больше, JE — переход, если равно, и др.

  • команды цикла.

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

  • CALL — вызов процедуры, RET (и другие) — выход из процедуры.

  • INT — вызов прерывания, IRET — выход из прерывания.

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

Адреса переходов бывают трех типов:

  • дальний (FAR) — это переход в другой сегмент кода. Такой адрес задается с помощью двойного слова. При дальнем переходе меняются регистры CS и IP.

  • ближний (NEAR) — это переход в пределах текущего сегмента. Адрес задается с помощью слова. При ближнем переходе меняется регистр IP.

  • короткий (SHORT) — это переход в пределах текущего сегмента в диапазоне –127 — +128 (байтов). Адрес задается с помощью байта.

Команды безусловной передачи управления jmp

Команда JMP заставляет процессор продолжать выполнение с нового места программы. Новое место может быть отмечено меткой, которую процессор преобразовывает в адрес. Если переход происходит в текущий сегмент, то смещение метки загружается непосредственно в регистр IP. Если метка находится в другом сегменте, адрес сегмента дополнительно загружается в регистр CS. Для преобразования меток или 32-разрядного адреса "сегмент-смещение" пункта назначения существуют три формата команды JMP:

  • JMP SHORT метка

  • JMP NEAR PTR метка

  • JMP FAR PTR метка

В MASM все команды безусловного перехода обозначаются одинаково: JMP op, но в зависимости от типа операнда op ассемблер формирует разные машинные команды. Команда передает управление в указанную точку того же или другого программного сегмента. Не воздействует на флаги CPU. Адрес точки вызова теряется и вернуться к ней нельзя!

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

Например:

jmp L1 ; near : метка в текущем сегменте

jmp near ptr L1 ; near : метка в текущем сегменте

jmp short nextval ; short : от -128 до +127 байт

lmp far ptr L2 ; far : переход в другой сегмент

Операторы, помещенные перед пунктом назначения (меткой) могут быть следующими:

SHORT – переход на метку в диапазоне от -128 до +127 байт от адреса следующей команды. *-разрядное целлон число, называемое смещением, добавляется в указатель команд IP;

NEAR PTR – переход на метку где-нибудь в текущем сегменте. 16-разрядный сдвиг добавляется в IP;

FAR PTR – переход на метку в другом сегменте. Сегментная часть адреса метки загружается в CS, а смещение в IP.

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

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

По способу изменения регистра IP переходы делятся на абсолютные и относительные.

Е сли в команде перехода указан адрес (смещение) той команды, которой надо передать управление, то это абсолютный переход.

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

По величине сдвига

относительные переходы делятся на:

  • короткие - сдвиг задается байтом;

  • ближние (near) - сдвиг задается машинным словом.

абсолютные переходы делятся на:

  • прямые – адрес перехода задается в самой команде;

  • косвенные – в команде указывается регистр или ячейка памяти, в котором(ой) находится адрес перехода.

Дадим детальную характеристику команд безусловного перехода JMP op в зависимости от типа операнда op

1) Прямой короткий (short) переход (внутрисегментный):

JMP <offset8> ; IP = IP + <offset8>

Код команды EB.

Прямым называется переход, в команде которого в явной форме указывается метка, на которую нужно перейти. Эта метка должна присутствовать в том же программном сегменте, при этом помеченная ею команда может находиться как до, так и после команды JMP. Команда короткого перехода занимает лишь 2 байта памяти: в первом байте записывается код операции EBh, во втором – смещение к точке перехода. <offset8> и обозначает смещение размером в байт, которое интерпретируется как знаковое целое от –128 до +127. Команда прибавляет это число к текущему значению регистра IP, получая в нем адрес (смещение от начала сегмента команд) той команды, которая должна быть выполнена следующей. Значение регистра СS при этом не меняется. Помните!!!, что величина <offset> прибавляется к содержимому регистра IP, хранящего уже адрес команды следующей за JMP. Поэтому, например, команда JMP 0 – это переход на следующую команду программы.

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

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