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

Узнать больше...

Главная страница Шпаргалки
Решение задач Эксклюзивные фото по химии
Сочинения (более 4000) Юмор из жизни учащихся
Вернуться в раздел "Учебные материалы"

Информатика и Ассемблер

ГЛАВА 1. ОСНОВНЫЕ ОСОБЕННОСТИ АРХИТЕКТУРЫ ПК.

1.1. Краткие сведения об ОП.

ОП ПК делится на ячейки размером 8 разрядов. Такие ячейки называются байтами (byte). Разряды в нем нумеруются справа налево от 0 до 7

байт

7

6

5

4

3

2

1

0

 

 

В каждом разряде может быть записана величина 1 или 0, которую называют битом (bit). Значение ,бита определяется 2n по принципам двоичной системы. Правые разряды байта - младшие, левые - старшие. Байт - наименьшая адресуемая ячейка памяти. Кроме того имеются ячейки другого размера. Слово (word) - два соседних байта. Размер - 16 разрядов. Нумеруются справа налево от 0 до 15. Адрес байта - адрес его первого байта (с меньшим адресом)

слово с адресом А

А

А+1

15

8

7

0

 

 

Двойное слово (double word) - это четыре соседних байта или 2 слова. Размер - 32 разряда. Нумеруются справа налево от 0 до 31. Адрес - там же.

Двойное слово с адресом А

А

А+1

А+2

А+3

31

24

23

16

15

8

7

0

 

 

1.2. Регистры

1.2.1. Понятие регистра

Для кратковременного хранения и обработки данных в МП предусмотрены специальные ячейки памяти, конструктивно расположенные внутри МП и доступные из программ. Такие ячейки называются регистрами. Доступ к регистрам осуществляется гораздо быстрее, чем к ОП. В 8086 процессоре все регистры имеют разряд слова (16) и каждый имеет имя. В 386 -32. По назначению и способу использования регистры можно разделить на следующие группы.

РОН (AX, BX, CX, DX, SI, DI, BP, SP), в 386 - Е - EAX;

сегментные регистры (CS, DS, SS, ES) в 386 - FS, GS;

регистр флагов.

регистр IP.

1.2.2. Регистры общего назначения

К ним относятся: AX: AH/AL, BX: BH/BL, CX: CH/CL, DX: DH/DL, SI, DI, BP, SP.

AX - (accumulator) аккумулятор, BX - (base) база, CX - (counter) счетчик, DX (data) данные, extended. SI - (source index) индекс источника, DI (destination index), индекс приемника BP (base pointer) указатель базы, SP (stack pointer). РОНы можно использовать в любых арифметических, логических операциях. Однако каждый РОН имеет определенную спецификацию: некоторые команды требуют, чтобы их операнд или операнды находились в определенных регистрах. Делимое - ax,dx.

1.2.3. Сегментные регистры

Сегментные регистры CS, DS, SS и ES (Code, data, stack, extra segments) не могут быть операндами никаких команд, кроме команд пересылки и стековых команд. Эти регистры используются только для сегментирования адресов

1.2.4. Регистр флагов.

В ПК имеется особый регистр флагов. Флаг - это бит, принимающий значение 1 ("флаг установлен"), если выполнено некоторое условие, и значение 0 ("флаг сброшен") в противном случае. В ПК используется 9 флагов, каждому из них присвоено определенное имя (ZF, CF и т.д.). Все они собраны в регистре флагов (каждый флаг - это один из разрядов регистра, часть его разрядов не используется):

Flags

x

x

x

x

x

OF

DF

IF

TF

SF

ZF

AF

x

PF

x

CF

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

Некоторые флаги принято называть флагами условий; они автоматически меняются при выполнении команд и фиксируют те или иные свойства их результата (например, равен ли он нулю). Другие флаги называются флагами состояний; они меняются из программы и оказывают влияние на дальнейшее поведение процессора (например, блокируют прерывания).

Флаги условий:

CF (carry flag) - флаг переноса. Принимает значение 1, если при

сложении целых чисел появилась единица переноса, не "влезающая" в разрядную сетку, или если при вычитании чисел без знака первое из них было меньше второго. В командах сдвига в CF заносится бит, вышедший за

