ЭКЗАМЕНАЦИОННЫЙ БИЛЕТ № 10

Объясните принципы сегментации памяти в защищенном режиме. Приведите схему вычисления линейного адреса. Дайте определение виртуального адресного пространства и объясните, каким образом высчитывается его размер.

В КОНСПЕКТЕ!!!!

Объясните назначение системы команд процессора. Дайте характеристику команд безусловных переходов CPU i8086 при использовании ближней (near) адресации. Приведите примеры использования этих команд.

Система команд

Система команд процессора i8086 состоит из 98 команд (и более 3800 их вариаций): 19 команд передачи данных, 38 команд их обработки, 24 команды перехода и 17 команд управления процессором. Возможно 7 режимов адресации. Микропроцессор не содержал команды для работы с числами с плавающей запятой. Данная возможность реализовывалась отдельной микросхемой, называемой математический сопроцессор, который устанавливался на материнской плате. Сопроцессор, вовсе не обязательно должен был быть произвёден Intel (модель i8087), к примеру, некоторые производители микросхем, такие, как Weitek, выпускали более производительные сопроцессоры, чем Intel.

Система команд процессора i8086 включает в себя несколько очень мощных строчных инструкций. Если инструкция имеет префикс REP (повтор), то процессор будет выполнять операции с блоками - перемещение блока данных, сравнение блоков данных, присвоение определённого значения блоку данных определенной величины, и т.д., то есть одна инструкция 8086 с префиксом REP может выполнять 4-5 инструкций выполняемых на некоторых других процессорах. Но следует упомянуть, что подобные приёмы были реализованы и в других процессорах, Zilog Z80 имел инструкции перемещения и поиска блоков, а Motorola 68000 может выполнять операции с блоками, используя всего две команды.

В микропроцессоре i8086 была использована примитивная форма конвейерной обработки. Блок интерфейса с шиной подавал поток команд к исполнительному устройству через 6-байтовую очередь команд. Таким образом, выборка и выполнение новых команд могли происходить одновременно. Это значительно увеличивало пропускную способность процессора и лишало необходимости считывать команды из медленной памяти.

КОМАНДЫ БЕЗУСЛОВНЫХ ПЕРЕХОДОВ

Команды безусловного перехода имеют общую мнемонику JMP. Команда короткого безусловного перехода содержит во втором байте смещение, которое интерпретируется как знаковое целое. Диапазон значений байта смещения составляет -128 - +127. Если смещение положительное, осуществляется переход вперед, а если отрицатель­ное - переход назад.

Команда ближнего безусловного перехода может либо непосред­ственно содержать 16-битное смещение, либо косвенный адрес 16-битного смещения. Диапазон смещения составляет -32768 - +32767 байт относительно адреса команды, находящейся после команды JMP.

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

JMP dispL - короткий переход

JMP disp - ближний прямой переход

JMP mem/reg - ближний косвенный переход

JMP addr - дальний прямой переход

JMP mem - дальний косвенный переход

Команда JMP #########################################################

### Осуществляет безусловный переход, модифицируя указатель команд IP (при

переходе типа NEAR) или пару регистров CS:IP (при переходе типа FAR).

Старое значение регистров IP и CS теряется.

### Регистр флажков не модифицируется.

### Форматы команды:

7 0

+-------------------------+ l = 2 байта +----------------+

¦ JMP SHORT Метка ¦ t = 15 тактов ¦ 11101011 ¦

+-------------------------+ ¦----------------¦

Относительный переход типа NEAR. ¦ dispL ¦

Диапазон перехода -128 … +127 байт. +----------------+

Если осуществляется переход назад,

оператор SHORT можно опустить.

7 0

+-------------------------+ l = 3 байта +----------------+

¦ JMP Метка типа NEAR ¦ t = 15 тактов ¦ 11101001 ¦

+-------------------------+ ¦----------------¦

Относительный переход типа NEAR. ¦ dispL ¦

Диапазон перехода -32768 … +32767 ¦----------------¦

байт. ¦ dispH ¦

+----------------+

