Реферат: Программная модель процессоров семейства X86
ПРОГРАММНАЯ МОДЕЛЬПРОЦЕССОРОВ СЕМЕЙСТВА X86
Пользовательскиерегистры
Как следует из названия, пользовательскимирегистры называются потому, что программист может использовать их при написаниисвоих программ. К этим регистрам относятся (рис. 1):
· восемь 32-битныхрегистров, которые могут использоваться программистами для хранения данных иадресов (их еще называют регистрами общего назначения (РОН)):
o eax/ax/ah/al;
o ebx/bx/bh/bl;
o edx/dx/dh/dl;
o ecx/cx/ch/cl;
o ebp/bp;
o esi/si;
o edi/di;
o esp/sp.
· шесть регистровсегментов: cs, ds, ss, es, fs, gs;
· регистрысостояния и управления:
o регистр флагов eflags/flags;
o регистр указателя команды eip/ip.
/>
Рис. 1.Пользовательские регистрымикропроцессоров i486 и Pentium
Почему многие из этихрегистров приведены с наклонной разделительной чертой?
Нет, это не разныерегистры — это части одного большого 32-разрядного регистра. Их можноиспользовать в программе как отдельные объекты.
Так сделано дляобеспечения работоспособности программ, написанных для младших 16-разрядныхмоделей микропроцессоров фирмы Intel, начиная с i8086.
Микропроцессоры i486 иPentium имеют в основном 32-разрядные регистры. Их количество, за исключениемсегментных регистров, такое же, как и у i8086, но размерность больше, что иотражено в их обозначениях — они имеют приставку e (Extended).
Регистры общего назначения
Все регистры этой группы позволяютобращаться к своим “младшим” частям.
Для самостоятельной адресации можноиспользовать только младшие 16 и 8-битные части этих регистров. Старшие 16 битэтих регистров как самостоятельные объекты недоступны. Это сделано, как мыотметили выше, для совместимости с младшими 16-разрядными моделямимикропроцессоров фирмы Intel.
Перечислим регистры,относящиеся к группе регистров общего назначения. Так как эти регистрыфизически находятся в микропроцессоре внутри арифметико-логического устройства(АЛУ), то их еще называют регистрами АЛУ:
· eax/ax/ah/al (Accumulator register) — аккумулятор.
Применяется для храненияпромежуточных данных. В некоторых командах использование этого регистраобязательно;
· ebx/bx/bh/bl (Base register) — базовый регистр.
Применяется для хранениябазового адреса некоторого объекта в памяти;
· ecx/cx/ch/cl (Count register) — регистр-счетчик.
Применяется в командах,производящих некоторые повторяющиеся действия. Его использование зачастуюнеявно и скрыто в алгоритме работы соответствующей команды.
К примеру, командаорганизации цикла loop кроме передачи управления команде, находящейся понекоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;
· edx/dx/dh/dl (Data register) — регистр данных.
Так же, как и регистр eax/ax/ah/al,он хранит промежуточные данные. В некоторых командах его использованиеобязательно; для некоторых команд это происходит неявно.
Следующие два регистраиспользуются для поддержки так называемых цепочечных операций, то естьопераций, производящих последовательную обработку цепочек элементов, каждый изкоторых может иметь длину 32, 16 или 8 бит:
· esi/si (Source Index register) —индексисточника.
Этот регистр в цепочечныхоперациях содержит текущий адрес элемента в цепочке-источнике;
· edi/di (Destination Indexregister) — индексприемника (получателя).
Этот регистр в цепочечныхоперациях содержит текущий адрес в цепочке-приемнике.
В архитектуремикропроцессора на программно-аппаратном уровне поддерживается такая структураданных, как стек. Для работы со стеком в системе командмикропроцессора есть специальные команды, а в программной моделимикропроцессора для этого существуют специальные регистры:
· esp/sp (Stack Pointer register)— регистр указателястека.
Содержит указательвершины стека в текущем сегменте стека.
· ebp/bp (Base Pointer register) — регистр указателябазы кадра стека.
Предназначен дляорганизации произвольного доступа к данным внутри стека.
Не спешите пугаться столь жесткогофункционального назначения регистров АЛУ. На самом деле, большинство из нихмогут использоваться при программировании для хранения операндов практически влюбых сочетаниях. Но, как мы отметили выше, некоторые команды используютфиксированные регистры для выполнения своих действий. Это нужно обязательноучитывать.
Использование жесткогозакрепления регистров для некоторых команд позволяет более компактно кодироватьих машинное представление. Знание этих особенностей позволит вам принеобходимости хотя бы на несколько байт сэкономить память, занимаемую кодомпрограммы.
Сегментные регистрыcs, ss, ds, es, gs, fs.
Их существованиеобусловлено спецификой организации и использования оперативной памятимикропроцессорами Intel. Она заключается в том, что микропроцессор аппаратноподдерживает структурную организацию программы в виде трех частей, называемых сегментами.Соответственно, такая организация памяти называется сегментной.
Для того чтобы указать насегменты, к которым программа имеет доступ в конкретный момент времени, ипредназначены сегментные регистры. Фактически, с небольшой поправкой,как мы увидим далее, в этих регистрах содержатся адреса памяти с которыхначинаются соответствующие сегменты. Логика обработки машинной командыпостроена так, что при выборке команды, доступе к данным программы или к стекунеявно используются адреса во вполне определенных сегментных регистрах.Микропроцессор поддерживает следующие типы сегментов:
1. Сегменткода. Содержиткоманды программы.
Для доступа к этомусегменту служит регистр cs (code segment register) — сегментныйрегистр кода. Он содержит адрес сегмента с машинными командами, к которомуимеет доступ микропроцессор (то есть эти команды загружаются в конвейермикропроцессора).
2. Сегментданных.Содержит обрабатываемые программой данные. Для доступа к этому сегменту служитрегистр ds (data segment register) — сегментный регистр данных,который хранит адрес сегмента данных текущей программы.
3. Сегментстека. Этотсегмент представляет собой область памяти, называемую стеком. Работусо стеком микропроцессор организует по следующему принципу: последнийзаписанный в эту область элемент выбирается первым. Для доступа к этомусегменту служит регистр ss (stack segment register) — сегментныйрегистр стека, содержащий адрес сегмента стека.
4. Дополнительныйсегмент данных.
Неявно алгоритмывыполнения большинства машинных команд предполагают, что обрабатываемые имиданные расположены в сегменте данных, адрес которого находится в сегментномрегистре ds.
Если программенедостаточно одного сегмента данных, то она имеет возможность использовать ещетри дополнительных сегмента данных. Но в отличие от основного сегмента данных,адрес которого содержится в сегментном регистре ds, при использованиидополнительных сегментов данных их адреса требуется указывать явно с помощьюспециальных префиксов переопределения сегментов в команде.
Адреса дополнительныхсегментов данных должны содержаться в регистрах es, gs, fs (extensiondata segment registers).
Регистры состояния и управления eflagsи ip
Они постоянно содержатинформацию о состоянии, как самого микропроцессора, так и программы, командыкоторой в данный момент загружены на конвейер. Используя эти регистры, можнополучать информацию о результатах выполнения команд и влиять на состояниесамого микропроцессора.
eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данногорегистра имеют определенное функциональное назначение и называются флагами.Младшая часть этого регистра полностью аналогична регистру flags дляi8086.
/>/>
Рис. 2. Содержимоерегистра eflags
Исходя из особенностейиспользования, флаги регистра eflags/flags можно разделить на тригруппы:
· 8 флаговсостояния.Эти флаги могут изменяться после выполнения машинных команд. Флаги состояния регистра eflags отражаютособенности результата исполнения арифметических или логических операций. Этодает возможность анализировать состояние вычислительного процесса и реагироватьна него с помощью команд условных переходов и вызовов подпрограмм.
· 1флагуправления— df (Directory Flag). Значение флага df определяетнаправление поэлементной обработки цепочек данных: от начала строки к концу (df= 0) либо наоборот, от конца строки к ее началу (df = 1).
· 5системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой,переключением между задачами и виртуальным режимом 8086. Прикладным программам не рекомендуетсямодифицировать без необходимости эти флаги, так как в большинстве случаев этоприведет к прерыванию работы программы.
eip/ip (Instraction Pointerregister) — регистр-указателькоманд.
Регистр eip/ipимеет разрядность 32/16 бит и содержит смещение следующей подлежащей выполнениюкоманды относительно содержимого сегментного регистра cs в текущем сегментекоманд. Этот регистр непосредственно недоступен программисту, но загрузка иизменение его значения производятся различными командами управления, к которымотносятся команды условных и безусловных переходов, вызова процедур и возвратаиз процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.
Типы данных. Переменные
Впрограмме на ассемблере переменными являются регистры или ячейки памяти, вкоторых хранятся данные. Существует несколько типов данных-переменных:
1. Непосредственные данные, представляющие собойчисловые или символьные значения, являющиеся частью команды. 20d, 0a2h, 10111b
2. Данные простоготипа, описываемые с помощью ограниченного набора директив резервированияпамяти, позволяющих выполнить самые элементарные операции по размещению иинициализации числовой и символьной информации.
Эти два типа данныхявляются элементарными, или базовыми; работа с нимиподдерживается на уровне системы команд микропроцессора. Используя данные этихтипов, можно формализовать и запрограммировать практически любую задачу. Нонасколько это будет удобно — вот вопрос.
3. Данные сложноготипа, (массивы, структуры, записи и пр.) которые были введены вязык ассемблера с целью облегчения разработки программ. Сложные типы данныхстроятся на основе базовых типов, которые являются как бы кирпичиками для ихпостроения. Введение сложных типов данных позволяет несколько сгладить различиямежду языками высокого уровня и ассемблером
Физическаяинтерпретацияданных простого типа основывается на размерности данных:
· байт — восемь последовательнорасположенных битов, пронумерованных от 0 до 7, при этом бит 0 является самыммладшим значащим битом;
· слово — последовательность из двух байт,имеющих последовательные адреса. Размер слова — 16 бит; биты в слове нумеруютсяот 0 до 15. Байт, содержащий нулевой бит, называется младшим байтом, а байт,содержащий 15-й бит — старшим байтом. Микропроцессоры Intel имеют важнуюособенность — младший байт всегда хранится по меньшему адресу. Адресомслова считается адрес его младшего байта. Адрес старшего байта может бытьиспользован для доступа к старшей половине слова.
· двойное слово — последовательность из четырех байт(32 бита), расположенных по последовательным адресам.
· учетверенноеслово —последовательность из восьми байт (64 бита), расположенных по последовательнымадресам.
· />
Рис. 3.Основные типы данных микропроцессора
Логическаяинтерпретация этихтипов:
- Целый тип сознаком — двоичноезначение со знаком, размером 8, 16 или 32 бита. Знак в этом двоичном числесодержится в 7, 15 или 31-м бите соответственно. Ноль в этих битах в операндахсоответствует положительному числу, а единица — отрицательному. Отрицательныечисла представляются в дополнительном коде. Числовые диапазоны для этого типаданных следующие:
o 8-разрядное целое— от –128 до +127;
o 16-разрядноецелое — от –32 768 до +32 767;
o 32-разрядноецелое — от –231 до +231–1.
- Целый тип беззнака — двоичноезначение без знака, размером 8, 16 или 32 бита. Числовой диапазон для этоготипа следующий:
o байт— от 0 до 255;
o слово — от 0 до65 535;
o двойное слово —от 0 до 232–1.
- Указатель напамять двух типов:
o ближнего типа —32-разрядный логический адрес, представляющий собой относительное смещение в байтахот начала сегмента. Эти указатели могут также использоваться в сплошной(плоской) модели памяти, где сегментные составляющие одинаковы;
o дальнего типа —48-разрядный логический адрес, состоящий из двух частей: 16-разряднойсегментной части — селектора, и 32-разрядного смещения.
- Цепочка — представляющая собой некоторыйнепрерывный набор байтов, слов или двойных слов максимальной длины до 4 Гбайт.
- Битовое поле представляет собой непрерывнуюпоследовательность бит, в которой каждый бит является независимым и можетрассматриваться как отдельная переменная. Битовое поле может начинаться слюбого бита любого байта и содержать до 32 бит.
- Неупакованныйдвоично-десятичный тип — байтовое представление десятичной цифры от 0 до 9. Неупакованныедесятичные числа хранятся как байтовые значения без знака по одной цифре вкаждом байте. Значение цифры определяется младшим полубайтом.
- Упакованныйдвоично-десятичный тип представляет собой упакованное представление двух десятичных цифр от 0до 9 в одном байте. Каждая цифра хранится в своем полубайте. Цифра в старшемполубайте (биты 4–7) является старшей.
-
/>
Рис. 4.Основные логические типы данныхмикропроцессора
Язык микроопераций. Ассемблер.
Структура программы на ассемблере:
Modelsmall ; модельпрограммы, или же количество памяти на сегмент
.data ; сегментданных
; описание переменных
.stack100h ; сегментстека
.code ;сегментданных
; процедуры, макрокоманды
main:
; основная программа
endmain
Директивы резервирования памяти
Для описания простых типов данных в программеиспользуются специальные директивы резервирования и инициализации данных,которые, по сути, являются указаниями транслятору на выделение определенногообъема памяти. Если проводить аналогию с языками высокого уровня, то директивырезервирования и инициализации данных являются определениями переменных.
Машинногоэквивалента этим директивам нет; просто транслятор, обрабатывая каждую такуюдирективу, выделяет необходимое количество байт памяти и при необходимостиинициализирует эту область некоторым значением.
Директивы резервирования и инициализации данныхпростых типов имеют формат:
/>
Рис.5.Директивы описания данных простых типов
На рис. 5 использованы следующие обозначения:
· ? показывает, что содержимое поля неопределено, то есть при задании директивы с таким значением выражениясодержимое выделенного участка физической памяти изменяться не будет.Фактически, создается неинициализированная переменная;
· значениеинициализации —значение элемента данных, которое будет занесено в память после загрузкипрограммы. Фактически, создается инициализированная переменная, в качествекоторой могут выступать константы, строки символов, константные и адресныевыражения в зависимости от типа данных. Подробная информация приведена вприложении 1;
· выражение — итеративная конструкция ссинтаксисом, описанным на рис. 5.17. Эта конструкция позволяет повторитьпоследовательное занесение в физическую память выражения в скобках n раз.
· имя — некоторое символическое имя меткиили ячейки памяти в сегменте данных, используемое в программе.
· db — резервирование памяти дляданных размером 1 байт. Директивой db можно задавать следующиезначения:
o выражение или константу, принимающуюзначение из диапазона:
— для чисел со знаком –128...+127;
— для чисел без знака 0...255;
o символьную строку из одного или болеесимволов. Строка заключается в кавычки. В этом случае определяется столькобайт, сколько символов в строке.
· dw —резервирование памяти для данных размером 2 байта. Директивой dw можно задаватьследующие значения:
o выражение или константу, принимающуюзначение из диапазона:
— для чисел сознаком –32 768...32 767;
— для чисел беззнака 0...65 535;
o выражение, занимающее 16 или менеебит, в качестве которого может выступать смещение в 16-битовом сегменте илиадрес сегмента;
o 1- или 2-байтовую строку, заключеннаяв кавычки.
· dd — резервирование памяти дляданных размером 4 байта. Директивой dd можно задавать следующиезначения:
o выражение или константу, принимающуюзначение из диапазона:
— для i386 и выше:
— для чисел сознаком –2 147 483 648...+2 147 483 647;
— для чисел беззнака 0...4 294 967 295;
o относительное или адресное выражение,состоящее из 16-битового адреса сегмента и 16-битового смещения;
o строку длиной до 4 символов,заключенную в кавычки.
· df —резервирование памяти для данных размером 6 байт;
· dp — резервирование памяти дляданных размером 6 байт. Директивами df и dp можно задаватьследующие значения:
o выражение или константу, принимающуюзначение из диапазона:
— для чисел сознаком –2 147 483 648...+2 147 483 647;
— для чисел беззнака 0...4 294 967 295;
o относительное или адресное выражение,состоящее из 32 или менее бит (для i80386) или 16 или менее бит (для младшихмоделей микропроцессоров Intel);
o адресное выражение, состоящее из16-битового сегмента и 32-битового смещения;
o строку длиной до 6 байт, заключеннуюв кавычки.
· dq —резервирование памяти для данных размером 8 байт. Директивой dq можно задаватьследующие значения:
o относительное или адресное выражение,состоящее из 32 или менее бит
o константу со знаком из диапазона –263...263–1;
o константу без знака из диапазона0...264–1;
o строку длиной до 8 байт, заключеннуюв кавычки.
· dt —резервирование памяти для данных размером 10 байт. Директивой dt можно задаватьследующие значения:
o относительное или адресное выражение,состоящее из 32 или менее бит
o адресное выражение, состоящее из16-битового сегмента и 32-битового смещения;
o константу со знаком из диапазона –279...279-1;
o константу без знака из диапазона0...280-1;
o строку длиной до 10 байт, заключеннуюв кавычки;
o упакованную десятичную константу вдиапазоне 0...99 999 999 999 999 999 999.
Очень важно уяснить себе порядок размещения данных впамяти. Он напрямую связан с логикой работы микропроцессора с данными.Микропроцессоры Intel требуют следования данных в памяти по принципу: младшийбайт по младшему адресу.
Для иллюстрации данного принципа рассмотрим листинг1, в котором определим сегмент данных. В этом сегменте данных приведенонесколько директив описания простых типов данных.
Листинг 1. Пример использования директив резервирования и инициализации данных. Программа вводит строку с клавиатуры.
model small
.stack 100h
.data
message db 'Массив байт, содержащих символьные переменные',10,13 '$'
po db 1, 3, 4, 5, 0fh, 0bh, 32, 01011b
perem_1 db 0ffh
perem_2 dw 3a7fh
perem_3 dd 0f54d567ah
k1 db 10
k2 db ?
mas db 10 dup ('?')
adr dw k1
adr_full dd perem_3
.code
start:
mov ax,@data
mov ds,ax
mov ah,0ah
mov dx,offset message ; mov dx, adr
int 21h
mov ax,4c00h
int 21h
end start
Система командФормат предложения ассемблера[имя метки:] КОП [операнд1][, операнд2] [; комментарии]
Команды пересылки данных
mov<операнд назначения>,<операнд-источник>
можно Нельзя Должно бытьmov ах, вх; ах:=вх
mov ах,0а2h; ах:= 0а2h
mov per1,ax
mov ax,bh
mov per1, per2
mov ds,per1
mov cs,ds
mov cs,ax; пара cs:ip содержит адрес следующей команды
mov ah, bh
mov al, per2
mov per1,al
mov ax, per1
mov ds,ax
mov ax,ds либо push ds
mov cs,ax pop cs
xchg <операнд1>,<операнд2>;двунаправленный обмен данными а:=в; в:=с; с:=а
xchg dl,dh; меняет местамиданные
Командыввода-вывода в порт
inаккумулятор, номер_порта — ввод ваккумулятор из порта
outпорт, аккумулятор — вывод содержимого аккумулятора впорт
Команды работы с адресами иуказателями памятиleaназначение, источник— загрузка эффективного адреса источника в регистр-назначение;
leadx, x ; аналогично команде movdx,offsetx
ldsназначение, источник — загрузка эффективного адреса источника в регистрназначения и загрузка указателя (адрес сегмента где содержится источник) врегистр сегмента данных ds;
lesназначение, источник—-//-регистр дополнительного сегмента данных es;
lgsназначение, источник — -//- регистр дополнительного сегмента данных gs;
lfsназначение, источник — -//- регистр дополнительного сегмента данных fs;
lssназначение, источник — -//- регистр сегмента стека ss.
les dx,per1; полный указатель на per1 в пару es:dx
Командыработы со стеком
Для работы со стекомпредназначены три регистра:
ss — сегментный регистр стека;
sp/esp — регистр указателя стека;
bp/ebp — регистр указателя базы кадрастека.
pushисточник — записьзначения источник в вершину стека.
/>
Алгоритм работы:
· уменьшитьзначение указателя стека esp/sp на 4/2 (в зависимости от значения атрибутаразмера адреса — use16 или use32);
· записать источникв вершину стека (адресуемую парой ss:esp/sp).
Размер записываемыхзначений — слово или двойное слово. Также в стек можно записыватьнепосредственные значения. В стек можно класть значение сегментного регистраcs. Другой интересный момент связан с регистром sp. Команда push esp/spзаписывает в стек значение esp/sp по состоянию до выдачи этой команды
Команда push используетсясовместно с командой pop для записи значений в стек и извлечения их из стека
popназначение —запись значения из вершины стека по месту, указанному операндом назначение.Значение при этом “снимается” с вершины стека.
/>
Push ax
Push bx
push cx
…
ss:bp
pop cxpop bx
pop ax
push ax
pop bx ;аналогично команде mov bx,ax
pusha— размещение в стеке регистров общегоназначения в следующей последовательности: ax, cx, dx, bx, sp, bp, si, di
pushad — размещение в стеке регистров общегоназначения в следующей последовательности: eax, ecx, edx, ebx, esp, ebp, esi,edi
pushf — размещение в вершине стека (ss:sp)содержимого регистра флагов flags
pushfd - размещение в стекесодержимого регистра флагов eflags.
popa — извлечение из стека регистров общего назначения di,si, bp, sp, bx, dx, cx, ax
popad — извлечение из стека регистровобщего назначения edi, esi, ebp, esp, ebx, edx, ecx, eax
popf — извлечение из стека слова ивосстановление его в регистр флагов flags
popfd — извлечение из стека двойного словаи восстановление его в регистр флагов eflags
Организациявычислений
Логические командыЛюбая логическая командаменяет значение следующих флагов of, sf,zf,pf,cf (переполнение, знак, нуля, паритет,перенос)
andоперанд_1, операнд_2— операция логического умножения (И — конъюнкция).
оп1:=оп1 ٧оп2
and ah,0a1h; ah:=ah٧0ah
and bx, cx; bx:=bx٧cx
and dx, x1; dx:=dx٧x1
orоперанд_1, операнд_2 — операция логического сложения (ИЛИ- дизъюнкцию)
or al, x1; оп1:=оп1 & оп2
or eax,edx
or dx, x1
xorоперанд_1, операнд_2 —операция логического исключающего сложения (исключающего ИЛИ ИЛИ-НЕ)
testоперанд_1, операнд_2 — операция “проверить” (способомлогического умножения).
Команда выполняетпоразрядно логическую операцию И над битами операндов операнд_1 и операнд_2.Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, чтодает возможность анализировать состояние отдельных битов операнда без измененияих состояния.
notоперанд — операция логического отрицания.Команда выполняет поразрядное инвертирование (замену значения на обратное)каждого бита операнда. Результат записывается на место операнда.
Пример программы логического сложения двух однобайтныхчисел.
model small
.stack 100h
.data
x1 db 0c2h
x2 db 022h
y db ?
.code
start:
mov ax,@data
mov ds,ax
mov al, x1
or al, x2
mov y, al
mov ax,4c00h
int 21h
end start
Арифметические операции над целымидвоичными числамиСложение двоичных чисел без знакаincоперанд — операция инкремента, то есть увеличениязначения операнда на 1;
inc ax; ax:=ax+1
inc x1
addоп1, оп2 — команда сложения спринципом действия: оп1 = оп1 + оп2 (addition)
add al, bl
add ax,0fe2h
add ebx,x1+2
add x1, 0fh
add x2, ax
adcоп1, оп2 — команда сложения с учетом флага переноса cf.оп1 = оп1 + оп2 + знач_cf
Вычитание двоичных чисел без знакаdecоперанд — операция декремента, то есть уменьшениязначения операнда на 1;
dec cx ;cx:=cx-1
dec x
subоперанд_1, операнд_2 — команда вычитания; ее принципдействия:
операнд_1 = операнд_1 –операнд_2
sub al, bl; al:=al-bl
sub ax, x1
sub x2, dx
sub eax,0f35h
sub x2, 22h
sbbоперанд_1, операнд_2 — команда вычитания с учетом заема(флага cf ):
операнд_1 = операнд_1 –операнд_2 – значение_cf
Пример программы сложения двух однобайтных чисел.
model small
.stack 100h
.data
x1 db 0c2h
x2 db 022h
y db ?
.code
start:
mov ax,@data
mov ds,ax
mov al, x1
add al, x2
mov y, al
mov ax,4c00h
int 21h
end start
Умножение двоичныхчиселmulмножитель_1 - операция умножения двух целых чиселбез учета знака
Алгоритм работы:
Команда выполняетумножение двух операндов без учета знаков. Алгоритм зависит от формата операндакоманды и требует явного указания местоположения только одного сомножителя,который может быть расположен в памяти или в регистре. Местоположение второгосомножителя фиксировано и зависит от размера первого сомножителя
mul dl; ax:=al*dl, dl-множитель_1 , al- множитель_2
mul x1; dx:ax=ax*0ad91h, x1 word- множитель_1 , ax- множитель_2
mul ecx; edx:eax=eax*ecx, ecx- множитель_1 , eax-множитель_2
imul множитель_1 - операцияумножения двух целочисленных двоичных значений со знаком
Деление двоичныхчиселdivделитель — выполнение операции деления двух двоичныхбеззнаковых значений
Алгоритм работы:
Для команды необходимозадание двух операндов — делимого и делителя. Делимое задается неявно и размерего зависит от размера делителя, который указывается в команде
div dl ;ah:al=ax/dl, ax –делимое, dl- делитель , ah-частное, al -остаток
div x1 ;ax:dx=dx:ax/0ad91h, dx:ax –делимое, x1 word-делитель , ax-частное,
;dx -остаток
div ecx ;eax:edx=edx:eax/ecx, edx:eax–делимое, ecx- делитель , eax-частное,
;edx -остаток
idivделитель — операция деления двух двоичных значений сознаком
Пример программы умножения двух однобайтных чисел.
model small
.stack 100h
.data
x1 db 78
yl db ?
yh db ?
.code
start:
mov ax,@data
mov ds,ax
xor ax, ax
mov al, 25
mul x1
jnc m1 ; если нет переполнения
mov yh,ah
m1:
mov yl, al
mov ax,4c00h
int 21h
end start
Пример. Вычислитеследующее выражение у=(х2-х3)/х1, х1, х2, х3 — однобайтные числа
model small
.stack 100h
.data
s1 db 'Введите х1',10,13,'$'
s2 db 'Введите х2',10,13,'$'
s3 db 'Введите х3',10,13,'$'
x1 db ?
x2 db ?
yc db ?; частное
yo db ?; остаток
.code
start:
mov ax,@data
mov ds,ax
/>
mov ah,09h
mov dx, offset s1
int 21h ; вывод строки
mov ah,01h вводимх1
int 21h ; вводим число
sub al,30h ;al:=x1
mov x1,al
mov ah,09h
/>mov dx, offset s2
int 21h
mov ah,01h вводимх2
int 21h
sub al,30h ;al:=x2
mov x2,al
mov ah,09h
/>mov dx, offset s3
int 21h
mov ah,01h вводим х3
int 21h
sub al,30h ;al:=x3
/>
mov bl,x2 ;bl:=x2
sub bl,al ;bl:=x2-x3
xchg al,bl ;al:=bl,al:=x2-x3
xor ah,ah ;ax:=x2-x3 вычисляем у
mov dl,x1 ;dl:=x1
div dl ;ax/dl, ax/x1
mov yc,ah
mov yo,al
; можно вывести результатна экран
mov ax,4c00h
int 21h
end start
КомандысдвигаВсе команды сдвигаобеспечивают манипуляции над отдельными битами операндов, они перемещают биты вполе операнда влево или вправо в зависимости от кода операции.
Все команды сдвигаустанавливают флаг переноса cf.
shlоперанд, счетчик_сдвигов(ShiftLogical Left)- логический сдвиг влево. Содержимое операнда сдвигается влево на количествобитов, определяемое значением счетчик_сдвигов. Справа (в позицию младшего бита)вписываются нули;
shrоперанд, счетчик_сдвигов—логический сдвиг вправо.
shl al, 2
Было al=00001101
Стало al=00110100
shr ax, 8
Было ax=4faf, стало ax=004f
mov cl,05h
shl bh, cl
bh=00010110
bh=11000000
shr x1,3
/>
Алгоритм работыкоманд:
· очередной“выдвигаемый” бит устанавливает флаг cf;
· бит, вводимый воперанд с другого конца, имеет значение 0;
· при сдвигеочередного бита он переходит во флаг cf, при этом значение предыдущегосдвинутого бита теряется!
salоперанд, счетчик_сдвигов(ShiftArithmetic Left)
sar операнд, счетчик_сдвигов
арифметическийсдвиг влево/вправо. Содержимое операнда сдвигается влево/ вправо на количествобитов, определяемое значением счетчик_сдвигов. Справа/ Слева в операндвписываются нули.
Команда sal не сохраняет знака, но устанавливаетфлаг cf в случае смены знака очередным выдвигаемым битом. В остальномкоманда sal полностью аналогична команде shl;
Команда sar сохраняет знак, восстанавливаяего после сдвига каждого очередного бита.
/>
Команды циклического сдвига
rol операнд,счетчик_сдвигов(Rotate Left) — циклический сдвиг влево.
Содержимое операндасдвигается влево на количество бит, определяемое операндом счетчик_сдвигов.Сдвигаемые влево биты записываются в тот же операнд справа.
ror операнд, счетчик_сдвигов (RotateRight) — циклический сдвиг вправо.
rol al, 3
Было al=10101100
Стало al=01100101
ror ax, 8
Было ax=4faf, стало ax=af4f
mov cl,05h
rol bh, cl
bh=00010110
bh=11000010
ror x1,2
/>Как видно из рис., команды простого циклическогосдвига в процессе своей работы осуществляют одно полезное действие, а именно:циклически сдвигаемый бит не только вдвигается в операнд с другого конца, но иодновременно его значение становиться значением флага cf.
Команды циклического сдвига через флаг переносаcf отличаются от команд простого циклического сдвига тем, что сдвигаемыйбит не сразу попадает в операнд с другого его конца, а записывается сначала вфлаг переноса cf. Лишь следующее исполнение данной команды сдвига (приусловии, что она выполняется в цикле) приводит к помещению выдвинутого ранеебита с другого конца операнда (см. рис. 4).
rcl операнд, счетчик_сдвигов(Rotate through Carry Left) — циклический сдвиг влево через перенос.
Содержимое операнда сдвигается влево на количествобит, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередностановятся значением флага переноса cf.
rcr операнд, счетчик_сдвигов(Rotate through Carry Right) — циклический сдвиг вправо через перенос.
Содержимое операнда сдвигается вправо на количествобит, определяемое операндом счетчик_сдвигов. Сдвигаемые биты поочередностановятся значением флага переноса cf.
/>
Из рис. 4 видно, что при сдвиге через флаг переносапоявляется промежуточный элемент, с помощью которого, в частности, можнопроизводить подмену циклически сдвигаемых битов, в частности, рассогласованиебитовых последовательностей.
Под рассогласованием битовой последовательностиздесь и далее подразумевается действие, которое позволяет некоторым образомлокализовать и извлечь нужные участки этой последовательности и записать их вдругое место
Пример. Даноотрицательное число. Выведите на экран его значение по модулю деленное на 2.
Любое отрицательное числохранится в дополнительном формате
-1 ffh
-2 feh
…
-10 f6h
получить значение числапо модулю, можно осуществив логическое отрицание над числом и добавив 1.
model small
.stack 100h
.data
x db -12
.code
start:
mov ax,@data
mov ds,ax
mov al,x ; в al отрицательное число
not al
inc al ; число по модулю
shr al,1
; выводим результат наэкран
aam ;
; преобразование двоичногочисла меньшего 63h (9910), которое находится в al в его; неупакованный BCD-эквивалент
; -разделить значениерегистра al на 10;
; -записать частное врегистр ah, остаток — в регистр al.
mov dx,ax; число врегистр dx
or dx,3030h ; получаюASCII код числа
xchg dh,dl; меняю местамистарший и младший байт, для вывода символа из dl
mov ah,02h ;
int 21h ; вывожу старшую половинку числа
xchg dh,dl; меняю местамистарший и младший байт,
int 21h ; вывожу младшую половинку числа
mov ax,4c00h
int 21h
end start
Команды передачиуправления
Попринципу действия, команды микропроцессора, обеспечивающие организациюпереходов в программе, можно разделить на три группы:
1.Команды безусловной передачи управления:
— команда безусловного перехода; jmp
— вызовапроцедуры и возврата из процедуры; call, ret
— вызова программных прерываний и возврата из программных прерываний. Int, iret
2.Команды условной передачи управления:
— командыперехода по результату команды сравнения cmp;
— команды перехода по состоянию определенного флага;
— командыперехода по содержимому регистра ecx/cx.
3.Команды управления циклом:
— команда организации цикла со счетчиком ecx/cx;
— команда организации цикла со счетчиком ecx/cx с возможностью досрочного выходаиз цикла по дополнительному условию.
jmp адрес_перехода — безусловный переходбез сохранения информации о точке возврата. Аналог goto.
jmp m1 m4:
… …
m1: jmp m4
Условные переходыКоманды условногоперехода имеют одинаковый синтаксис:
jcc метка_перехода
Мнемокод всех командначинается с “j” — от слова jump (прыжок), cc — определяетконкретное условие, анализируемое командой. Что касается операнда метка_перехода,то эта метка может находится только в пределах текущего сегмента кода, межсегментнаяпередача управления в условных переходах не допускается.
Для того чтобы принятьрешение о том, куда будет передано управление командой условного перехода,предварительно должно быть сформировано условие, на основании которого и будетприниматься решение о передаче управления. Источниками такого условия могутбыть:
- любая команда,изменяющая состояние арифметических флагов;
- команда сравненияcmp, сравнивающая значения двух операндов;
- состояниерегистра ecx/cx.
Условныепереходы по содержимому флагов
Название флага Номер бита в eflags/flag Команда условного перехода Значение флага для осуществления перехода Флаг переноса cf 1 jc cf = 1 Флаг четности pf 2 jp pf = 1 Флаг нуля zf 6 jz zf = 1 Флаг знака sf 7 js sf = 1 Флаг переполнения of 11 jo of = 1 Флаг переноса cf 1 jnc cf = 0 Флаг четности pf 2 jnp pf = 0 Флаг нуля zf 6 jnz zf = 0 Флаг знака sf 7 jns sf = 0 Флаг переполнения of 11 jno of = 0
jcxz метка_перехода (Jump if cx is Zero) — переход, еслиcx ноль;
jecxz метка_перехода (Jump Equal ecx Zero) — переход, если ecx ноль.
Пример программы:определите, равны ли два числа вводимые пользователем с клавиатуры.
model small
.stack 100h
.data
s1 db 'числа равны$'
s2 db 'числа неравны$'
.code
start:
mov ax,@data
mov ds,ax
mov ah,01h
int 21h ; ввели первое число
mov dl,al
mov ah,01h
int 21h ; ввели второе число
sub al,dl ; сравниличисла
jnz m1
mov dx,offset s1
jmp m2
m1: mov dx,offset s2
m2: mov ah,09h
int 21h ; выводим информационную строку
mov ax,4c00h
int 21h
end start
Командасравнения cmp
cmp операнд_1, операнд_2 — сравнивает дваоперанда и по результатам сравнения устанавливает флаги. Команда сравнения cmpимеет интересный принцип работы. Он абсолютно такой же, как и у командывычитания sub. Единственное, чего она не делает — это запись результатавычитания на место первого операнда.
Алгоритм работы:
-выполнить вычитание(операнд1-операнд2);
-в зависимости отрезультата установить флаги, операнд1 и операнд2 не изменять (то есть результатне запоминать).
Условные переходы послекоманд сравнения
Типы операндов Мнемокод команды условного перехода Критерий условного перехода Значения флагов для осществления перехода Любые je операнд_1 = операнд_2 zf = 1 Любые jne операнд_1<>операнд_2 zf = 0 Со знаком jl/jnge операнд_1 < операнд_2 sf <> of Со знаком jle/jng операнд_1 <= операнд_2 sf <> of or zf = 1 Со знаком jg/jnle операнд_1 > операнд_2 sf = of and zf = 0 Со знаком jge/jnl операнд_1 => операнд_2 sf = of Без знака jb/jnae операнд_1 < операнд_2 cf = 1 Без знака jbe/jna операнд_1 <= операнд_2 cf = 1 or zf=1 Без знака ja/jnbe операнд_1 > операнд_2 cf = 0 and zf = 0 Без знака jae/jnb операнд_1 => операнд_2 cf = 0Пример программы:определите, равны ли два числа вводимые пользователем с клавиатуры.
model small
.stack 100h
.data
s1 db 'числа равны$'
s2 db 'числа неравны$'
.code
start:
mov ax,@data
mov ds,ax
mov ah,01h
int 21h ; ввели первое число
mov dl,al
mov ah,01h
int 21h ; ввели второе число
cmp al,dl ; сравниличисла
jne m1
mov dx,offset s1
jmp m2
m1: mov dx,offset s2
m2: mov ah,09h
int 21h ; выводим информационную строку
mov ax,4c00h
int 21h
end startОрганизация цикловloop метка_перехода (Loop) — повторитьцикл
Работа командызаключается в выполнении следующих действий:
— декремента регистраecx/cx;
— сравнения регистраecx/cx с нулем:
— если (ecx/cx) > 0,то управление передается на метку перехода;
— если (ecx/cx) = 0, тоуправление передается на следующую после loop команду
movcx,количество циклов
м1: телоцикла
loopm1
loope/loopz метка_перехода (Loop till cx<> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.
loopne/loopnz метка_перехода (Loop till cx<> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1
Недостаток командорганизации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуюттолько короткие переходы (от –128 до +127 байт).
Организациявложенных циклов
movcх,n; в сх заносим количество итерацийвнешнего цикла
m1:
pushcx
/>/>…
movcx,n1; в сх заносим количество итерацийвнутреннего цикла
m2:
теловнутреннего цикла
loopm2
…
popcx
loopm1
Пример программы:Напишите программу подсчета у=1+2+3+…+n, n не более 10000.
model small
.stack 100h
.data
yb dd ?
ym dw ?
s1 db 'введите n',10,13,'$'
.code
start:
mov ax,@data
mov ds,ax
mov dx,offset s1
mov ah,09h
int 21h
mov cx,3
/>m: shl bx,4
mov ah,01h
int 21h вводим n в регистр bx
sub ax,130h
add bx,ax
loop m
mov cx,bx
/>xor dx,dx
xor al,al
m1: add dx,cx считаем у
jnc m2
mov al,1
m2: loop m1
cmp al,1
je m3
mov ym,dx
m3: mov yb,edx
mov ax,4c00h
int 21h
end start
Цепочечные команды
(Команды обработки строк символов)
Цепочка– этопоследовательность элементов, размер которых может быть байт, слово, двойноеслово. Содержимое этих элементов может быть любое – символы, числа.
В системе командмикропроцессора имеется семь операций-примитивов обработки цепочек.
Каждая из них реализуетсяв микропроцессоре тремя командами, в свою очередь, каждая из этих командработает с соответствующим размером элемента — байтом, словом или двойнымсловом.
Вместес цепочечными командами обычно применяют префиксы повторений, которые ставятсяперед командой в поле [метки]. Цепочечная команда без префикса выполняется один раз. Спрефиксом цепочечные команды выполняются циклично.
rep (REPeat) — команда выполняется, пока содержимое в ecx/cx нестанет равным 0. При этом цепочечная команда, перед которой стоит префикс,автоматически уменьшает содержимое ecx/cx на единицу. Та же команда, но безпрефикса, этого не делает.
repe или repz (REPeat while Equal or Zero) — команда выполняется до тех пор, пока содержимоеecx/cx не равно нулю или флаг zf равен 1. Как только одно из этих условийнарушается, управление передается следующей команде программы
repne или repnz(REPeat while Not Equal or Zero) — команда циклически выполняется до тех пор, покасодержимое ecx/cx не равно нулю или флаг zf равен нулю. При невыполнении одногоиз этих условий работа команды прекращается.
Формированияфизического адреса операндов адрес_источника и адрес_приемника происходит следующимобразом:
адрес_источника — пара ds:esi/si;
адрес_приемника — пара es:edi/di
Важный момент, касающийсявсех цепочечных команд, — это направление обработки цепочки. Естьдве возможности:
— от начала цепочки к ееконцу, то есть в направлении возрастания адресов;
— от конца цепочки кначалу, то есть в направлении убывания адресов.
Цепочечные команды самивыполняют модификацию регистров, адресующих операнды, обеспечивая тем самымавтоматическое продвижение по цепочке. Количество байт, на которые этамодификация осуществляется, определяется кодом команды. А вот знак этоймодификации определяется значением флага направления df (Direction Flag)в регистре eflags/flags. Состоянием флага df можно управлять с помощьюдвух команд, не имеющих операндов:
cld (Clear Direction Flag) — очиститьфлаг направления df = 0, значение индексных регистров esi/si и edi/diбудет автоматически увеличиваться (операция инкремента) цепочечными командами,то есть обработка будет осуществляться в направлении возрастания адресов;
std (Set Direction Flag) — установитьфлаг направленияdf = 1, то значение индексных регистров esi/si и edi/diбудет автоматически уменьшаться (операция декремента) цепочечными командами, тоесть обработка будет идти в направлении убывания адресов.
Типовой набор действий для выполнения любой цепочечнойкоманды:
- Установить значениефлага df в зависимости от того, в каком направлении будут обрабатыватьсяэлементы цепочки — в направлении возрастания или убывания адресов.
- Загрузитьуказатели на адреса цепочек в памяти в пары регистров ds:(e)si и es: (e)di.
- Загрузить врегистр ecx/cx количество элементов, подлежащих обработке.
- Выдать цепочечнуюкоманду с префиксом повторений.
Пересылка цепочек
movsадрес_прием,адрес_источника (MOVeString)- переслать цепочку;
movsbMOVe String Byte) — переслать цепочкубайт;
movsw (MOVe String Word) — переслать цепочкуслов;
movsd (MOVe String Double word)— переслать цепочкудвойных слов.
Команда копирует байт, слово или двойное слово из цепочки источника, вцепочку приемника. Размер пересылаемых элементов ассемблер определяет, исходяиз атрибутов идентификаторов. К примеру, если эти идентификаторы былиопределены директивой db, то пересылаться будут байты, если идентификаторы былиопределены с помощью директивы dd, то пересылке подлежат двойные слова.
Для цепочечных команд соперандами типа movs адрес_приемника, адрес_источника, не существуетмашинного аналога. При трансляции в зависимости от типа операндов трансляторпреобразует ее в одну из трех машинных команд: movsb, movsw илиmovsd.
Сама по себе команда movsпересылает только один элемент, исходя из его типа, и модифицирует значениярегистров esi/si и edi/di. Если перед командой написать префикс rep, тоодной командой можно переслать до 64 Кбайт данных. Число пересылаемых элементовдолжно быть загружено в счетчик — регистр cx (use16) или ecx(use32).
Примерпроги. Пересылкастроккомандойmovs
MODEL small
STACK 256
.data
source db 'Тестируемаястрока','$' ;строка-источник
dest db 19 DUP (' ') ;строка-приёмник
.code
main:
movax,@data ; загрузка сегментных регистров
movds,ax ; настройка регистров DS и ES на адрес сегмента данных
moves,ax
cld ; сброс флага DF — обработка строки от начала к концу
leasi,source ; загрузка в si смещения строки-источника
leadi,dest ; загрузка в DS смещения строки-приёмника
movcx,20 ; для префикса rep — счетчик повторений (длина строки)
rep movs dest,source ;пересылкастроки
lea dx,dest
movah,09h; вывод на экран строки-приёмника
int 21h
mov ax,4c00h
int 21h
endmain
Операция сравнения цепочек
cmpsадрес_приемника, адрес_источника(CoMPare String) — сравнить строки;
cmpsb (CoMPare String Byte) — сравнить строкубайт;
cmpsw (CoMPare String Word) — сравнить строкуслов;
cmpsd (CoMPare String Doubleword) — сравнить строкудвойных слов.
Алгоритм работы команды cmpsзаключается в последовательном выполнении вычитания (элемент цепочки-источника— элемент цепочки-получателя) над очередными элементами обеих цепочек. Принципвыполнения вычитания командой cmps аналогичен команде сравнения cmp. Она, также, как и cmp, производит вычитание элементов, не записывая при этом результата,и устанавливает флаги zf, sf и of.
После выполнениявычитания очередных элементов цепочек командой cmps, индексные регистры esi/siи edi/di автоматически изменяются в соответствии со значением флага df назначение, равное размеру элемента сравниваемых цепочек.
Чтобы заставить командуcmps выполняться несколько раз, то есть производить последовательное сравнениеэлементов цепочек, необходимо перед командой cmps определить префиксповторения. С командой cmps можно использовать префикс повторения repe/repzили repne/repnz:
- repe или repz —если необходимо организовать сравнение до тех пор, пока не будет выполнено одноиз двух условий: достигнут конец цепочки (содержимое ecx/cx равно нулю) или вцепочках встретились разные элементы (флаг zf стал равен нулю);
- repne или repnz —если нужно проводить сравнение до тех пор, пока: не будет достигнут конеццепочки (содержимое ecx/cx равно нулю) или в цепочках встретились одинаковыеэлементы (флаг zf стал равен единице).
Пример программы Сравнение двух строк командой cmps
MODEL small
STACK 256
.data
sov db 0ah,0dh,'Строкисовпадают.','$'
nesovdb 0ah,0dh,'Строки не совпадают','$'
s1 db'0123456789',0ah,0dh,'$'; исследуемые строки
s2 db 10
s3 db 11 dup (0)
.code
main:
movax,@data; загрузка сегментных регистров
movds,ax
moves,ax; настройка ES на DS
;вводимстроку
mov ah, 0аh
mov dx, offset s2
int 21h
; поисксовпадающих элементов, сброс флага DF — сравнение в направлении возрастания адресов
cld
lea si,s1 ;загрузкавsi смещенияstring1
leadi,s3; загрузка в diсмещения string2
movcx,10; длина строки для префикса repe
repecmpsb ; сравнениестрок (пока сравниваемые элементы строк равны)
; выходпри обнаружении не совпавшего элемента
jcxzequal ;cx=0, то есть строки совпадают
lea dx, nesov
jmp exit ;выход
equal: lea dx, sov
exit: mov ah,09h
int21h; вывод сообщения
movax,4c00h
int21h
endmain; конец программы
Операция сканирования цепочек
scas адрес_приемника (SCAning String) — сканироватьцепочку;
scasb (SCAning String Byte) — сканировать цепочку байт;
scasw (SCAning String Word) — сканировать цепочкуслов;
scasd (SCAning String DoubleWord) — сканировать цепочкудвойных слов
Эти команды осуществляютпоиск искомого значения, которое находится в регистре al/ax/eax. Принцип поиска тот же, что и вкоманде сравнения cmps, то есть последовательное выполнение вычитания
(содержимоерегистра_аккумулятора – содержимое очередного_элемента_цепочки).
В зависимости отрезультатов вычитания производится установка флагов, при этом сами операнды неизменяются.
Так же, как и в случаекоманды cmps, с командой scas удобно использовать префиксы repe/repz илиrepne/repnz:
- repe или repz — если нужноорганизовать поиск до тех пор, пока не будет выполнено одно из двух условий:достигнут конец цепочки (содержимое ecx/cx равно 0) или в цепочке встретилсяэлемент, отличный от элемента в регистре al/ax/eax;
- repne или repnz — если нужноорганизовать поиск до тех пор, пока не будет выполнено одно из двух условийдостигнут конец цепочки (содержимое ecx/cx равно 0)или в цепочке встретилсяэлемент, совпадающий с элементом в регистре al/ax/eax.
Пример проги. найти количество * в строке
MODEL small
STACK 256
.data
s1 db 20
s2 db 21 dup?
s3 db'количество * в строке',0ah,0dh,'$'
.code
main:
mov ax,@data
mov ds,ax
moves,ax; настройка ESна DS
;вводимстроку
mov ah,0ah
mov dx, offset s1
int 21h
; поиск*
moval,'*' ; символ для поиска — `а`(кириллица)
cld ; сброс флага df
lea di, s2 ; загрузка в es:di смещения строки
inc di ; первый элемент в s3 это количествовведенных символов, его игнорируем
xor bl ; обнуляем счетчик звездочек
movcx,20; для префикса repne — длина строки
m1: repne scasb ; покаискомый символ и символ в строке не совпадут идет поиск,; выход при совпадении
je found ; если равны — переход на обработку
; выводколичества звездочек в строке
movah,09h
mov dx,offsets3
int 21h ;выводсообщенияnochar
mov al,bl
aam
or ax, 3030h
mov dx,ax
xchg dh,dl
mov ah, 02h
int 21h
xchg dh,dl
int 21h
mov ax,4c00h
int 21h
; суммируемколичество звездочек
found: incbl
jmp m1
endmain
Загрузка элемента цепочки ваккумуляторlods адрес_источника(LOaD String) — загрузить элемент из цепочки врегистр-аккумулятор al/ax/eax;
lodsb(LOaD String Byte) — загрузить байт из цепочки в регистр al;
lodsw (LOaD String Word) — загрузить слово из цепочки в регистр ax;
lodsd (LOaD String Double Word) — загрузить двойное слово из цепочки в регистр eax.
Эта операция-примитив позволяетизвлечь элемент цепочки и поместить его в регистр-аккумулятор al, ax или eax.Эту операцию удобно использовать вместе с поиском (сканированием) с тем, чтобы,найдя нужный элемент, извлечь его (например, для изменения).
Перенос элемента из аккумулятора вцепочкуstosадрес_приемника (STOre String) — сохранить элемент изрегистра-аккумулятора al/ax/eax в цепочке; stosb(STOre String Byte) — сохранить байт из регистра al в цепочке; stosw (STOre String Word) — сохранить слово из регистра ax в цепочке; stosd(STOre String Double Word) — сохранить двойное слово из регистра eax в цепочке.
Эта операция-примитив позволяетпроизвести действие, обратное команде lods, то есть сохранить значение изрегистра-аккумулятора в элементе цепочки. Эту операцию удобно использоватьвместе с операцией поиска (сканирования) scans и загрузки lods, с тем, чтобы, найдянужный элемент, извлечь его в регистр и записать на его место новое значение.
Сложныеструктуры данных
Одномерныемассивы
Все элементы массива располагаются впамяти последовательно
Описание элементов массива
masdb1,2,3,4,5
masdw5 dup(0)
Доступ к элементам массива
movax,mas[si] ; в siномер элемента вмассиве
movmas[si], ax ; в diномер элемента вмассиве
Используякоманды i486 можно использовать адресацию смасштабированием, при размере элементов больше байта
Movax, mas[si*2] ;
Примерпрограммы Найти в строке хотя бы один нулевой элемент
model small
.stack 100h
.data
buferdw 25 ; формируюразмер буфера для ввода строки
masdw 25 dup(' ') ; формируюбуфер
adr dw bufer ; описываюадрес
subj1 db ‘в строке найден нулевойэлемент', '$'
subj2 db ‘в строке не найден нулевойэлемент', '$'
.code
main:
mov ax,@data
mov ds,ax
mov ah,0ah
mov dx, adr
int 21h ; ввод строки склавиатуры
; поискнулевого элемента
xor si, si
movcx, mas[si]; загружаем в схколичество элементов в строке
movax, 030h ; в axзагружаем ASCIIкод нуля
m1: inc si либо incsi
inc si cmp ax,mas[si*2]
cmp ax, mas[si]
je m2; если в строкенайдем нулевой элемент, то выходим из цикла на вывод subj1
loopm1
; нормальныйвыход из цикла означает что в строке нет нулевых элементов
mov ah,09h
lea dx, subj2
int 21h
jmp exit
m2: mov ah, 09h
lea dx,subj1
int 21h
exit: mov ax,4c00h
int 21h
end main
Двумерные массивов
! Специальных средств для описания двумерных массивов вассемблере нет!
Двумерный массив описывается также как и одномерный массив, отличиезаключается в трактовке расположения элементов. Пусть последовательностьэлементов трактуется как двумерный массив, расположенный по строкам, тогдаадрес элемента [i,j] вычисляется так
База+колич_элем_строке*размер_элем*I+j
Для определения базы используют имя массива, для второгослагаемого регистр bx, для третьего si, этобазово-индексная адресация.
Описание массива:
Mas1 db 10 dup(3 dup(?))
Mas2 db 1,2,3,4,5
3,4,5,6,7
4,7,9,2,0
Пример поиска максимального элемента вкаждой строке однобайтного массива mas, размером 5*10, с занесением максимальных элементов в массив max (1*5). Инициализацию массива mas рассматривать не будем.
…
xor di, di; обнуляеминдексы массива max
xor bx, bx ; обнуляеминдексы строк массива mas
xor si, si ; обнуляеминдексы столбцов массива mas
mov cx,5 ; в cxколичество строк, внешний цикл
m1: push cx
mov cx, 10 ; в сх количество столбцов, внутреннийцикл
mov al, mas[si+bx]; первый элемент из 1 строки mas в аl
m2: inc si
cmp al, mas[si+bx] ; сравниваем со следующим элем. строки
jb m3 ; если меньше на m3
mov al, mas[si+bx] ; иначе в аl заносим больший элемент
m3: loop m2 ; послевыхода из цикла в ах максимальный элемент в данной строке
mov max[di],al ; кладем максимальныйэлемент в массив max
inc di
xor si,si ; обнуляемномер столбца
add bx, 10 ; переходим на следующуюстроку
pop cx ; достаем сх
loop m1
…
Структура – это тип данных,состоящий из фиксированного числа элементов разного типа.
Для использования структур в программенеобходимо выполнить три действия:
1. Задать шаблонструктуры. По смыслуэто означает определение нового типа данных (схемы или шаблона), которыйвпоследствии можно использовать для определения переменных этого типа. Памятьпри этом не выделяется, это информация для транслятора о расположении полей иих значению по умолчанию.
Синтаксис описания шаблона структуры:
имя_структуры STRUC
<описаниеполей> ;последовательность директив описания данных dd,dw,db…
имя_структуры ENDS
2. Определитьэкземпляр структуры. Этотэтап подразумевает инициализацию конкретной переменной заранее определенной (спомощью шаблона) структурой. В данном случае транслятору дается указаниевыделить память и присвоить этой области символическое имя.
Описатьструктуру в программе можно только один раз, а определить – любое количествораз.
Определение данных с типом структурыимеет следующий вид:
[имяпеременной] имя_структуры <[список значений]>
3. Организовать обращениек элементам структуры.
Длятого чтобы сослаться в команде на поле некоторой структуры, используетсяследующее выражение:
имя_переменной.имя_поля_структуры,
Фрагментпрограммы. Найти изсписка студентов отличника по всем предметам.
Model small
.586p
Stud struc
Name db 20 dup (‘’)
Phisika db ?
Matem db ?
Stud ends
.data
Bufer Stud <””,’’,’’,’’> ; зарезервировали пустую структуру
S1 Stud <”Ivanov”,’5’,’5’,’5’>
S2 Stud <”Petrov”,’3’,’3’,’3’>
S3 Stud <”Сидоров”,’5’,’2’,’5’>
…
mov bx,offset s1
mov al, [bx].Phisika
cmp al, ‘5’
jne m2
mov al, [bx].Matem
cmp al, ‘5’
jne m2
; нашлиодного из отличников, надо вывести его фамилию
m2: mov al, s2.Phisika ; ищем следующего отличника
mov ah, s2.Matem
cmp ax, ‘55’
jne m3
; нашлиодного из отличников, надо вывести его фамилию
m3: ; ищемследующего отличника
Объединение — тип данных, позволяющий трактоватьодну и ту же область памяти как имеющую разные типы и имена.
Описаниеобъединений в программе напоминает описание структур,то есть сначала описывается шаблон, в котором с помощью директив описанияданных перечисляются имена и типы полей:
имя_объединения UNION
<описаниеполей>
имя_объединения ENDS
Отличие объединений от структурсостоит, в частности, в том, что при определении переменной типа объединенияпамять выделяется в соответствии с размером максимального элемента. Обращение кэлементам объединения происходит по их именам, но при этом нужно, конечно,помнить о том, что все поля в объединении накладываются друг на друга.
Одновременная работа с элементами объединения исключена. В качестве элементовобъединения можно использовать и структуры.
Model small
.586p
st union
stu1 dw ?
stu2 db ?
stu3 dd ?
st ends
.data
q st <> ; пустоеобъединение
z st <12ffh> ; заполнили объединение значением
…
mov q.stu2, al ; впеременную положили содержимое регистра al
mov q.stu3, edx
mov bx, z.stu1
mov dx, offset q.stu1
Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной отодного до нескольких бит. При описании записи для каждого элемента указываетсяего длина в битах и, что необязательно, некоторое значение. Суммарный размерзаписи определяется суммой размеров ее полей и не может быть более 8, 16или 32 бит. Если суммарный размер записи меньше указанных значений, товсе поля записи “прижимаются” к младшим разрядам
Использованиезаписей в программе, так же, как и структур, организуется в три этапа:
1. Описание шаблоназаписи
имя_записиRECORD <описание элементов>
2. Для использования шаблона записи впрограмме необходимо определить переменную с типом данной записи, для чегоприменяется следующая синтаксическая конструкция (рис. 7):
/>
3.Организация работы с записями. Обычные механизмы адресации бессильны, посколькуони работают на уровне байтов, а не отдельных битов.
- каждому имениэлемента записи ассемблер присваивает числовое значение, равное количествусдвигов вправо, которое нужно произвести, для того чтобы этот элемент оказалсяприжатым к началу ячейки памяти;
- размер элементазаписи в битах можно узнать с помощью оператора width;
- оператор mask позволяет локализовать биты нужногоэлемента записи;
- все действия попреобразованию элементов записи производятся с помощью логических команд;
- команда setfield устанавливает значение некоторогополя записи
setfield имя_элемента_записирегистр_ назначение, регистр_источник
- команда getfield осуществляет выборку некоторого полязаписи
getfield имя_элемента_записирегистр_назначение, регистр_ источник
Процедуры. Макрокоманды
Процедура, часто называемая подпрограммой, — этоправильным образом оформленная совокупность команд, которая будучи однократноописана, при необходимости может быть вызвана в любом месте программы.Процедура представляет собой группу команд для решения конкретной подзадачи иобладает средствами получения управления из точки вызова задачи более высокогоуровня и возврата управления в эту точку. В простейшем случае программа можетсостоять из одной процедуры.
Описаниепроцедуры может размещается в любом месте программы, но таким образом чтобы нанее случайным образом не попало управление:
- в началепрограммы, до первой исполняемой команды;
- в конце, послекоманды возвращающей управление операционной системе;
- промежуточныйвариант, тело процедуры располагается внутри другой процедуры или основной программы.В этом случае необходимо предусмотреть обход процедуры командой jmp;
- в другом модуле.
Синтаксисописания процедуры:
Имя_процедурыPROC заголовок
Команды,директивы тело процедуры
[ret] возврат изпроцедуры
[имя_процедуры]ENDP конец процедуры
Вызовпроцедуры осуществляется командой
CALL[модификатор] имя_процедуры
Командаcall передает управление по адресу ссимволическим адресом имя_процедуры, с сохранением в стеке адреса возврата,команды следующей после команды call.
Возвратиз процедуры осуществляется по команде
RET[число]
Командаret считывает адрес возврата из стека изагружает его в регистры cs и ip/eip, возвращая таким образом управление команде,следующей за командой call.Число – необязательный параметр, обозначающий количество элементов, удаляемыхиз стека при возврате из процедуры. Размер элемента зависит от используемоймодели сегментации 32 или 16 разрядной.
Передачааргументов из/в процедуру может осуществляться через регистры, переменные илистек.
Пример.
Model small
.stack 100h
.data
w db 25 dup (?)
.code
vvod proc
mov ah, 0ah
lea dx, w
int 21h
ret
vvod endp
main:
…
Call schet
Call vvod
…
exit:
mov ax,4c00h
int 21h
schet proc
..
ret
schet endp
end main
Макрокоманда является одним из многих механизмов заменытекста программы. С помощью макрокоманды в текст программы можно вставлятьпоследовательности строк и привязывать их к месту вставки.
Макрокомандапредставляет собой строку, содержащую некоторое имя –имя макрокоманды, предназначенное для того, чтобы быть замещенным одной илинесколькими другими строками при трансляции.
Для работы смакрокомандой вначале необходимо задать ее шаблон-описание, так называемоемакроопределение.
Имя_макрокоманды MACRO[список_формальных_аргументов]
<Тело макроопределения>
ENDM
Существует триварианта расположения макроопределений:
- в начале исходного текста программы до сегмента кода иданных с тем, чтобы не ухудшать читабельность программы. В данном случаемакрокоманды будут актуальны только в пределах этой программы;
- в отдельном файле. Для того, чтобы использовать этимакроопределения в других программах, необходимо в начале исходного текста этихпрограмм записать директиву
includeимя_файла
- в макробиблиотеке. Макробиблиотека создается в том случае,когда написанные макросы используются практически во всех программах.Подключается библиотека директивой include. Недостаток этогои предыдущего методов в том, что в исходный текст программы включаютсяабсолютно все макроопределения. Для исправления ситуации можно использоватьдирективу purge, в качестве операндов которойперечисляются макрокоманды, которые не должны включаться в текст программы.
Includemacrobibl.inc ; в исходныйтекст программы будут вставлены строки из macrobibl.inc
Purgeoutstr, exit ; за исключениеммакроопределений outstr, exit
Активизациямакроса осуществляется следующим образом:
Имя_макрокомандысписок_ фактических_ аргументов
Model small
Vivod macro rg
Mov dl, rg
Mov ah, 02h
Int 21h
endm
.data
..
.code
..
vivod al
..
Model small
sravnenie macro rg, met
cmp rg, ‘a’
ja met
add rg, 07h
met: add rg, 30h
endm
.data
..
.code
..
sravnenie al, m1
..
Функционально макроопределения похожина процедуры. Сходство их в том, что и те, и другие достаточно один раз где-тоописать, а затем вызывать их специальным образом. На этом их сходствозаканчивается, и начинаются различия, которые в зависимости от целевойустановки можно рассматривать и как достоинства и как недостатки:
— в отличие от процедуры, текст которой неизменен, макроопределение впроцессе макрогенерации может меняться в соответствии с набором фактическихпараметров. При этом коррекции могут подвергаться как операнды команд, так исами команды. Процедуры в этом отношении объекты менее гибки;
— при каждом вызове макрокоманды ее текст в виде макрорасширения вставляетсяв программу. При вызове процедуры микропроцессор осуществляет передачууправления на начало процедуры, находящейся в некоторой области памяти в одномэкземпляре. Код в этом случае получается более компактным, хотя быстродействиенесколько снижается за счет необходимости осуществления переходов.
Подключение процедур и макросов во внешнемфайле
Внешний файл срасширением inc, а в файле которой используетпроцедуру или макрос присутствуют следующие строки
Model small
Include [NAME].INC
Авызов макросов и процедур как обычно.
Работа с портами ввода вывода
Адресное пространствопамяти в любой микропроцессорной системе семейства х86 делится на пространствоадресов памяти и пространство портов ввода/вывода. Это обусловленоархитектурной реализацией и исторической эволюцией процессоров х86.
Для обращения кпространству ввода/вывода используются команды in, out, ins, outs.
Inрегистр, номер порта – ввод данных из порта в регистр
Outномер порта, регистр – вывод данных из регистра в порт
Ins, Outs — работают с элементами строки памяти.
In ax, 064h ; запись слова в ах из порта 064h
Out 064,al ; запись байта в порт
In ax, dx ; косвенная адресация порта через регистр dx, применяется при использовании 16разрядного адреса порта
Через порты ввода/выводаосуществляется программирование, контроль и отладка работы периферийныхустройств. Зачастую один адрес памяти может служить портом ввода при чтенииданных, и портом вывода при записи.
Распределением адресовуправляет BIOS через регистры конфигурирования чипсета.Обычно для совместимости аппаратного и программного обеспечения распределениеадресов стандартно для любых микропроцессорных систем семейства х86.
ВЫЧИСЛИТЕЛЬНЫЕСИСТЕМЫ
Составлюбой вычислительной системы одинаков: микропроцессор, электронная памятьподсистема ввода-вывода. Эти устройство объединяет системная шина, состоящая изследующих шин: данных, адреса и управления.
Каждыймикропроцессор имеет определенное число элементов памяти, называемыхрегистрами, арифметико-логическое устройство и устройство управления. Регистры используются для временногохранения выполняемой команды, адресов памяти, обрабатываемых данных и другойвнутренней информации МП. В АЛУ производится арифметическая и логическаяобработка данных. Устройство управления реализует временную диаграмму ивырабатывает необходимые управляющие сигналы для внутренней работы МП и связиего с другой аппаратурой через внешние шины МП.
Структурыразличных типов МП могут существенно различаться, однако наиболее важнымипараметрами являются архитектура, адресное пространство памяти, разрядностьшины данных, быстродействие. Архитектуру МП определяет разрядность слова ивнутренней шины данных МП. Первые МП основывалисьна4-разряднойархитектуре. Первые ПЭВМ использовали МП с 8-разрядной архитектурой, асовременные МП основаны на МП с 64- и 32-разрядной архитектурой.
Микропроцессорыиспользуют последовательный принцип выполнения команд, принциппараллельной работы, или конвейерный метод выполнения команд.
Последовательныйпринцип, при котором очередная операция начинается только после выполненияпредыдущей.
Принциппараллельной работы, при которой одновременно с выполнением текущей командыпроизводятся предварительная выборка и хранение последующих команд.
В МПс 32-разрядной архитектурой используется конвейерный метод выполнения команд,при котором несколько внутренних устройств МП работают параллельно, производяодновременно обработку нескольких последовательных команд программы.
Адресноепространство памяти определяется разрядностью адресных регистров и адреснойшины МП. Для выборки команд и обмена данными с памятью МП имеют шину данных,разрядность которой, как правило, совпадает с разрядностью внутренней шиныданных, определяемой архитектурой МП.
Однимиз важных параметров МП является быстродействие, определяемое тактовойчастотой его работы, которая обычно задается внешними синхросигналами.Выполнение простейших команд (например, сложение двух операндов из регистровили пересылка операндов в регистрах МП) требует минимально двух периодов тактовыхимпульсов (для выборки команды и ее выполнения). Более сложные команды требуютдля выполнения до 10—20 периодов тактовых импульсов. Если операнды находятся нев регистрах, а в памяти, дополнительное время расходуется на выборки операндовв регистры и записи результата в память.
Скоростьработы МП определяется не только тактовой частотой, но и набором его команд, ихгибкостью, развитой системой прерываний.
Электроннаяпамять
Содержитоперанды и программу, которую выполняет МП. Используются два типа электронной памяти: постоянныезапоминающие устройства (ПЗУ) и оперативные запоминающие устройства (ОЗУ).
В ПЗУхранится информация, которую ЭВМ может использовать сразу же после включенияпитания. Она включает программы инициализации периферийных микросхем, программыядра ОС и программы обработки прерываний.
Постоянноезапоминающее устройство является энергонезависимой памятью: после выключенияпитания информация в нем сохраняется. Информация в ОЗУ разрушается привыключении питания.
ВОЗУ хранятся оперативные данные и программы, используемые МП. Поэтомумикросхемы ОЗУ по быстродействию должны быть согласованы с МП, а емкость ОЗУ(вместе с ПЗУ) должна приближаться к пределу, определяемому адреснымпространством МП.
Схемыввода-вывода
Связь МП с контроллерамиПУ обычно осуществляется через порты ввода-вывода под непосредственнымуправлением МП или под управлением специализированных контроллеров. Связь МП сПУ производится через стандартизованные интерфейсы ПУ.
Организация ибыстродействие схемы ввода-вывода влияет на быстродействие всей вычислительнойсистемы.
Микропроцессоры
Архитектураоднокристального 16-ти разрядного микропроцессора К1810ВМ86.
Аналог I8086.
Ориентирован напараллельное выполнение выборки и команд, может быть условно разделен на двечасти, работающие асинхронно: устройство сопряжения с магистралью (БИ – интерфейсныйблок) и блок обработки (БО).
Интерфейсный блок обеспечивает формирование20-разрядного физического адреса памяти, выборку команд и операндов из памяти,организацию очередности команд и запоминание результатов выполнения команд впамяти.
БИ состоит из очередикоманд, сегментных регистров, регистра адреса команд, сумматора адреса (SM) и управления машинными циклами.
Устройство сопряженияготово выполнить цикл выборки слова из памяти всякий раз, когда в очередиосвобождаются, по меньшей мере, два байта, БО извлекает из нее коды команд помере необходимости. Очередь организована по принципу «первым пришел — первогообслужили», а шесть ее уровней позволяют удовлетворять запросы БО в кодахкоманд достаточно эффективно, сокращая тем самым до минимума затраты времени МПна ожидание выборки команд из памяти. Выполнение команд происходит в логическойпоследовательности, предписанной программой, поскольку в очереди находятся текоманды, которые хранились в ячейках памяти, непосредственно следующих затекущей командой. При передаче управления в другую ячейку памяти ход выполненияпрограммы нарушается. Устройство сопряжения очищает регистры очереди, выбираеткоманду по адресу перехода, передает ее УО и начинает новое заполнение этихрегистров. При возврате из подпрограммы или из прерывания происходитвосстановление очереди команд, адреса которых автоматически вычисляются в СМА.Если МП необходимо выполнить цикл чтения или записи, то выборка командприостанавливается на время цикла.
Блок обработки предназначен для выполнения операцийпо обработке данных и состоит из блока микропрограммного управления (БМУ), АЛУ,восьми регистров общего назначения (РОН) и регистра флагов (F).
Команды, выбранные БИ изпамяти и записанные в очередь команд, по запросам от БО поступают в БМУ. Этоустройство, содержащее память микрокоманд, декодирует команды и вырабатываетпоследовательность микрокоманд, управляющую процессом обработки. В АЛУвыполняются арифметические и логические операции над 8- и 16-разрядными числамис фиксированной запятой.
Программно-доступнымифункциональными частями МП являются регистры общего назначения (для хранения операндов ирезультатов выполнения команд), сегментные (для хранения базовых адресовтекущих сегментов памяти), адреса команд и регистр флагов.
/>
Функциональноеназначение выводов микропроцессораК1810ВМ86
Вход MN/MX служит длявыбора режима функционирования, который предлагает пользователю выбор состававыходных управляющих сигналов в соответствии со степенью сложностипроектируемой МП-системы.
В минимальном режиме(вывод MN/MX подключен к шине питания), ориентированном на малые вычислительныесистемы, МП выдает сигналы управления обменом с памятью и внешнимиустройствами, а также обеспечивает доступ к системной магистрали по запросупрямого доступа к памяти, используя сигналы HOLD и HLDA.Если вывод MN/MX подключен к шине «Земля» (общий), то МП находится вмаксимальном режиме и может работать в сложных одно- и многопроцессорныхсистемах. При работе в этом режиме изменяются функции ряда выводов МП.
Обозначение выводов
Функциональное назначение выводов
AD0… AD15 16-разрядная двунаправленная мультиплексированная шина адреса/данных A16/S3… A19/S64-х разрядная выходная шина микропроцессора, по которой в такте Т1 передаются 4 старших разряда адреса памяти, а в тактах Т2, Т3, Т4, при выполнении операций обращения к памяти и области ввода/вывода – признаки состояния микропроцессора.
S4, S3 – указывают номер одного из 4 сегментных регистров, который в данном цикле участвует в формировании исполнительного адреса.
S5 – указывает состояние триггера разрешения прерывания
S6 – всегда равен 0.
BHE/S7Выход, 0 на котором в Т1 указывает, что по шине адреса/данных передаются 8-разрядное слово. Сделано для совместимости со старым ПО.
В тактах Т2, Т3, Т4 на этом выходе присутствует S7 – признак состояния МП. Если S7=1 – МП находится в состоянии захвата шин внешним устройством.
RD Чтение, выход, 0 на котором означает, что МП осуществляет чтение из памяти или портов ввода/вывода. RЕАDY Готовность, вход для подачи сигнала окончания цикла работы устройств памяти или ввода/вывода. Используется для синхронизации более медленных памяти или ВУ. INTR Вход маскируемых запросов на прерывание. Наличие запроса на этом входе анализируется в конце выполнения каждой команды TEST Вход, проверяемый по команде WFT NMI Вход немаскируемых запросов на прерывание RESET Вход начальной установки микропроцессора CLK Вход для подачи тактовых импульсов MN/MX Вход для подачи сигнала переключения минимального/максимального режима.Минимальный режим
INTA Подтверждение прерывания, выходной сигнал стробирующий ввод информации в МП из источника прерывания, вызвавшего переход в режим прерывания ALE Строб адреса, выходной сигнал, стробирующий в такте Т1 передачу адресной информации с шин МП AD0… AD15 на другие элементы системы DEN Разрешение обмена данными, выходной сигнал, управляющий выдачей информации из шинных формирователей при выполнении команд чтения/записи. DT/R Ввод/вывод данных, выходной сигнал, указывающий на направление передачи. 1 – МП выдает информацию, 0 – МП принимает данные. M/IO Память/внешнее устройство, выходной сигнал отличающий передачу данных для памяти или для внешнего устройства. WR Запись, выходной сигнал указывающий на то, что МП выдает информацию для записи в память/ВУ. HLDA Разрешение прямого доступа, подтверждение захвата шин МП внешним устройством. HOLD Запрос прямого доступа (захвата шины)Максимальный режим
QS0, QS1 Состояние очереди команд S0… S2Тип цикла обмена, указывает на одну из возможных ситуаций:
000 – признак INTA
001 – ввод информации с ВУ
010 – вывод данных на ВУ
011 – останов
100 – выборка команды
101 – чтение из памяти
110 – запись в память
LOСK Сигнал блокировки, индицирующий, что другое устройство не может занять системную магистраль (запрет на захват системной шины) RQ/GT0, RQ/GT1 Запрос/разрешение доступа к шине
Шинные циклыК1810ВМ86
В максимальном режиме,управляющие сигналы системной шины вырабатываются системным контроллером посигналам состояния процессора. Все сигналы управления (кроме ALE) активны по низкому уровню, что даетвозможность раздельно управлять шиной несколькими устройствами.
Для обращения кустройствам ввода/вывода процессор имеет отдельные инструкции IN и OUT, результатом выполнения которых является формированиешинных сигналов IORD и IOWR. В циклах ввода/вывода используюттолько младшие 16 бит шины адреса, что позволяет адресовать до 64кбайтрегистров ввода/вывода. Адрес устройства задается либо в команде, либо беретсяиз регистра DX.
Циклы обращения к портамотличаются от циклов памяти использованием шины адреса. При обращении к портамлинии адреса А16… А19 всегда содержат 0, а линии А8… А15 содержат старший байтадреса, только при косвенной адресации через регистр DX. При обращении по непосредственному адресу линии А8… А15содержат 0.
Цикл подтвержденияпрерывания аналогичен циклу чтения порта но вместо сигнала IORD, активен сигнал INTA, а состояние шины адреса процессоромв это время не управляется.
САМОСТОЯТЕЛЬНО
Организация системввода-вывода.
Ввод-вывод попрерываниям.
Программныйввод-вывод.
Прямой доступ памяти.
Контроллер прямогодоступа памяти.
Прерывания.
Назначение и типыпрерываний.
Механизм обработкипрограммный прерываний.
Механизм обработкиаппаратных прерываний.
Контроллер прерываний.
Память.
Сегментная организацияпамяти.
Виды памяти. ОЗУ. ПЗУ.
Типы ОЗУ: статическаяпамять, динамическая память.
Типы ПЗУ.
Иерархия памяти.
КЭШ память.
Принципы действия КЭШпамяти.
Организация КЭШпамяти.
Распределениеадресного пространства.
Новые виды памяти.
Построениевычислительных систем.
Организация аппаратапрограммного автомата.
Способы повышенияпроизводительности ЭВМ.
Многомашинные имультипроцессорные ВС.
Мультипрограммные ВС.
Тенденции развития ВСи средств ВТ.
Новые виды памяти.
FeRAM
Ферроэлектрическая память-- Ferroelectric RAM (FeRAM), это энергонезависимый тип памяти, аналогичныйFlash памяти, что означает возможность хранения данных без использования источниковэнергии. Чипы FeRAM имеют маленькую емкость, на уровне килобит, но производство1 Мбит чипов FeRAM уже не за горами, этим занимается компания NEC.
DRDRAMТехнология памяти Rambusосновной архитектурой для изготовления системной памяти персональных компьютеров,в результате чего с 1999 года начнется вытеснение с этого рынка памяти типаSDRAM. Зная возможности Intel, можно с большой долей уверенности сказать, чтотак оно и будет. Специалисты корпорация Intel опробовали различные технологиипамяти типа DRAM, прежде чем остановить свой выбор на технологии Rambus. Intelлицензировала архитектуру RDRAM у компании Rambus, после чего обе фирмы началисовместные разработки по созданию нового типа памяти, получившего наименование DRDRAM(Direct RDRAM). Кстати, компания Rambus выдала лицензии на свою технологиюизготовления памяти семи крупнейшим производителям чипов DRAM и около 15производителям контроллеров. Результатом выбора корпорацией Intel технологииRambus может стать появление более быстрой и более совершенной памяти, котораябудет применятся повсеместно.
DDR SDRAMНовый тип памяти DDRSDRAM (Double Data Rate SDRAM), появился в следствии улучшений архитектурыSDRAM, поэтому другое название этого типа памяти — SDRAM II. Лидерство вразработке этого типа памяти принадлежит корпорации Samsung. В настоящее времямногие крупные производители чипов памяти заявили о намерении продвигать этуархитектуру. Однако, в свете того, что Intel собирается продвигать другуюархитектуру памяти — DRDRAM, будущее DDR SDRAM представляется туманным.
Память типа DDR SDRAMможет передавать и принимать данные по восходящему и нисходящему уровню сигналашины, в отличие от обычной памяти типа SDRAM, которая передает данные только повосходящему уровню сигнала. При этом команды и адреса в DDR SDRAM все равнопередаются по верхнему фронту сигнала. Память типа DDR SDRAM имеет большуюширину полосы пропускания, но только в случае передачи длинных пакетов данных.Максимальная величина ширины полосы пропускания DDR SDRAM может достигать 1.6Гб/сек при частоте шины 100MHz.
Осенью 1998 компанияFujitsu Microelectronics представит первые образцы модулей DIMM, созданных потехнологии DDR SDRAM. Работает эта память на частоте 125 Мгц, с пропускнойспособностью около 200 миллионов операций в секунду, что примерно соответствуетDRDRAM. При всех своих достоинствах, эта технология прекрасно работает снынешними машинами, являясь эволюционным развитием DRAM, в отличие отсовершенно новой технологии Rambus, для которой опять понадобятся новые чипсетысистемных плат и т.д.
ESDRAMEnhanced SDRAM (ESDRAM — улучшенная SDRAM) — более быстрая версия SDRAM, сделанная в соответствии состандартом JEDEC компанией Enhanced Memory Systems (EMS). С точки зрениявремени доступа производительность ESDRAM в два раза выше по сравнению состандартной SDRAM. В большинстве приложений ESDRAM, благодаря более быстромувремени доступа к массиву SDRAM и наличию кэша, обеспечивает даже большуюпроизводительность, чем DDR SDRAM.
Более высокая скоростьработы ESDRAM достигается за счет дополнительных функций, которые используютсяв архитектуре этой памяти. ESDRAM имеет строку кэш-регистров (SRAM), в которыххранятся данные, к которым уже было обращение. Доступ к данным в строке кэшаосуществляется быстрее, чем к ячейкам SDRAM, со скоростью 12 ns, т.к. нетребуется обращаться к данным в строке через адрес в колонке. При этом скоростьработы ячеек ESDRAM составляет 22 ns в отличие от стандартной скорости работыячеек SDRAM, имеющей значения 50 — 60 ns.
При этом стоит заметить,что память ESDRAM полностью совместима со стандартной памятью JEDEC SDRAM науровне компонентов и модулей, по количеству контактов и функциональности. Однако,чтобы использовать все преимущества этого типа памяти, необходимо использоватьспециальный контроллер (чипсет).
Увеличениепроизводительности при использовании ESDRAM достигается за счет применениядвухбанковой архитектуры, которая состоит из массива SDRAM и SRAM строчныхрегистров (кэш). Строчные регистры вместе с быстрым массивом SDRAM обеспечиваютболее быстрый доступ для чтения и записи данных по сравнению со стандартнойSDRAM. ESDRAM может работать в режиме «упреждающего обращения» к массивуSDRAM, в результате следующий цикл записи или чтения может начаться в момент,когда выполнение текущего цикла не завершено. Возможность использовать такойрежим напрямую зависит от центрального процессора, управляющего работойконвейера адресации.
С точки зрения примененияв качестве системной (оперативной) памяти компьютера чипсет VCS-164 (Polaris)компании VLSI Technology поддерживает ESDRAM, правда, этот чипсет рассчитан дляприменения в системах на базе процессора Digital Alpha. ESDRAM полностьюсоответствует спецификации Intel PC-100 SDRAM, и соответственно, совместима счипсетами Intel 440BX и Via Technologies MVP-3.
FCRAMFast CycleRandom Access Memory (FCRAM). Разработчик этого типа памяти — компания Fujitsu. В основу этого типапамяти легла принципиально иная концепция по сравнению с DRAM. Время выполненияцикла соответствует всего 20нс, т.е. в 3-4 раза меньше, чем у нынешних модулейDRAM. Это достигнуто благодаря двум принципиальным моментам. Во-первых, вотличие от современных чипов памяти, где сначала выясняется адрес строки (RAS),а потом, после некоторой задержки, адрес столбца (CAS), где находится нужнаяячейка, в FCRAM мгновенно выясняются обе координаты. Во-вторых, существующаяпамять типа DRAM имеет время выполнения цикла 70нс, из-за того, что послевыполнения каждой операции над ячейкой должна пройти команда сброса. В FCRAM жевстроена цепь автоматического сброса, благодаря чему возможна конвейернаяобработка команд, где следующая команда начинает выполняться еще до окончаниявыполнения предыдущей. Итог — время выполнения цикла — 20нс. В результате мыполучаем очень интересный гибрид. По скорости работы FCRAM более напоминаетSRAM, а по объему — обычную память DRAM.
MRAMMRAM — Magnetic random access memory. Разработчик — компания Toshiba. Уже есть пробный образец основнойструктуры чипа MRAM, воплощающего в себе новую технологию памяти, потенциальноспособную превзойти существующие типы DRAM и по скорости, и по объему, и поэнергопотреблению. Уже этот тестовый образец демонстрирует выдающиесяскоростные качества — цикл чтения занимает всего 6 нс.
Согласно заявлениюкомпании, технология хранения информации в чипе MRAM заключается в созданииэлемента с мелкими частицами платины и кобальта, находящихся между двумямагнитными слоями. Запись и чтение происходят путем изменения магнитнойактивности в контуре.