разрядную сетку. CF фиксирует также особенности команды умножения.

OF (overflow flag) - флаг переполнения. Устанавливается в 1, если

при сложении или вычитании целых чисел со знаком получился результат,

по модулю превосходящий допустимую величину (произошло переполнение

мантиссы и она "залезла" в знаковый разряд).

ZF (zero flag) - флаг нуля. Устанавливается в 1, если результат

команды оказался равным 0.

SF (sign flag) - флаг знака. Устанавливается в 1, если в операции

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

PF (parity flag) - флаг четности. Равен 1, если результат очеред-

ной команды содержит четное количество двоичных единиц. Учитывается

обычно только при операциях ввода-вывода.

AF (auxiliary carry flag) - флаг дополнительного переноса. Фикси-

рует особенности выполнения операций над двоично-десятичными числами.

Флаги состояний:

DF (direction flag) - флаг направления. Устанавливает направление

просмотра строк в строковых командах: при DF=0 строки просматриваются

"вперед" (от начала к концу), при DF=1 - в обратном направлении.

IF (interrupt flag) - флаг прерываний. При IF=0 процессор переста-

ет реагировать на поступающие к нему прерывания, при IF=1 блокировка

прерываний снимается.

TF (trap flag) - флаг трассировки. При TF=1 после выполнения каж-

дой команды процессор делает прерывание (с номером 1), чем можно вос-

пользоваться при отладке программы для ее трассировки.

1.2.5. Регистр IP.

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

1.3. Оперативная память ПК.

1.3.1. Представление чисел в памяти ПК.

Система команд процессора ПК поддерживает работу только с числами, размером в байт, слово , двойное слово, то есть с целыми числами, а если число имеет иное количество байтов или имеет иной формат, то все операции над ним надо реализовывать самому программисту. Для начала рассмотрим представление в памяти ПК целых чисел. Имеется различие между целыми числами без знака (неотрицательными) и со знаком. В одинаковых ячейках памяти можно представить больший диапазон беззнаковых чисел, чем чисел со знаком. В байте беззнаковых - 0-255, а неотрицательные числа со знаком 0-127, поэтому, если известно, что число не - то его лучше представить как беззнаковую величину.

Беззнаковые числа. Целые числа без знака записываются в следующие ячейки в следующих диапазонах: байт 0-255, слово - 0-65535, dw - 0-4 2994 967 295. Особенность представления чисел в памяти ПК: в «перевернутом» виде, то есть старшие разряды размещаются во втором байте , а младшие - в первом. Например число 56h если занимает слово то 0056 а в памяти 56/00(А/А+1). Первые процессоры 8разрядные. Но 1234h в памяти 34/12(А/А+1) в регистре - в нормальном виде 12/34(AH/AL). Это контролируют команды пересылки. Аналогично - для dw - число 12345678h хранится в памяти 78/56/34/12(А/А+1/А+2/А+3/).