7 0

+-------------------------+ l = 2-4 байта +----------------+

¦ JMP Память ¦ t = 18+ЕА тактов ¦ 11111111 ¦

+-------------------------+ ¦----------------¦

+-------------------------+ l = 2 байта ¦ mod 100 r/m ¦

¦ JMP Регистр ¦ t = 11 тактов ¦----------------¦

+-------------------------+ ¦ dispL ¦

Косвенный переход типа NEAR. Адрес +----------------¦

перехода загружается из 16-битового ¦ dispH ¦

общего регистра или слова памяти. +----------------+

7 0

+-------------------------+ l = 5 байтов +----------------+

¦ JMP Метка типа FAR ¦ t = 15 тактов ¦ 11101010 ¦

+-------------------------+ ¦----------------¦

Прямой переход типа FAR: ¦ offL ¦

значение off загружается в IP, ¦----------------¦

значение seg загружается в CS. ¦ offH ¦

¦----------------¦

¦ segL ¦

¦----------------¦

¦ segH ¦

+----------------+

7 0

+-------------------------+ l = 2-4 байта +----------------+

¦ JMP Память ¦ t = 24+ЕА тактов ¦ 11111111 ¦

+-------------------------+ ¦----------------¦

Косвенный переход типа FAR: ¦ mod 101 r/m ¦

слово памяти загружается в IP, ¦----------------¦

следующее слово памяти - в CS. ¦ dispL ¦

+----------------¦

¦ dispH ¦

+----------------+

### Команда CALL#########################################################

### Передает управление подпрограмме с автоматическим сохранением

адреса возврата в стеке.

### Регистр флажков не модифицируется.

### Форматы команды:

7 0

+-------------------------+ l = 3 байта +----------------+

¦ CALL Метка типа NEAR ¦ t = 19 тактов ¦ 11101000 ¦

+-------------------------+ ¦----------------¦

Относительный переход типа NEAR: ¦ dispL ¦

производится декремент SP на 2, ¦----------------¦

включается в стек содержимое IP, ¦ dispH ¦

прибавляется к содержимому IP +----------------+

значение индексного смещения.

7 0

+-------------------------+ l = 2-4 байта +----------------+

¦ CALL Память ¦ t = (21+EA) тактов ¦ 11111111 ¦

+-------------------------+ ¦----------------¦

+-------------------------+ l = 2 байта ¦ mod 010 r/m ¦

¦ CALL Регистр ¦ t = 16 тактов ¦----------------¦

+-------------------------+ ¦ dispL ¦

Косвенный переход типа NEAR: +----------------¦

* производится декремент SP на 2, ¦ dispH ¦

* включается в стек содержимое IP, +----------------+

* слово, адресуемое операндом

загружается в регистр IP.

7 0

+-------------------------+ l = 5 байтов +----------------+

¦ CALL Метка типа FAR ¦ t = 28 тактов ¦ 10011010 ¦

+-------------------------+ ¦----------------¦

Прямой переход типа FAR: ¦ offL ¦

* уменьшается содержимое SP на 2, ¦----------------¦

* заносится в стек содержимое CS, ¦ offH ¦

* уменьшается содержимое SP на 2, ¦----------------¦

* заносится в стек содержимое IP, ¦ segL ¦

* в IP заносится off, в CS - seg. ¦----------------¦

¦ segH ¦

+----------------+

7 0

+-------------------------+ l = 2-4 байта +----------------+

¦ CALL Память ¦ t = (37+EA) тактов ¦ 11111111 ¦

+-------------------------+ ¦----------------¦

Косвенный переход типа FAR: ¦ mod 011 r/m ¦

уменьшается содержимое SP на 2, ¦----------------¦

заносится в стек содержимое CS, ¦ dispL ¦

уменьшается содержимое SP на 2, +----------------¦

заносится в стек содержимое IP, ¦ dispH ¦

слово, адресуемое операндом, +----------------+

загружается в IP, а следующее

слово - в регистр CS.

### Команда RET############################################################

