Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Arkhitektura_IS.doc
Скачиваний:
9
Добавлен:
15.05.2015
Размер:
406.53 Кб
Скачать
  1. Регистр флагов.

В битах этого регистра содержится информация о состоянии как самого МП, так и программы, команды которой в данный момент загружены в МП.

EFLAGS/FLAGS – 32/16 бит. Отдельные биты называются флагами. Младший байт этого регистра полностью аналогичен регистру FLAGS процессора i8086.

Основные флаги:

CF – флаг переноса. (номер бита в EFLAGS – 0). Содержит 1, если арифметическая операция произвела перенос старшего бита результата. Старшим является 7-й, 15-й или 31-й бит в зависимости от размерности операнда.

PF – флаг паритета. (номер бита в EFLAGS – 2). 1 – 8 младших разрядов операнда содержат четное число единиц.

AF – вспомогательный флаг переноса (номер бита в EFLAGS – 4). Только для BCD-чисел. Фиксирует факт заема из младшей тетрады в старшую.

ZF – флаг нуля. (номер бита в EFLAGS – 6). 1 – результат нулевой.

SF – флаг знака (номер бита в EFLAGS – 7). Отражает состояние старшего бита результата. 1- старший бит равен 1.

OF – флаг переполнения (номер бита в EFLAGS – 11). Для фиксирования факта потери значащего бита при арифметической операции.

IOPL – уровень привилегий ввода-вывода. (номер бита в EFLAGS – 12,13) Используется в защищенном режиме работы МП для контроля доступа к командам ввода-вывода, в зависимости от привилегированности задачи.

NT – флаг вложенности задачи. (номер бита в EFLAGS – 14). Используется в защищенном режиме работы для фиксации того факта, что одна задача вложена в другую.

TF – флаг трассировки. (номер бита в EFLAGS – 8). Предназначен для организации пошаговой работы МП.

IF – флаг прерывания.

Помимо этих регистров существуют множество системных регистров, которые мы рассматривать не будем.

Организация памяти.

Пространство памяти и ввода-вывода разделены.

Память представляется в виде линейной последовательности байт. И подразделяется на байты, слова, двойные и учетверенные слова. Слово записывается в двух, двойное слово – в четырех, учетверенное слово – в 8 смежных байтах, начиная с младшего, т.е. младший байт имеет меньший адрес, этот адрес и является адресом слова, двойного слова, учетверенного слова, он может быть как четным, так и нечетным. Все пространство памяти подразделяется на параграфы – области из 16 смежный байт. Существуют понятия выравнивания по границе слова, двойного слова, учетверенного слова, параграфа. Это когда соответственно, младший бит, два младших бита, три младших бита, четыре младших бита имеют нулевые значения. Выровненные элементы передаются по внешним интерфейсам за минимальное число тактов.

Память логически организовывается в виде одного или множества сегментов переменной (для защищенного режима) или постоянной (для реального режима) длины.

В защищенном режиме возможно разделение памяти на страницы, размерами от 4 Кб до 4 Мбайт. На них может отображаться вся доступная оперативная память. Однако это осуществляется на системном уровне, т.е. прозрачно для программиста.

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

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

В реальном режиме линейный адрес и физический совпадают.

Рассмотрим модель памяти в реальном режиме.

Разрядность шины адреса в реальном режиме – 20 бит. Что дает возможность адресовать ячеек размером в байт, то есть 1 Мбайт.

Вся память разделяется на сегменты, размером в 64 Кбайт.

Физический адрес памяти, поступающий на шину адреса состоит из двух 16-битных частей – адреса сегмента (Seg) и исполнительного (эффективного) адреса EA. Он формируется следующим образом:

Адрес текущего сегмента хранится в одном из сегментных регистров CS, DS, SS, ES. Сдвигается на 4 бита (умножается на 16) он аппаратно, совершенно прозрачно для программиста.

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

