Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Orgevm_Ekzamen.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
998.59 Кб
Скачать

Билет №19 Формат машинных команд мп вм86.

Машинная команда микропроцессора 8086 имеет формат, приведенный на рис. 40.

Рис. 40

Префикс – это байт, идущий перед командой и несколько меняющий ее смысл. Для МП 8086 допустимы: префикс блокировки, префикс замены сегмента и префикс повторения. В большинстве команд префиксы отсутствуют, однако, в команде могут использоваться и все три префикса одновременно. Префикс блокировки (lock) имеет значение 11110000. Префикс замены сегмента имеет формат 011sr110. Здесь поле sr задает сегментный регистр, который используется в команде (табл.6). Префикс повторения (rep) имеет значение 11110011 (или в еще одном варианте 11110010).

Таблица 6.

11110010).

Поле КОП – единственное из полей, которое всегда присутствует в команде. Занимает это поле, в зависимости от команды, один или два байта. Младший бит этого поля (w) в большинстве случаев задает разрядность операции. При w=0 команда работает с байтом, при w=1 – со словом.

Постбайт либо в команде отсутствует, либо занимает один байт. Это поле задает регистры, которые принимают участие в формировании адресов операндов. Формат постбайта приведен на рис.41.

Рис. 41

Поле reg (регистр) задает регистр в двухоперандных командах (табл. 7). Аналогично трактуется поле rm (регистр/память) при md=11 (mode – «режим»). При других значениях md, поле rm задает способ формирования адреса памяти (табл. 8).

Поле disp (dispersion – «смещение») задает смещение при базовой адресации (или адрес при прямой адресации) и может занимать 0, 1 или 2 байта.

Поле data («операнд») присутствует, если в команде используется непосредственная адресация.

Таблица 7.

Таблица 8.

Например, команда lock add cs: [bp+ di+100h], 77h имеет шестнадцатеричное представление: F0 2E 80 83 0010 77 ( F0 – младший байт в ОП). Здесь F0 – префикс блокировки (lock), 2E –префикс замены сегмента (cs: ), 80 – код команды (операции) (add), 83 – постбайт (задает способ формирования адреса: bp+di+disp), 0010 – смещение (100h) и 77 – непосредственный операнд.

Механизм переключения задач. Формат сегмента tss

Как уже говорилось ранее размер сегмента TSS должен быть не менее 104-х байт. При обращении к дескриптору TSS МП проверяет записанный в этом дескрипторе размер и если он оказывается меньше 104-х байт генерируется прерывание. Однако сегмент TSS может иметь больший размер. В этой дополнительной области сегмента TSS может, например, располагаться битовая карта ввода-вывода - input-output map (смотри ниже). Кроме того эту дополнительную область может использовать в своих целях системный программист. Например, в этой области системный программист может сохранять содержимое регистров арифметического сопроцессора. Переключая задачи МП, для экономии времени, не сохраняет контекст сопроцессора. Отсюда если задача А переключилась на задачу В и обе они работают с сопроцессором, очевидно что задача В (если не принять мер) испортит контекст задачи А. Поэтому переключаясь на новую задачу МП автоматически устанавливает бит TS (задача переключена) в регистре CR0. При выполнении любой команды сопроцессора МП проверяет бит TS и если он установлен будет прерывание. Обработчик этого прерывания должен сохранить контекст сопроцессора, сбросить бит TS и обеспечить рестарт команды.

Далее рассмотрим формат сегмента TSS (смотри рис. 60):

Дадим необходимые пояснения к рисунку. Формат рисунка - 4 байта по горизонтали. Слева от полей приведено смещение (0h, 4h и.т.д) относительно начала сегмента TSS. Назначение таких полей как EIP - EDI и ES -GS по нашему мнению очевидно и мы их рассматривать не будем. Остальные поля либо неочевидны, либо имеют свою специфику.

Поле «обратной связи» (previous task link). Пусть задача А вызвала задачу В в качестве подпрограммы (командой call far). Естественно предполагать что когда-нибудь нам потребуется возврат в задачу А. Для того чтобы куда-нибудь вернуться нам потребуется адрес возврата. Адресом возврата здесь будет селектор дескриптора сегмента TSS задачи А. Однако задачи А и В ничем между собой не связаны и в общем случае задаче В этот селектор неизвестен. Поэтому когда задача А вызывает задачу В командой call far МП автоматически загружает в поле обратной связи задачи В (входящей задачи) селектор дескриптора TSS задачи А. Этот селектор МП берет из видимой части регистра tr. Тем самым обеспечивается возможность возврата в задачу А. Если переключение задач идет по команде jmp far, поле обратной связи входящей задачи заполняется нулями, так как возврат куда-либо не предполагается.

31 16

15 0

0h

поле обратной связи

4h

esp0

8h

ss0

0ch

esp1

10h

ss1

14h

esp2

18h

ss2

1ch

cr3

20h

eip

24h

ef

28h

eax

2ch

ecx

30h

edx

34h

ebx

38h

esp

3ch

ebp

40h

esi

44h

edi

48h

es

4ch

cs

50h

ss

54h

ds

58h

fs

5ch

gs

60h

ldtr

64h

база битовой карты ввода-вывода

T

Рис. 60

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

LDTR. Из поля LDTR TSS входящей задачи загружается видимая часть регистра ldtr. Таким образом происходит переключение на новую таблицу LDT. Старое содержимое видимой части регистра ldtr в поле LDTR TSS выходящей задачи не сохраняется (для экономии времени), поскольку подразумевается что задача всегда работает с одной и той же LDT.

Бит Т (trap – «ловушка»). Если в TSS задачи В этот бит установлен в единицу, то при переключении на задачу В будет прерывание типа 1. Этот бит используется для отладки.

SSi - ESPi. Каждая пара такого вида задает вершину стека для одного из уровней привилегий. Всего в TSS задаются три таких пары для уровней привилегий 2, 1 и 0. А для 3-го уровня привилегий вершина стека в TSS не задается ! Содержимое этих полей при переключении задач не меняется. Вообще эти поля используются не в процессе переключения задач, а в процессе выполнения задач. Как уже говорилось ранее, существует правило, согласно которому, уровень привилегий текущего сегмента стека (DPL стека) должен быть всегда равен CPL. Пусть мы работаем на уровне привилегий i (CPL = i ). И пусть затем через шлюз вызова мы вызвали подпрограмму с более высоким уровнем привилегий (теперь CPL< i ). В соответствии с рассмотренным правилом мы обязаны сменить стек (на более привилегированный). Как раз в этом случае МП и возьмет вершину стека соответствующего уровня из TSS текущей задачи. При этом он автоматически сохранит вершину старого стека в новом стеке, чтобы ее можно было восстановить при возврате из подпрограммы. Поскольку мы никаким способом не можем перейти к менее привилегированной программе то на 3-й уровень мы можем попасть только с 3-го уровня. Именно поэтому в TSS отсутствуют поля SS3:ESP3.

Поле битовой карты ввода-вывода задает смещение этой карты (если она есть) относительно начала TSS.

Процессор может работать с сегментами TSS микропроцессора i 286. Формат такого сегмента отличается от рассмотренного выше хотя бы потому что регистры МП 286 16-ти разрядные. TSS МП 286 содержит следующую последовательность полей ( полей, заполненных нулями в нем нет и по объему он меньше TSS, рассмотренного выше): поле обратной связи, sp0, ss0, sp1, ss1, sp2, ss2, ip, f, ax, ..., ds, ldtr.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]