Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

2) Смещение:

Смещение (disp) вычисляем относительно текущего значения адреса (содержимого IP после выборки команды), учитывая что команда JNBE (JA) — двухбайтовая. Текущее значение адреса: IP= 0100 + 2 = 0102. Ищем разность между конечным и текущим адресом: (0092 — 0102) = -0070. Берем только младший байт -70 и преобразуем это отрицательное число из прямого кода в дополнительный (D7 —знак):

Прямой

Обратный

Дополнительный

S

S

 

S

(S —знаковый бит)

1.11100002

1.00011112

1.00100002 = 9016.

 

Окончательно:

 

 

 

 

 

 

 

 

 

 

 

 

 

Address

Command

 

Assembler

 

 

0100

 

77

 

JNBE 0092

 

 

 

0101

 

90

 

 

 

Пример 3 –

тоже самое, что и в примере 1, только перейти на

адрес 182.

 

 

 

 

 

 

Ответ:

 

 

182 —102 =

8016 = 12810 > 12710 -

Вычислим

смещение:

неосуществимо! Перебор на 1 адрес, так как максимальное смещение в этом случае может быть только 12710 = 7F16.

7.2 Команды перехода

Кроме команд типа JUMP с условным переходом (ветвления) есть и команды с безусловным переходом, которые позволяют «прыгать» не только в пределах ±7F, но и даже между сегментами. Рассмотрим их.

JMP — команда с безусловным переходом (пять типов)

1) Короткая, с относительной адресацией (смещением), 2-х байтовая; максимальная величина disp = ±7F.

а) ассемблер: JMP SHORT Addr;

б) КОП = ЕВ.

Пример 4 — Команда расположена на 0100 адресе. Прыгнуть на адрес 0105.

Определяем текущее значение IP: IP = 0100 + 2 = 0102.

Смещение: 0105 —0102 = 0003 = 03 (1 байт).

50

Address

Command

Assembler

0100

EB

JMP SHORT 0105

0101

03

 

2) Внутрисегментная, с относительной адресацией (смещением), 3-х байтовая (2-х байтовое смещение, D15 —знак);

а) ассемблер: JMP NEAR Addr;

б) КОП = Е9.

Пример 5 — Пусть исходные данные те же самые, что в примере 4, только применить внутрисегментную JMP с относительной адресацией.

Ответ:

Address

Command

Assembler

0100

E9

JMP NEAR 0105

0101

03

 

0102

00

 

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

3) Внутрисегментная, с косвенной адресацией, 2-байтовая (КОП — 2 байта).

а) ассемблер: JMP NEAR dst (или просто: JMP dst). Комментарий: перейти по адресу, который хранится в dst;

б) КОП:

Пример 6 — Пусть в ячейке памяти с адресом 1CFO хранится число 5D, а в ячейке 1CF1 — 02. Представить команду перехода с косвенной адресацией (внутри сегмента), находящуюся по адресу 0100 и

имеющую в качестве dst 2-х байтовый источник M1CF1,1CF0:

Ответ:

а) ассемблер: JMP NEAR [1CFO] (или просто: JMP [1CF0]);

б) КОП:

51

Полностью:

Address

Command

Assembler

0100

FF

JMP [1CFO]

0101

26

 

0102

FO

 

0103

1C

 

(IP)

 

 

После выполнения команды: IP:= <M1CF1,M1CF0> = 025D. С этого адреса будет выбираться КОП следующей команды.

4) Межсегментная, с прямой адресацией, 5-и байтовая команда

(КОП —1 байт):

 

 

 

 

 

 

 

а) ассемблер: JMP CS:IP;

 

 

 

 

б) КОП= ЕА.

 

 

 

 

 

 

Пример

7 —

Пусть

команда

расположена

 

по

адресу

175E:0100 =0176E0 (смотрите

2-ю

главу —

формирование

физического адреса). Перейти по адресу: CS = F000, IP = E987.

Ответ:

 

 

 

 

 

 

 

 

Полное представление:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Address

Comman

Assembler

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

175E

: 0100

EA

JMP F000:E987

 

 

 

 

175E

: 0101

87

 

 

 

 

 

 

175E

: 0102

E9

 

 

 

 

 

 

175E

: 0103

00

 

 

 

 

 

 

175E

: 0104

F0

 

 

 

 

 

 

(CS) (IP)

 

 

 

 

 

 

После

выполнения

команды

изменится не

 

только IP

(IP:=Е987),но и значение командного сегмента (CS:=F000), и

следующий КОП будет выбираться с

адреса F000:E987 =

FE987.

«Скачок» = FE987 — EO =

E72A7, то есть намного больше размера

сегмента (размер сегмента 1000016

= 6553610).

 

 

 

5) Межсегментная, с косвенной адресацией.

 

 

 

52

 

 

 

 

 

 

 

 

 

а) ассемблер: JMP FAR dst;

Примечание – Хранилищем адреса перехода может быть только ЗУ, так как длина этого слова 4 байта, а с таким размером регистров в составе МП нет. Поэтому в графе КОП всегда mod 11.

Пример 8 — Пусть в указанных ячейках памяти ЗУ хранятся

следующие байты: М2000 = 87, М2001 = Е9, М2002 = 00, М2003 = FO.

Выполним следующие команды:

MOV BX, 2000; BX:=2000 — адрес младшей ячейки адреса перехода; JMP FAR [BX]; перейти по этому адресу.

После этого произойдет переход на следующий адрес:

CS = F000, IP = E987.

КОП этой команды JMP:

Примечание – Необходимо иметь ввиду, что источником адреса являются ячейки памяти в текущем сегменте DS. Если же эти ячейки расположены в другом сегменте, то сначала надо загрузить новое значение сегмента в DS (смотрите 3-ю главу). Например:

MOV AX, значение сегмента

MOV DS,AX

или

MOV AX, значение сегмента

PUSH AX

POP DS

53