Числа со знаком. Диапазоны: байт:-127¸+127, слово: -32768¸32767, двойное- -2 147 483 648 ¸2 147 483 647. Записываются в дополнительном коде доп(х)={х при х>=0 и 2k - ½x½ при х<0, для байта доп(0)=0=00000000, доп(1)=1=00000001, доп(2)=2=00000010, доп(127)=127=01111111, доп(-1)=256-1=11111111, доп(-2)=256-2=11111110 доп(-128)=256-1=10000000. Левый бит -роль знакового. Существует двоично-десятичная запись чисел BCD - binary coded decimal. Символы - каждый свой номер. ASCII (American Standard Code for Information Interchange).

1.3.2 Особенности выполнения арифметических опреаций

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

Сложение и вычитание беззнаковаых чисел производится по модулю 28 для байтов и 216 для слов. Это означает, что если в результате сложения появилась единица переноса, не вмещающаяся в разрядную сетку, то она отбрасывается. Например, при сложении байтов 128 и 130 получается число 258 = 100000010b, поэтому левая двоичная единица отбрасывается и остается число 2 = 10b, которое и объявляется результатом сложения. Ошибка здесь не фиксируется, но в флаг переноса CF записывается 1 (если переноса не было, в CF заносится 0). "Поймать" такое искажение суммы можно только последующим анализом флага CF.

Искажение результата происходит и при вычитание из меньшего числа большего. И здесь не фиксируется ошибка, однако первому числу дается "заем единицы" (в случае байтов это число увеличивается на 256, для слов - на 216), после чего и производится вычитание. Например, вычитание байтов 2 и 3 сводится к вычитанию чисел 256+2=258 и 3, в результате чего получается неправильная разность 255 (а не -1). Для того чтобы можно было обнаружить такую ситуацию, в флаг переноса CF заносится 1 (если заема не было, в CF записывается 0).

Сложение и вычитание знаковых целых чисел производится по тем же алгоритмам, что и для беззнаковых чисел (в этом одно из достоинств дополнительного кода): знаковые числа рассматриваются как соответствующие беззнаковые числа, производится операция над этими беззнаковыми числами и полученный результат интерпретируется как знаковое число. Например, сложение байтовых чисел 1 и -2 происходит так: берутся их дополнительные коды 1 и (256-2)=254, вычисляется сумма этих величин 1+254=255 и она трактуется как знаковое число -1 (255=256-1). Если при таком сложении возникла единица переноса, то она, как обычно, отбрасывается, а флаг CF получает значение 1. Однако в данном случае это отсечение не представляет интерес - результат операции будет правильным, например: 3+(-2) => 3+254(mod 256) = 257(mod 256) = 1. Зато здесь возможна иная неприятность: модуль суммы (ее мантисса) может превзойти допустимую границу и "залезть" в знаковый разряд, испортив его. Например, при сложении байтовых чисел 127 и 2 получается величина 129 = 100001001b, представляющая дополнительный код числа -127 (=256-129). Хотя результат здесь получился и неправильным, процессор не фиксирует ошибку, но зато заносит 1 в флаг переполнения OF (если "переполнения мантиссы" не было, в OF записывается 0). Анализируя затем этот флаг, можно "поймать" такую ошибку.

Таким образом, сложение (вычитание) знаковых и беззнаковых чисел производится по одному и тому же алгоритму. При этом ПК не "знает", какие числа (со знаком или без) он складывает; в любом случае он складывает их как беззнаковые числа и в любом случае формирует флаги CF и OF. А вот как интерпретировать слагаемые и сумму, на какой из этих флагов обращать внимание - это личное дело автора программы.

Что касается умножения и деления знаковых и беззнаковых чисел, то они выполняются по разным алгоритмам, разными машинными командами. Однако и у этих операций есть ряд особенностей. При умножении байтов(слов) первый сомножитель обязан находиться в регистре AL (AX), результатом же умножения является слово (двойное слово), которое заносится в регистр AX (регистры DX и AX). Тем самым при умножении сохраняются все цифры произведения. При делении байтов (слов) первый операнд (делимое) должен быть словом (двойным словом) и обязан находиться в регистре AX (регистрах DX и AX). Результатом деления являются две величины размером в байт (слово) - неполное частное (div) и остаток от деления (mod); неполное частное записывается в регистр AL (AX), а остаток - в регистр AH (DX).

1.3.2. Сегментирование адресов в ПК

В ПК ради сокращения размера команд используется базирование адресов. Что это? В ЭВМ, память которой имеет 2k ячеек для ссылок на них должны быть к - разрядные адреса. Их называют абсолютными или физическими (для 8086). Неудобно когда k>числа разрядов процессора. Память ПК условно делится на участки, которые названы сегментами. Начальные адреса сегментов могут быть любыми и для 8086 ограничены 64 Кб, для 386 - все 4Гб. Тогда абсолютный адрес можно представить в виде суммы А=В+ofs. Где В - база сегмента, к которому относится ячейка А, а ofs - смещение (offset) или относительный адрес ячейки, то есть ее адрес, отсчитанный от начала сегмента, то есть базы. По принципам 16+8=18. В качестве сегментных регистров - CS, DS, SS, ES. Например командой mov можно пересылать мov ax,bx, mov si,di, mov es,ax, mov ax,188. Нельзя mov cs,ax. В память - mov ax, es:x адрес х - по регистру es. Адрес сегмента умножается на 16 (10Н). Если адрес базы - 12340Н, то в сегментном регистре будет хранится 1234Н. Если ES=1234Н то адресная пара ES:53Н задает абсолютный адрес 16*1234Н+53Н=10Н*1234Н=12340Н+53Н=12387Н. Адрес начала сегмента всегда кратен 16.

1.3.3. Стек

Стек - хранилище со следующим принципом работы. Элемент, записанный в стек последним, считывается из него первым. В ПК для стека можно отвести любую область памяти, но к ней - требования как к сегменту - не более 64к и адрес - кратен 16. Нервый элемент - в ячейку с наибольшим адресом. Начало - фиксировано(низ). А верх -SP. Push ax, pop es, pushf, popf, pusha, popa.

Представление команд процессора

1.4.1. Общие сведения

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

Команды ПК могут иметь от 0 до 3 операндов. Размер операндов - байт или слово (редко - двойное слово). Операнд может быть указан в самой команде (это так называемый непосредственный операнд), либо может находится в одном из регистров ПК и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом указывается адрес этой ячейки. Некоторые команды требуют, чтобы их операнд находился в фиксированном месте (например, в регистре AX), и тогда операнд явно не указывается в команде. Результат выполнения команды помещается в регистр или ячейку памяти, откуда берется один из операндов. Например, большинство команд с двумя операндами реализуют действие op := op1 * op2,

где op1 - регистр или ячейка памяти, а op2 - непосредственный операнд, регистр или ячейка памяти, а * - операция, заданная КОПом.

1.4.2. Модификация адресов

Адрес операнда разрешено модифицировать по одному или двум регистрам. В первом случае в качестве регистра-модификатора разрешено использовать регистр BX, BP, SI или DI (и никакой иной). Во втором случае один из модификаторов обязан быть регистром BX или BP, а другой -регистром SI или DI; одновременная модификация по BX и BP или SI и DI недопустима. Регистры BX и BP обычно используются для хранения базы (начального адреса) некоторого участка памяти (скажем, массива) и потому называются базовыми регистрами, а регистры SI и DI часто содержат индексы элементов массива и потому называются индексными регистрами.

Однако такое распределение ролей необязательно, и, например, в SI может находиться база массива, а в BX - индекс элемента массива.

В ASM адреса в командах записываются в виде одной из следующих конструкции:

A, A[M] или A[M1][M2],

где A - адрес, M - регистр BX, BP, SI или DI, M1 - регистр BX или BP, а M2 - регистр SI или DI. Во второрм и третьем варианте A может отсутствовать, в этом случае считается, что A=0.

При выполнении команды процессор прежде всего вычисляет т.н. исполнительный (эффективный) адрес - как сумму адреса, заданного в команде, и текущих значений указанных регистров-модификаторов, причем все эти величины рассматриваются как неотрицательные и суммирование ведется по модулю 216 ([r] означает содержимое регистра r):

A : Aисп = A

A[M] : Aисп = A+[M] (mod 216)

A[M1][M2]: Aисп = A+[M1]+[M2] (mod 216)

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

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

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

1.5.1. Формат «регистр - регистр»

Формат «регистр - регистр» (2 байта):

КОП

d

w

 

7 2 1 0

11

reg1

reg2

 

7 6 5 3 2 0

Команды этого формата описывают обычно действие reg1:=reg1*reg2 или reg2:=reg2*reg1, где reg1 и reg2 - регистры общего назначения. Поле КОП первого байта указывает на операцию (*), которую надо выполнить. Бит w определяет размер операндов, а бит d указывает, в какой из двух регистров записывается результат:

ì 1- слова ì 1 - reg1:=reg1*reg2

w = í d = í

î 0 - байты î 0 - reg2:=reg2*reg1

Во втором байте два левых бита фиксированы (для данного формата), а трех-битовые поля reg1 и reg2 указывают на регистры, учавствующие в операции, согласно следующей таблице:

reg w=1 w=0 reg w=1 w=0

000 AX AL 100 SP AH

001 CX CL 101 BP CH

010 DX DL 110 SI DH

011 BX BL 111 DI BH

 

1.5.2. Формат «регистр - память»

Формат «регистр - память» (2-4 байта) :

КОП

d

w

mod

reg

mem

adr(0-2 байта)

7 2 1 0

7 6 5 3 2 0

7 0

 

Эти команды описывают операции reg:=reg*adr или adr:=adr*reg, где reg - регистр, а adr - адрес ячейки памяти. Бит w первого байта определяет размер операндов, а бит d указывает, куда записывается результат: в регистр (d=1) или в ячейку памяти (d=0). Трехбитовое поле reg второго байта указывает операнд - регистр, двухбитовое поле mod определяет, сколько байтов в команде занимает операнд - адрес (00 - 0 байтов, 01 - 1 байт, 10 - 2 байта), а трехбитовое поле mem указывает способ модификации этого адреса. В следующей таблице указаны правила вычисления исполнительного адреса в зависимости от значений полей mod и mem (a8 - адрес размером в байт, a16 - размером в слово, [r] - содержимое регистра r):

mem \ mod 00 01 10

000 [BX]+[SI] [BX]+[SI]+a8 [BX]+[SI]+a16

001 [BX]+[DI] [BX]+[DI]+a8 [BX]+[DI]+a16

010 [BP]+[SI] [BP]+[SI]+a8 [BP]+[SI]+a16

011 [BP]+[DI] [BP]+[DI]+a8 [BP]+[DI]+a16

100 [SI] [SI]+a8 [SI]+a16

101 [DI] [DI]+a8 [DI]+a16

110 a16 [BP]+a8 [BP]+a16

111 [BX] [BX]+a8 [BX]+a16

 

Замечания. Если в команде не задан адрес, то он считается нулевым. Если адрес задан в виде байта (a8), то он автоматически расширяется до слова (а16). Случай mod=00 и mem=110 указывает на отсутствие регистров - модификаторов, причем адрес должен иметь размер слова. Случай mod=11 соответствует формату «регистр - регистр».

1.5.3. Формат «регистр - непосредственный операнд»

Формат «регистр - непосредственный операнд» (3-4 байта):

КОП

s

w

11

КОП’

reg

im(1- 2 байта)

 

Команды этого формата описывают операции reg:=reg*im (im - непосредственный операнд). Бит w указывает на размер операндов, а поле reg - на регистр - операнд. Поле КОП в первом байтеопределяет лишь группу операций, в которую входит операция данной команды, уточняет же операцию поле КОП’ из второго байта. Непосредственный операнд может занимать 1 или 2 байта (в зависимости от значения бита w), при этом операнд размером в слово записывается в команде в «перевернутом» виде. Ради экономии памяти в ПК предусмотрен случай, когда в операции над словами непосредственный операнд может быть задан байтом (на это указывает 1 в бите s при w=1), и тогда перед выполнением операции байт автоматически расширяется до слова.

1.5.4. Формат «память - непосредственный операнд»

Формат «память - непосредственный операнд» (3-6 байтов):

КОП

s

w

11

КОП’

mem

adr(0- 2 байта)

im(1-2 байта)

Команды этого формата описывают операции типа adr:=adr*im. Смысл всех полей - тот же, что и в предыдущих форматах.

Уже из рассмотренных форматов команд видно, что записывать машинные команды ПК в цифровом виде - вещь чрезвычайно неприятная. Сложности возникают и при записи данных, например, знаковые числа приходится представлять в дополнительном коде, а затем еще и «переворачивать». Поэтому нужен какой-то иной, более удобный способ записи команд и данных. И таким способом является язык ассемблера.

 

 

Вы находитесь на сайте Xenoid v2.0:
если вам нужно быстро, подробно и недорого
решить контрольную - обращайтесь. Возможны консультации
онлайн. См. раздел "Решение задач".

 

 

 

Copyright © 2005-2013 Xenoid v2.0

Использование материалов сайта возможно при условии указания активной ссылки
Химия: решение задач