В защищенном режиме организация памяти несколько усложняется. По причине, во-первых, более широкой (32 бита) шины адреса, во-вторых, из-за механизмов поддержки виртуальной памяти. Хотя с точки зрения программиста это отличие заключается лишь в том, что эффективный адрес имеет большую размерность (32 бит), а сегментные регистры содержат не адреса сегментов, а некоторые селекторы, преобразующиеся на аппаратном уровне в эти адреса. Сложение этих адресов дает 32-битный линейный адрес, который преобразуется в физический блоком страничной переадресации (если она включена). На шину адреса отравляется физический адрес, собственно он и указывает на нужную ячейку памяти.

Прерывания и исключения.

Как мы уже с вами говорили, компьютер представляет собой средство для реализации алгоритмов. Конкретный алгоритм реализуется с помощью программы. Заданная программа выполняется микропроцессором шаг за шагом, инструкция за инструкцией в соответствии с задающими ГТИ тактами. В некоторых случаях для решения поставленной задачи требуется приостановить в некоторый момент времени ход выполнения программы. Например, чтобы запросить у пользователя некоторые данные или, например, обработать сигнал, поступивший на сетевую карту. Для реализации этой возможности в архитектуру ЭВМ введены прерывания.

Прерывание – это приостановка выполнения программы для выполнения некоторых запланированных или незапланированных действий.

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

В зависимости от источника прерывания можно разделить на:

1. Аппаратные. Возникают как реакция МП на физический сигнал от некоторого устройства компьютера (клавиатура, системный таймер, модем, сетевой адаптер и т.д.). Эти прерывания асинхронны, так как возникают, как правило, независимо от текущей программы, которую выполняет компьютер в данный момент.

2. Программные. Которые вызываются искусственно с помощью команды INT. Эти прерывания являются синхронными. И логически они ничего не прерывают в том смысле, что их можно рассматривать как команду внутри программы.

К программным прерываниям также относятся так называемые исключения – это реакция МП на нестандартную ситуацию, например, при делении на ноль.

Механизм работы аппаратных прерываний в реальном режиме следующий:

При генерировании устройством запроса на прерывание (например, при нажатии кнопки клавиатуры), соответствующий запрос попадает на специальную микросхему – программируемый контроллер прерываний (ПКП). Этот контроллер имеет восьмибитный регистр прерываний IRR, каждый бит которого связан с одним или несколькими внешними устройствами и обозначается как IRQ0-IRQ7. То есть ПКП может обслуживать только восемь устройств. Этого явно мало, поэтому используют, как правило, две последовательно соединенные микросхемы ПКП. Допустим, в нашем случае сигнал прерывания поступает на вход IRQ0. Младший бит регистра прерываний IRR при этом становится равным 1. Регистр IRR связан с управляемым регистром IMR, который позволяет маскировать (запрещать) прерывания. Если прерывание разрешено (незамаскировано), оно поступает к арбитру приоритетов, основная функция которого – определение, какому прерыванию пойти к процессору раньше, при одновременном обращении нескольких прерываний. Обычно, самым приоритетным является прерывание IRQ0. Если конфликта нет, то формируется сигнал на выходе INT ПКП. Этот выход связан со входом INTR МП. При появлении сигнала на своем входе INTR, МП анализирует состояние флага IF. Если его значение «0» (аппаратные прерывания запрещены), то запрос на прерывание «повисает», то есть МП не будет его обрабатывать, до тех пор, пока флаг IF не станет равным «1». Если же прерывания разрешены, МП делает следующие действия:

1. Сбрасывает флаг IF в ноль.

2. Формирует сигнал подтверждения прерывания на своем выводе INTA. Этот вывод связан с одноименным входом ПКП.

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

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

1. Сбрасывает соответствующий бит в регистре IRR (в нашем случае нулевой бит IRQ0).