### Возвращает управление вызывающей программе. Команда возврата - это

косвенный переход, т.к. адрес перехода извлекается из вершины стека.

Команда возврата с операндом-константой дополнительно прибавляет,

содержащееся в ней данное, к указателю стека SP, что упрощает возврат из

подпрограмм, параметры которых передаются в стеке.

### Регистр флажков не модифицируется.

### Форматы команды:

7 0

+-------------------------+ l = 1 байт +----------------+

¦ RET ¦ t = 8 тактов ¦ 0011010 w ¦

+-------------------------+ +----------------+

Возврат типа NEAR:

слово из стека помещается в IP,

содержимое SP увеличивается на 2

7 0

+-------------------------+ l = 1 байт +----------------+

¦ RET ¦ t = 18 тактов ¦ 0011010 w ¦

+-------------------------+ +----------------+

Возврат типа FAR:

слово из стека помещается в IP,

содержимое SP увеличивается на 2

слово из стека помещается в CS,

содержимое SP увеличивается на 2

7 0

+-------------------------+ l = 3 байта +----------------+

¦ RET Константа ¦ t = 12 тактов ¦ 0011010 w ¦

+-------------------------+ ¦----------------¦

Возврат типа NEAR: ¦ dataL ¦

слово из стека помещается в IP, ¦----------------¦

содержимое SP увеличивается на 2 ¦ dataH ¦

к содержимому SP добавляется +----------------+

значение константы.

7 0

+-------------------------+ l = 3 байта +----------------+

¦ RET Константа ¦ t = 17 тактов ¦ 0011010 w ¦

+-------------------------+ ¦----------------¦

Возврат типа FAR: ¦ dataL ¦

слово из стека помещается в IP, ¦----------------¦

содержимое SP увеличивается на 2 ¦ dataH ¦

слово из стека помещается в CS, +----------------+

содержимое SP увеличивается на 2

к содержимому SP добавляется

значение константы.

Вызывает процедуру типа near или far. Ассемблер генерирует CALL типа near, если вызываемая процедура объявлена как NEAR, и CALL типа FAR, если вызываемая процедура - типа FAR. Инструкция CALL типа near помещает в стек значение регистра IP (смещение следующей инструкции); после этого она помещает в IP смещение первой инструкции вызываемой процедуры. CALL типа FAR помещает в стек значение регистра CS и помещает в CS адрес сегмента, в котором расположена вызываемая процедура; после этого в стек помещается значение IP, и в IP -смещение первой инструкции этой процедуры в её сегменте. Для возврата из процедуры типа near используется инструкция RETN, а типа far - RETF

Флаги: Не влияет
Символьный код: [метка:] CALL регистр/память
Машинный код: Прямой в пределах сегмента: |11101000|disp-low|disp-high| Косвенный в пределах сегмента: |11111111|mod 010 r/m| Косвенный в другой сегмент: |11111111|mod 011 r/m| Прямой в другой сегмент: |10011010|offset-low|offset-high|seg-low|seg-high|

Пустой и составной оператор. Условный оператор if. Оператор множественного выбора case. Дать понятие о пустом, составном операторе. Описать понятие об условном операторе и операторе выбора, их структуре, обозначениях на блок-схеме. Привести примеры решения задач с использованием условного оператора и оператора множественного выбора.

Инструкция или оператор (англ. statement) — наименьшая автономная часть языка программирования; команда. Программа обычно представляет собой последовательность инструкций.

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

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

