Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (1186255), страница 90
Текст из файла (страница 90)
В то же время каждый их нихимеет определенную специализацию (некоторые команды "работают"только с определенными регистрами). Например, команды умножения иделения требуют, чтобы один из операндов находился в регистре AXили в регистрах AX и DX (в зависимости от размера операнда), акоманды управления циклом используют регистр CX в качествесчетчика цикла.
Регистры BX и BP очень часто используются какбазовые регистры, а SI и DI - как индексные. Регистр SP обычноуказывает на вершину стека, аппаратно поддерживаемого в I80Х86.458Регистры AX, BX, CX и DX конструктивно устроены так, чтовозможен независимый доступ к их старшей и младшей половинам;можно сказать, что каждый из этих регистров состоит из двух байтовыхрегистров, обозначаемых AH, AL, BH и т.д.
(H - high, старший; L - low,младший):РегистрАккумуляторБазаСчетчикДанныеРазрядыAXСтаршийполурегистрAHМладшийполурегистрALBXCXDX15-0BHCHDH15-8BLCLDL7-0Таким образом, с каждым из этих регистров можно работать как сединым целым, а можно работать и с его "половинками". Например,можно записать слово в AX, а затем считать только часть слова изрегистра AH или заменить только часть в регистре AL и т.д. Такоеустройство регистров позволяет использовать их для работы и счислами, и с символами.Все остальные регистры не делятся на "половинки", поэтомусчитать или записать их содержимое (16 битов) можно только целиком.Сегментные регистры CS, DS, SS и ES не могут быть операндаминикаких команд, кроме команд пересылки и стековых команд.
Этирегистры используются только для сегментирования адресов.459Счетчик команд IP всегда содержит адрес (смещение от началапрограммы) той команды, которая должна быть выполнена следующей(начало программы хранится в регистре CS). Содержимое регистра IPможно изменить только командами перехода.Флаги. Имеется особый регистр флагов.Флаг - это бит,принимающий значение 1 ("флаг установлен"),если выполненонекоторое условие, и значение 0 ("флаг сброшен") в противном случае.В I80Х86 используется 9 флагов, каждому из них присвоеноопределенное имя (ZF, CF и т.д.).
Все они собраны в регистре флагов(каждый флаг - это один из разрядов регистра, часть его разрядов неиспользуется):x|xxOF DF IFTFSFZFx AF x PFx CF151413121187651РазрядыФлагиx1094604320Некоторые флаги являются флагами условий; они автоматическименяются при выполнении команд и фиксируют те или иные свойстваих результата (например, равен ли он нулю).Другие флаги называются флагами состояний; они меняются изпрограммы и оказывают влияние на дальнейшее поведение процессора(например, блокируют прерывания).CFOFZFSFPFAFDFIFTFФлаги условийcarry flag флагПринимает значение 1, если при сложении целыхпереноса чисел появилась единица переноса, не"влезающая" в разрядную сетку, или если привычитании чисел без знака первое из них быломеньше второго. В командах сдвига в CFзаносится бит, вышедший за разрядную сетку.CF фиксирует также особенности командыумножения.overflow флагУстанавливается в 1, если при сложении илиflagперепол- вычитании целых чисел со знаком получилсянениярезультат,помодулюпревосходящийдопустимуювеличину(произошлопереполнение мантиссы и она "залезла" взнаковый разряд).zero flag флагУстанавливается в 1, если результат командынуляоказался равным 0.sign flag флагУстанавливается в 1, если в операции надзнакачислами со знаками получился отрицательныйрезультат.parityфлагРавен 1, если результат очередной командыflagчетности содержит четное количество двоичных единиц.Учитывается обычно только при операцияхввода-вывода.auxiliary флагФиксирует особенности выполнения операцийcarry flag дополнад двоично-десятичными числами.нительногопереносаФлаги состоянийdirection флагУстанавливает направление просмотра строк вflagнаправстроковых командах:при DF=0 строкиленияпросматриваются "вперед" (от начала к концу),при DF=1 - в обратном направлении.interrupt флагПри IF=0 процессор перестает реагировать наflagпрерыва- поступающие к нему прерывания, при IF=1нийблокировка прерываний снимается.trap flag флагПри TF=1 после выполнения каждой командытрассипроцессор делает прерывание (с номером 1), чемровкиможно воспользоваться при отладке программыдля ее трассировки.461Представление данных.
Арифметические операцииЗдесь рассматривается машинное представление целых чисел,строк и адресов.Представление двоично-десятичных чисел,используемых достаточно редко, не рассматривается. Что касаетсявещественных чисел, то в I80Х86 нет команд вещественной арифметики(операции над этими числами реализуются программным путем иливыполняются сопроцессором) и потому нет стандартного представлениявещественных чисел.Кроме того, рассматриваются некоторыеособенности выполнения арифметических операций.Шестнадцатеричные числа записываются с буквой h на конце,двоичные числа - с буквой b (так принято в MASM).Представление целых чисел. В общем случае под целое числоможно отвести любое число байтов, однако система команд I80Х86поддерживает только числа размером в байт и слово и частичноподдерживает числа размером в двойное слово.
Именно эти форматы ибудут рассмотрены.В I80Х86 делается различие между целыми числами без знака(неотрицательными) и со знаком. Это объясняется тем, что в ячейкаходного и того же размера можно представить больший диапазон чиселбез знаков, чем чисел со знаком, и если известно заранее, что некотораячисловая величина является неотрицательной, то выгоднеерассматривать ее как величину без знака, чем как величину со знаком.Целые числа без знака.
Эти числа могут быть представлены в видебайта, слова или двойного слова - в зависимости от их размера. В видебайта представляются целые от 0 до 255 (=28-1), в виде слова - целые от0 до 65535 (=216-1), в виде двойного слова - целые от 0 до 4 294 967 295(=232-1). Числа записываются в двоичной системе счисления, занимаявсе разряды ячейки.Например, число 130 записывается в виде байта 10000010b (82h).Числа размером в слово хранятся в памяти в "перевернутом"виде:младщие (правые) 8 битов числа размещаются в первом байтеслова, а старшие 8 битов - во втором байте (в 16-ричной системе: двеправые цифры - в первом байте, две левые цифры - во втором байте).Например, число 130 (=0082h) в виде слова хранится в памяти так:8200Однако в регистрах числа хранятся в нормальном виде:AX0082AHAL462Перевернутое представление используется и при хранении впамяти целых чисел размером в двойное слово: в первом его байтеразмещаются младшие 8 битов числа, во втором байте - предыдущие 8битов и т.д.
Например, число 12345678h хранится в памяти так:78563412Другими словами, в первом слове двойного слова размещаютсямладшие (правые) 16 битов числа, а во втором слове - старшие 16 битов,причем в каждом из этих двух слов в свою очередь используется"перевернутое" представление.Такое необычное представление чисел объясняется тем, что впервых моделях I80Х86 за раз можно было считать из памяти толькоодин байт и что все арифметические операции над многозначнымичислами начинаются с действий над младшими цифрами, поэтому изпамяти в первую очередь надо считывать младшие цифры, если сразунельзя считать все цифры.
Учитывая это, в первых I80Х86 и сталиразмещать младшие цифры числа перед старшими цифрами, а радипреемственности такое представление чисел сохранили в последующихмоделях I80Х86.Конечно, "перевернутое" представление неудобно для людей,однако при использовании языка ассемблера это неудобство нечувствуется: в MASM все числа записываются в нормальном,неперевернутом виде (см.
ниже).Целые числа со знаком. Эти числа также представляются в видебайта, слова и двойного слова. В виде байта записываются числа от 128 до 127, в виде слова - числа от -32768 до 32767, а в видедвойного слова - числа от -2147483648 до 2147483647. При этом числазаписываются в дополнительном коде: неотрицательное числозаписывается так же, как и число без знака (т.е. в прямом коде), аотрицательное число -x (x>0) представляется как число без знака 28 - x(для байтов), 216 - x (для слов) или 232-x (для двойных слов).Например, дополнительным кодом числа -6 является байт FAh(=256-6), слово FFFAh или двойное слово FFFFFFFAh.
При этом байт10000000b (=80h) трактуется как -128, а не как +128 (слово 8000hпонимается как -32678), поэтому левый бит дополнительного кодавсегда играет роль знакового: для неотрицательных чисел он равен 0,для отрицательных - 1.Числа со знаком размером в слово и двойное слово записываютсяв памяти в "перевернутом" виде (при этом знаковый бит оказывается впоследнем байте ячейки). Но в MASM эти числа, как и беззнаковые,записываются в нормальной форме.Иногда число-байт необходимо расширить до слова, т.е.
нужнополучить такое же по величине число,но размером в слово.Существует два способа такого расширения - без знака и со знаком. В463любом случае исходное число-байт попадает во второй (до"переворачивания") байт слова, а вот первый байт заполняется поразному: при расширении без знака в него записываются нулевые биты(12h -> 0012h),а при расширении со знаком в первый байтзаписываются нули, если число-байт было неотрицательным, изаписывается восемь двоичных единиц в противном случае (81h ->FF81h).
Другими словами, при расширении со знаком в первом байтеслова копируется знаковый разряд числа-байта.Аналогично происходит расширение числа-слова до двойногослова.Особенности выполнения арифметических операций. В I80Х86имеются команды сложения и вычитания целых чисел размером в словои байт. Специальных команд для сложения и вычитания двойных словнет, эти операции реализуются через команды сложения и вычитанияслов. Сложение и вычитание беззнаковаых чисел производится помодулю 28 для байтов и 216 для слов. Это означает, что если врезультате сложения появилась единица переноса, не вмещающаяся вразрядную сетку, то она отбрасывается. Например, при сложении байтов128 и 130 получается число 258 = 100000010b, поэтому левая двоичнаяединица отбрасывается и остается число 2 = 10b, которое и объявляетсярезультатом сложения.Ошибка здесь не фиксируется, но в флаг переноса CFзаписывается 1 (если переноса не было, в CF заносится 0).