2. Устанавливает 1 соответствующий бит (в нашем случае нулевой) своего регистра состояния ISR. Этим фиксируется факт обработки готовности процессором обработать соответствующее (нулевое в нашем случае) прерывание.

3. Формирует номер вектора прерывания (указатель на то место в памяти, где хранится программа обработки соответствующего, в нашем примере, нулевого, прерывания), и помещает его на свои выводы, которые соединены с шиной данных МП.

Процессор, зная где лежит программа по обработке прерывания, запускает ее. Если во время этой обработки поступит еще один сигнал прерывания, то, в зависимости от состояния флага IF и от приоритета вновь поступившего прерывания, процессор либо «подвесит» его, либо прервет выполнение текущего обработчика и начнет обработку этого нового прерывания, предварительно, конечно, сохранив контекст программы текущей обработки.

Важный момент связан с тем, что с началом обработки любого прерывания, как мы уже говорил, МП сбрасывает значение флага IF. То есть, если в программе обработки аппаратного прерывания этот флаг вручную не поднять, то никакие аппаратные прерывания, идущие от ПКП не будут обслуживаться, пока не завершится текущая обработка. В частности, также будут теряться такты по уровню IRQ0, идущие от системного таймера несколько раз в секунду, и служащие для счета времени. И компьютерные часы будут отставать. Поэтому рекомендуется в обработчики любых прерываний как можно раньше вставлять команду STI, разрешающая аппаратные прерывания (устанавливающая флаг IF в единицу).

Помимо рассмотренных аппаратных прерываний в МП через ПКП, существуют также аппаратные технические прерывания, которые подаются прямо на вход МП NMI и всегда обслуживаются.

Ассемблер.

Ассемблер – это язык программирования низкого уровня. Представляет собой, символически-удобный аналог машинного языка.

Для перевода программы, написанной на ассемблере, в машинные коды существуют программы – трансляторы (компиляторы).

Достоинства:

1. Максимально оптимальное использование средств процессора, использование меньшего количества команд и обращений в память, и как следствие — большая скорость и меньший размер программы

2. Использование расширеных наборов инструкций процессора (ММХ, SSE, SSE2, SSE3)

3. Доступ к портам ввода-вывода и особым регистрам процессора (в большинстве ОС эта возможность доступна только на уровне модулей ядра и драйверов)

4. Возможность использования самомодифицирующегося (в том числе перемещаемого) кода.

Недостатки:

1. Большие объемы кода, большое число дополнительных мелких задач, меньшее количество доступных для использования библиотек, по сравнению с языками высокого уровня

2. Трудоёмкость чтения и поиска ошибок (хотя здесь многое зависит от комментариев и стиля программирования)

3. Непереносимость на другие платформы, кроме архитектурно совместимых.

4. Более сложен для совместных проектов

Области применения:

  1. Разработка программ, критичных к быстродействию (например, драйверов устройств).

  2. Возможность просмотра и корректировки исполняемых программ (с расширениями, EXE и COM, например), при отсутствии их исходного кода.

Структура программы на ассемблере.

Программа на ассемблере представляет собой описание соответствующих сегментов памяти.

Ассемблер позволяет тонко настроить каждый сегмент (данных, кода, стека): указать тип выравнивания, комбинирования, размер (64 Кбайт в реальном режиме, или до 4 Гб в защищенном). Для некоторых типичных ситуаций приняты так называемые модели памяти, чтобы программист не настраивал их подробно в каждой программе. Подробную настройку следует проводить лишь в тех случаях, когда стандартные модели памяти не удовлетворяют. Мы будем использовать модель памяти SMALL, в котором код программы размещается в одном сегменте кода, а данные объединены в одну группу.

В этом случае структура ассемблерной программы имеет следующий вид:

MODEL SMALL

.DATA

--здесь описывается сегмент данных

.STACK

--здесь описывается сегмент стека

.CODE

MAIN PROC

--здесь представлен исходный код процедуры PROC

MAIN ENDP

ENDMAIN

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