Пример составного оператора на Pascal(начало и конец составного оператора определяется ключевыми словами begin и end:

if условие then

begin { начало составного оператора }

... { несколько операторов }

end { конец составного оператора }

Пример составного оператора на C++ (JAVA) (составной оператор определяется фигурными скобками {} )

if (условие)

{ // начало составного оператора

... // несколько операторов

} // конец составного оператора

else

{ // начало составного оператора

... // несколько операторов

} // конец составного оператора

Оператор IF

Синтаксис: if (выражение)

оператор 1

[else

оператор2]

Выполнение Тело оператора if выполняется выборочно, в зависимости от значения выражения, по следующей схеме:

1. Вычисляется значение выражения.

• Если значение выражения "истина" (не ноль), то выполняется оператор1.

• Если значение выражения "ложь", то выполняется оператор2.

• Если значение выражения "ложь" и не задана статья else, то оператор1 игнорируется.

2. Управление передается от оператора if на следующий оператор программы.

Пример 1 В данном примере если i больше нуля, то выполняется оператор y=x/i. Если i меньше или равно нулю, то значение i присваивается x и y присваивается значение f(x). Обратите внимание на то, что формирующий предложение if оператор заканчивается точкой с запятой.

if (i>0)

y=x/i;

else {

x=i;

y=f(x);}

Пример 2 В данном примере сковки окружают внутренний оператор if. В результате этого статья else становится частью внешнего оператора if. Если i меньше или равно 0, то значение i присваивается x.

if (i>0){

if (j>i)

x=j;}

else

x=i;

Блок схема:

Пример:

#include <iostream>

using namespace std;

int main() {

double num;

cout << "Введите произвольное число: ";

cin >> num;

if (num < 10) { // Если введенное число меньше 10.

cout << "Это число меньше 10." << endl;

} else { // иначе

cout << "Это число больше либо равно 10." << endl;

}

return 0;

}

Оператор switch(CASE)

Синтаксис: switch (выражение) {

[объявление]

.

.

.

[case постоянное-выражение:]

.

.

.

[оператор]

.

.

.

[default:

[оператор]]

}

Выполнение Оператор switch передает управление на оператор в своем теле. Управление будет передано тому оператору, значение case постоянное-выражение которого совпадает с выражением switch. Оператор switch может содержать любое число элементов case. Выполнение тела оператора начинается в выбранном операторе и заканчивается в конце тела или в тот момент, когда оператор передаст управление вне тела. Оператор default выполняется в том случае, если ни одно постоянное-выражение case которого не совпадет с выражением switch. Если оператор default не задан и ни одно совпадение с case не обнаружено, то ни один из операторов тела switch не будет выполнен. Располагать оператор default в конце не обязательно, он может появиться в произвольном месте тела оператора switch. Выражение switch должно иметь интегральный тип, но результирующее значение будет преобразовано в int. Затем каждое постоянное-выражение case будет преобразовано с использованием обычных арифметических преобразований. Значения всех постоянных-выражений case должны быть разными в теле оператора. если тип выражения switch больше int, то появится диагностическое сообщение. Метки case и default тела оператора switch действуют только при первоначальной проверке, определяющей начало выполнения тела цикла. Все операторы от начала выполнения и до конца тела выполняются независимо от их меток, кроме случая, когда управление передается в часть программы вне тела оператора. Примечание В начале составного оператора, формирующего тело switch, могут появиться объявления, но сделанные в объявлениях инициализации не выполняются. Оператор switch передает управление непосредственно на выполняемый оператор тела, передавая ему строки, содержащие инициализации.

Пример 1 В данном примере будут выполнены все три оператора тела switch, если C равно A. При этом управление передается на первый оператор (capa++;) и продолжается до конца тела. Если c равно a, то значения lettera и total увеличиваются. В противном случае будет увеличено только значение total.

switch (c) {

case 'A':

capa++;

case 'a':

lettera++;

default:

total++;

}

Пример 2 В данном примере за каждым оператором тела switch следует оператор break. Оператор break форсирует выход из тела оператора после выполнения одного оператора. Если i равно -1, то увеличивается только n. За оператором n++ следует оператор break, что вызывает передачу управления вне тела оператора, в обход оставшихся операторов. Аналогично, если i равно 0, то увеличивается только z; если i равно 1, то увеличивается только p. Финальный оператор break не является обязательным, т.к. управление выйдет из тела составного оператора автоматически по достижении его конца. Он поставлен здесь для единообразия.

switch (i) {

case -1:

n++;

break;

case 0:

z++;

break;

case 1:

p++;

break;

}

Блок-схема оператора switch(case)

Наши рекомендации