Материалы сайта
Это интересно
Информатика и Ассемблер
ГЛАВА 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. По назначению и способу использования регистры можно разделить на следующие группы.РОН (
сегментные регистры (
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]+a16001 [BX]+[DI] [BX]+[DI]+a8 [BX]+[DI]+a16010 [BP]+[SI] [BP]+[SI]+a8 [BP]+[SI]+a16011 [BP]+[DI] [BP]+[DI]+a8 [BP]+[DI]+a16100 [SI] [SI]+a8 [SI]+a16101 [DI] [DI]+a8 [DI]+a16110 a16 [BP]+a8 [BP]+a16111 [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. Смысл всех полей - тот же, что и в предыдущих форматах.
Уже из рассмотренных форматов команд видно, что записывать машинные команды ПК в цифровом виде - вещь чрезвычайно неприятная. Сложности возникают и при записи данных, например, знаковые числа приходится представлять в дополнительном коде, а затем еще и «переворачивать». Поэтому нужен какой-то иной, более удобный способ записи команд и данных. И таким способом является язык ассемблера.