Предложения бывают следующих типов:

Команды (инструкции) – символические аналоги машинных команд. В процессе трансляции они преобразуются в машинные команды.

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

[метка [:]] КОП [Операнд] [,Операнд] [;Комментарий]

КОП – мнемокод команды (состоит из 2-6 букв). В 8088 133 кода, в 80386 – 240.

Операнд – в качестве него может быть явно заданный адрес (прямой или косвенный); имя метки, имя переменной, само значение переменной и т.п.

Количество необходимых операндов в данной команде, МП узнает по КОП.

Метка – имя команды ассемблера для ссылки к этой команде. Метка находится всегда в текущем сегменте памяти.

Директивы – некоторые указания транслятору.

Формат директивы:

[Идентификатр] КПОП [Операнд] [, Оеранд] … [;Комментарий]

Идентификатор – имя директивы

КПОП – мнемокод директивы.

Операнды – различные опции директивы.

Особенности представления чисел:

Двоичные числа заканчиваются буквой B.

Десятичные числа без окончания, либо заканчивающиеся буквой D.

Шестнадцатеричные числа заканчиваются буквой H. Всегда должны начинаться с десятичной цифры, а не буквы!

Отрицательные десятичные числа записываются обычным образом

Двоичные и шестнадцатеричные числа записываются в дополнительном коде.

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

Модификаторы

В качестве операндов могут быть использованы модификаторы, которые определяют некоторые операции, которые выполняются при трансляции команды.

Арифметические: «+» «-«, «*», «/», mod и т.п. Формат: oprd mdf oprd

Логические: and, or, not, xor. Формат: oprd mdf oprd

Отношения: eq – совпадения, nq – несовпадения, it – меньше, gt- больше, le – меньше или равно, ge – больше или равно. Формат: oprd mdf oprd.

Функции: $ - счетчик адреса, возвращает смещение текущей команды относительно сегмента кода;

seg – возвращает сегмент (его адрес) операнда;

offset – возвращает смещение операнда;

length – возвращает длину операнда;

type – возвращает тип операнда (1 – если байт, 3 – dword)

size – возвращает произведение length*type операнда

Формат везде (кроме $) mdf oprnd

Присваивания атрибутов:

ptr – изменяет тип операнда. Формат: type ptr oprnd

ds: es: CS: SS: - изменяет адрес сегмента.

HIGH/LOW – возвращает старший/младший байт 16-битового операнда.

Описание сегмента данных

В этом сегменте программист определяет данные, которые будут использоваться в программе. По-сути, здесь программист определяет переменные. Это осуществляется посредством специальных директив, с помощью которых транслятор выделяет необходимое количество памяти. Эти директивы имеют следующий формат:

[имя] КС выражение

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

КС – ключевые слова, могут быть: DB (1), DW(2), DD(4), DQ(8), DT(10)

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

Например:

PEREM1 DW 56 – под переменную с именем PEREM1 зарезервировать 2 байта памяти и присвоить ей начальное значение 56.

MASSIV DB 10 DUP (‘ ‘) – под переменную с именем MASSIV зарезервировать 10 байт памяти по одному байту и заполнить их символом пробела.

POLE DB 5 DUP (?) – под переменную с именем POLE зарезервировать 5 байт памяти по одному байту, и не присваивать ей никаких начальных значений.

MESSAGE DB ‘Вами неправильно набран номер $’ – определена строка со значением «Вами неправильно набран номер». Стока может содержать до 255 символов, использование в качестве КС DB и наличие счетчика адреса обязательны.

ADDR DW PEREM1 – переменной ADDR выделить 2 байта памяти и присвоить ей адрес (эффективный) ранее созданной переменной PEREM1.

Способы адресации памяти.

Рассмотрим на примере команды MOV

Непосредственная адресация.

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

Примеры:

MOV AX, 10FH; MOV BX, 10H/2

Прямая адресация регистров.

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

