Реферат: Программная модель процессоров семейства 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 cx

pop 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/S6

4-х разрядная выходная шина микропроцессора, по которой в такте Т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, для которой опять понадобятся новые чипсетысистемных плат и т.д.

ESDRAM

Enhanced 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.

FCRAM

Fast CycleRandom Access Memory (FCRAM). Разработчик этого типа памяти — компания Fujitsu. В основу этого типапамяти легла принципиально иная концепция по сравнению с DRAM. Время выполненияцикла соответствует всего 20нс, т.е. в 3-4 раза меньше, чем у нынешних модулейDRAM. Это достигнуто благодаря двум принципиальным моментам. Во-первых, вотличие от современных чипов памяти, где сначала выясняется адрес строки (RAS),а потом, после некоторой задержки, адрес столбца (CAS), где находится нужнаяячейка, в FCRAM мгновенно выясняются обе координаты. Во-вторых, существующаяпамять типа DRAM имеет время выполнения цикла 70нс, из-за того, что послевыполнения каждой операции над ячейкой должна пройти команда сброса. В FCRAM жевстроена цепь автоматического сброса, благодаря чему возможна конвейернаяобработка команд, где следующая команда начинает выполняться еще до окончаниявыполнения предыдущей. Итог — время выполнения цикла — 20нс. В результате мыполучаем очень интересный гибрид. По скорости работы FCRAM более напоминаетSRAM, а по объему — обычную память DRAM.

MRAM

MRAM — Magnetic random access memory. Разработчик — компания Toshiba. Уже есть пробный образец основнойструктуры чипа MRAM, воплощающего в себе новую технологию памяти, потенциальноспособную превзойти существующие типы DRAM и по скорости, и по объему, и поэнергопотреблению. Уже этот тестовый образец демонстрирует выдающиесяскоростные качества — цикл чтения занимает всего 6 нс.

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

еще рефераты
Еще работы по информатике, программированию