MOV AX, BX; MOV DX, BX

Адресация ячеек ОП.

Прямая

В качестве адреса ячейки указывается имя переменной (фактически оно означает ее эффективный адрес)

MOV AX, PEREM – передать в AX содержимое переменной PEREM

Косвенная базовая адресация

Эффективный адрес нужной ячейки содержится в одном из регистров.

MOV AX, [CX] – передать в AX содержимое ячейки памяти, адрес которой находится в CX

Косвенная базовая адресация со смещением

Эффективный адрес нужной ячейки вычисляется как сумма базы и смещения.

MOV AX, PEREM[BX] – передать в AX содержимое ячейки памяти, расположенной на BX байт дальше, чем PEREM

MOV AX, [CX+3] – передать в AX содержимое ячейки памяти, имеющей эффективный адрес CX+3

Косвенная индексная адресация со смещением

Аналогично предыдущей, но возможно масштабирование смещения

MOV AX, PEREM[SI*2] - передать в AX содержимое ячейки памяти, расположенной на SI*2 байт дальше (или на SI слов дальше), чем PEREM

Косвенная базовая индексная адресация

MOV AX, [SI][DX] – поместить в AX содержимое ячейки памяти, эффективный адрес которой равен SI+DX

Косвенная базовая индексная адресация со смещением

MOV PEREM[SI+5][DX] - передать в AX содержимое ячейки памяти, расположенной на SI+5+DX байт дальше, чем PEREM

Основные команды

Команды пересылки данных

MOV dist, src – переслать (скопировать) данные из src в dist

Флаги не меняет.

PUSH src – занести в вершину стека слово из src (из регистра или 2-х ячеек памяти)

POP dst – извлечь из вершины стека слово и поместить его в dst (в регистр или 2 ячейки памяти)

Арифметические команды

ADD dst, src – сложение двоичных чисел. dst = dst + src

dst = r,m

src = r,m,i но нельзя использовать сегментные регистры и одновременно m

Влияет на флаги AF, CF, OF, PF, SF, ZF

SUB dst, src – вычитание двоичных чисел

dst = dst - src

dst = r,m

src = r,m,i но нельзя использовать сегментные регистры и одновременно m

Влияет на флаги AF, CF, OF, PF, SF, ZF

CMP dst, src – сравнить dst с src. Аналогично SUB, но содержимое dst не изменяется.

Флаги CF ZF используются для сравнения чисел без знака, CF, OF, SF, ZF – со знаком.

Команды приращения

INC dst – прибавить 1 к содержимому dst = dst +1

dst = r или m

Влияет на флаги PF, AF, ZF, SF, OF

DEC dst – вычесть 1 из содержимоого dst = dst +1

dst = r или m

Влияет на флаги PF, AF, ZF, SF, OF

Команды умножения

MUL src – умножение беззнаковых чисел.

src = r или m

Если src – байт, то второй множитель будет в AL а результат в AX. Если src – слово, то второй множитель будет в AX, а произведение в DX:AX

Формирует флаги CF, OF

IMUL src – умножение знаковых чисел.

src = r или m

Если src – байт, то второй множитель будет в AL а результат в AX. Если src – слово, то второй множитель будет в AX, а произведение в DX:AX

Формирует флаги CF, OF

Команды деления

DIV src – деление беззнаковых чисел.

src = r или m

Если src – байт, то делимое (слово) будет в AX, частное в AL, а остаток в AH Если src – слово, то второй множитель (двойное слово) будет в DX:AX, частное в AX, а остаток в DL.

Формирует флаг IF

IDIV src – деление знаковых чисел.

src = r или m

Если src – байт, то делимое (слово) будет в AX, частное в AL, а остаток в AH Если src – слово, то второй множитель (двойное слово) будет в DX:AX, частное в AX, а остаток в DL.

Формирует флаг IF

Команды безусловного перехода

JMP opr – перейти на opr

opr может быть: меткой, регистром, содержимым ячейки памяти.

Если метка в том же сегменте памяти, то переход считается внутренним, если в другом сегменте – внешним.

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

В адресном байте команды в этом случае хранится число от -128 до +127 – оно указывает на относительное смещение той команды, куда нужно осуществить переход относительно текущей команды. То есть с помощью этой конструкции можно «прыгнуть» всего на 35-40 команд вперед-назад. Но зато и размер команды на один байт меньше.

То есть

JMP SHORT метка

Однако, если осуществляется переход назад и длина перехода укладывается в 128 байт, то транслятор автоматически уменьшает размер команды JMP, даже без префикса SHORT.

Команда внешнего, межсегментного перехода занимает 5 байтов (два байта под сегмент и два под смещение относительно этого сегмента).

Процедуры

Процедуры обрамляются следующими операторами:

Имя процедуры PROC [расстояние]

; тело процедуры

RET [число байтов]

Имя процедуры ENDP

Расстояние: NEAR – процедура находится в том же сегменте кода, FAR – в другом сегменте кода. Если расстояние опущено, то предполагается near.

RET – возврат управления вызвавшей процедуру программе. Она считывает адрес возврата из стека и загружает его в регистры CS и IP (если процедура NEAR, то только IP). Число байт указывает, сколько байтов нужно освободить в стеке после возврата.

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

CALL [модификатор] oprnd

oprnd может быть:

именем процедуры

именем регистра, в котором содержится смещение адреса процедуры

переменной, в которой содержится адрес процедуры.

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

- в начале программы (до первой исполняемой команды);

- в конце программы (после команды, возвращающей управление операционной системе);

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

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

Условная передача управления может быть только внутрисегментной (NEAR) и короткой (SHORT), то есть в пределах ±128 байт от текущей команды условного перехода.

Алгоритм действия такой:

Сначала выполняется команда, которая соответствующим образом меняет регистр флагов, например команда CMP

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

J* имя метка

Которая при определенной комбинации флагов переводит управление на метку, имя которой указано в ней, либо передает управление на следующую за командой условного перехода команду.

Есть 31 команда, но разных всего 17 (так как некоторые попарно совпадают, например «если больше» все равно, что «если не меньше и не равно» ).

Следует различать для знаковых и беззнаковых чисел

Для беззнаковых:

JA/JNBE – переход если выше – если флаги ZF = CF = 0

JAE/JNB – переход если выше или равно CF=0

JB/JNAE – переход если ниже CF=1

JBE/JNA – переход если ниже или равно – если флаги ZF = CF = 1

Для знаковых:

JG/JNLE – переход если больше – если флаги ZF = 0 SF = OF

JGE/JNL – переход если выше или равно SF=OF

JL/JNGE – переход если ниже SF<>OF

JLE/JNG – переход если ниже или равно – если флаги ZF = 1 или SF<>OF

Для прочих проверок:

JE/JZ – переход если равно (или если нуль) ZF=1

JNE/JNZ – переход если не равно (или не нуль) ZF=0

JS – переход, если есть знак (отрицательно) SF=1

JNS – переход, если нет знака (положительно) SF=0

JC – переход, если есть перенос (CF=1)

JNC – переход, если нет переноса (CF=0)

JO – переход, если есть переполнение (OF=1)

JNO – переход, если нет переполнения (OF=0)

JP/JPE – переход, если есть четность PF=1

JNP/JPO – переход, если нет четности PF=0

JCXZ – переход, если содержимое регистра CX равно 0

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

Количество повторений предварительно записывается в регистр CX

LOOP имя метка

Команда уменьшает содержимое регистра CX на единицу и если значение в регистре становится нулевым – передает управление следующей за ней команде, если же значение CX остается ненулевым – передает управление на метку, имя которой указано. Передачи управления только ближние и короткие.

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

У этих команд есть аналогия с командой CALL, однако начальный адрес обработки прерывания (вектор прерывания) берется из таблицы векторов ОЗУ, он всегда 32битовый (так как хранит и сегмент и смещение), и в стеке сохраняется не только адрес возврата, но и содержимое регистра флагов (то есть весь контекст текущей задачи.

Имеются три команды прерывания:

INT opr

opr указывает номер прерывания (число от 0 до 256), который задает вектор прерывания.

По этой команде процессор выполняет следующие действия:

  1. Помещает в стек содержимое регистров: FL, CS, IP

  2. Обнуляет флаги TF и IF

  3. Загружает в CS и IP второе и первое слова вектора прерываний, считанного из таблицы векторов в оперативной памяти по адресу 4*opr. Таким образом, вся таблица векторов занимает 1024 байта.

Например, INT 1Ah считает из памяти вектор, находящийся по адресу 1Ah*4=68h, то есть в регистр IP будет помещено слово по адресу 68h, а в регистр CS слово, по адресу 6Ah

INTO – прервать по переполнению. Если флаг OF=1, то управление передается по адресу 10h (аналог команды INT 4).

IRET – возврат из программы обработки прерывания. Это последняя команда обработки прерывания. Из стека выталкиваются три последние слова и загружаются в регистры IP, CS и FL. SP увеличивается при этом на 6.

Запоминающие устройства.

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

Обычно выделяют четыре уровня памяти:

  1. Микропроцессорная память (регистры процессора).

  2. Кэш-память.

  3. Основная память (оперативная и постоянная).

  4. Внешняя память (на магнитных и оптических дисках).

Чем выше память находится в этой иерархии тем, как правило, скорость ее работы выше, а объем меньше.

Быстродействие памяти характеризуется скоростью считывания (записи) информации. Важнейшими показателями, влияющими на скорость считывания (записи) являются:

  1. Максимальная пропускная способность. Зависит как от самой памяти, так и от ее интерфейса с процессором.

Зависит от разрядности шины, по которой осуществляется связь процессора с памятью, от частоты этой шины и способе передачи информации.

Например, для двухканального контроллер памяти стандарта DDR400:

8 байт (ширина шины) * 2 (количество каналов) * 2 (протокол DDR, обеспечивающий передачу 2 пакетов данных за 1 такт) * 200'000'000 (фактическая частота работы шины памяти равная 200 МГц, то есть 200'000'000 тактов в секунду) = 5,96 ГБ\с.

  1. Время доступа (латентность).

Доступ к любому произвольно взятому адресу не может быть осуществлён мгновенно, для этого требуется определённое время. Возникает задержка: микросхема памяти получила нужный процессору адрес, но память ещё не готова предоставить к нему доступ. Эта задержка и называется латентностью.

Латентность особенно принципиальна на верхний в иерархии уровнях памяти.

Память типа DDR2 имеет в среднем гораздо большие задержки, чем DDR (при одинаковой частоте передачи данных).

Физические основы работы внутренней памяти

Различные уровни памяти имеют разную физическую организацию.

1. Энергозависимая память.

1.1. Статическая память.

Ячейки построены на триггерах – элементах, которые при наличии питающего напряжения могут находиться сколь угодно долго в одном из двух своих состояний и скачком переходить из одного в другое. Триггеры технически довольно сложно реализовать, они занимают довольно много места на кристалле.

Используется в качестве микропроцессорной и кэш-памяти. Имеет время доступа в несколько наносекунд, что позволяет ей работать на частоте системной шины процессора, совсем не требуя от него тактов ожидания (или требуя считанное число тактов ожидания)

Самая экономичная статическая память – КМОП (CMOS) (комплиментарная метал-оксидная полупроводниковая) память. Имеет время доступа более 100 нс (это довольно много для статической памяти), однако имеет низкое потребление и может питаться от батарейки. Используется для хранения даты и времени, а также некоторой информации о конфигурации компьютера.