Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
16
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.3.5. Префиксные байты

Префиксы (табл. 2.25), имеющие разрядность один байт, оказывают влияние на выпол­нение команды, которой они предшествуют. Таким образом, они являются дополнительны­ми программными средствами, управляющими работой процессора.

Префикс SEG определяет выбор сегмента CS, DS, ES, FS, GS или SS для адресации операнда в выполняемой команде. При отсутствии этого префикса сегмент выбирается по умолчанию согласно табл. 2.8. Префикс действует, если команда выбирает операнд из па­мяти; в противном случае он не учитывается.

Префиксы AS, OS позволяют при выполнении последующей команды изменять разряд­ность адреса и операнда в соответствии с табл. 2.14.

Префикс блокировки LOCK, который используется для организации работы мультипро­цессорных систем, вызывает установку на выходе LOCK# процессора низкого потенциала, запрещающего другим устройствам системы (процессорам) обращаться к системной шине в течение времени выполнения последующей команды. Префикс LOCK может предшествовать только командам ADD, XADD, ADC, SUB, SBB, AND, OR, XOR, DEC, INC, NEG, NOT, ВТ, ВТС, BTR, BTS, CMPXCHG и XCHG. Использование префикса LOCK перед другими командами вызовет прерывание с номером Ne = 6 (#UD - неразрешенный код операции).

Префиксы повторения REP, REPE/REPZ и REPNE/REPNZ применяются только с ко­мандами операций над строками. Префикс REP используется с командами INS, OUTS, MOVS и STOS и вызывает их повторение до тех пор, пока содержимое регистра ЕСХ (или СХ)>0. С командами CMPS и SCAS используются префиксы REPE или REPNE. Префикс REPE (возможная форма REPZ) обеспечивает повторение команды до тех пор, пока значение признака ZF = 0, т. е. поступают одинаковые символы. При поступлении различных операндов устанавливается значение ZF = 1, и выполнение команды прекра­щается. Если все операнды в строках одинаковы, то команда выполняется до получения ЕСХ(СХ) = 0, т. е. до конца строки. Префикс REPNE (возможная форма REPNZ) вызывает повторение команды, пока значение признака ZF = 0 (сравниваемые символы не одина­ковы). Выполнение команды прекращается либо при поступлении одинаковых символов, когда устанавливается ZF = 1, либо при получении ЕСХ (СХ) = 0 (конец строки), если в строке отсутствуют одинаковые признаки.

2.4. Система команд: операции над числами с плавающей точкой

К данному классу относятся команды, которые осуществляют операции над веществен­ными, целыми и двоично-десятичными числами, представленными в формате с плаваю­щей точкой. Такое представление позволяет значительно расширить диапазон обрабаты­ваемых чисел. Ниже дается перечень команд над данными с плавающей точкой, разбитых на функциональные группы. Мнемокод каждой команды начинается с префикса F (float-плавающий). Для команд, оперирующих с целыми числами, за буквой F идет буква I, с дво­ично-десятичными числами - буква В.

Пересылка данных

FLD - Загрузка вещественного числа

FILD - Загрузка целого числа

FBLD - Загрузка двоично-десятичного числа

FST - Запись в память вещественного числа

FIST —Запись в память целого числа

FSTP - Запись в память вещественного числа с выталкиванием из стека

FISTP - Запись в память целого числа с выталкиванием из стека

FBSTP — Запись в память двоично-десятичного числа с выталкиванием из стека

FCMOVcc- Условная пересылка данных между регистрами FPU

FXCH - Обмен данными между регистрами стека Г

FLDZ Загрузка нуля + 0.0

FLD1 - Загрузка единицы + 1.0

FLDPI - Загрузка р (пи)

FLDL2T - Загрузка Iog210 (основание log = 2) FLDL2E-Загрузка Iog2e (основание log = 2) FLDLG2 - Загрузка Ig 2 (основание log =10)

FLDLN2 - Загрузка In 2 (основание log = e)

Арифметические операции

FADD - Сложение вещественных чисел

FADDP - Сложение вещественных чисел с выталкиванием из стека FIADD-Сложение целых чисел

FSUB-Вычитание вещественных чисел

FSUBP - Вычитание вещественных чисел с выталкиванием из стека FSUBR- Обратное вычитание вещественных чисел

FSUBRP - Обратное вычитание вещественных чисел с выталкиванием из стека

FISUB - Вычитание целых чисел

FISUBR-Обратное вычитание целых чисел

FMUL-Умножение вещественных чисел

FMULP - Умножение вещественных чисел с выталкиванием из стека

FIMUL-Умножение целых чисел FDIV-Деление вещественных чисел

FDIVP-Деление вещественных чисел с выталкиванием из стека

FDIVR-Обратное деление вещественных чисел

FDIVRP - Обратное деление вещественных чисел с выталкиванием из стека

FIDIV-Деление целых чисел

FIDIVR- Обратное деление целых чисел

FPREM - Нахождение частичного остатка от деления

FPREM1 - Нахождение частичного остатка в стандарте IEEE 754

FSQRT-Вычисление квадратного корня

FABS - Получение абсолютного значения . FCHS-Изменение знака числа

Операции сравнения

FCOM - Сравнение вещественных чисел

FCOMP - Сравнение вещественных чисел с выталкиванием из стека

FCOMPP - Сравнение вещественных чисел с двойным выталкиванием из стека

FCOMI - Сравнение вещественных чисел

FCOMIP -Сравнение вещественных чисел

FICOM - Сравнение целых чисел

FICOMP - Сравнение целых чисел с выталкиванием из стека

FUCOM - Сравнение неупорядоченных чисел

FUCOMP - Сравнение неупорядоченных чисел с выталкиванием из стека

FUCOMPP - Сравнение неупорядоченных чисел с двойным выталкиванием из стека

FUCOMI -Сравнение неупорядоченных чисел с установкой признаков в регистре EFLAGS

FUCOMIP-Сравнение неупорядоченных чисел с установкой признаков в регистре EFLAGS

и выталкиванием из стека

FTST - Сравнение с нулем

FXAM-Анализ вещественного числа

Рис. 2.16. Форматы представления чисел, обрабатываемых блоком FPU

Двоично-десятичные целые числа в формате ДД (рис. 2.16, г) представляются в упа­кованной форме и содержат 18 тетрад, каждая из которых соответствует одному деся­тичному разряду. Для представления знака S используется старший разряд старшего байта (бит 79), в остальных разрядах этого байта устанавливается нулевое значение. Таким образом, формат ДД обеспечивает представление целых чисел в диапазоне ±1018. Неопределенность в этом формате представляется числом 1111 1111 1111 1111 хх... хх, в котором два старших байта содержат единицу во всех разрядах, а все остальные разряды (восемь младших байтов) имеют произвольное значение ох.

Вещественные числа в каждом из трех форматов их представления ОТ, ДТ, Р. (рис. 2.16, д-ж) содержат три поля: поле знака S (старший бит числа), поле порядка и поле мантиссы. Веще­ственные числа одинарной точности (формат ОТ, 32-разрядные операнды) имеют 23-разрядную мантиссу и 8-разрядный порядок; числа двойной точности (формат ДТ, 64-разрядные операнды) имеют 52-разрядную мантиссу и 21 -разрядный порядок; числа расши­ренной точности (формат РТ, 80-разрядные операнды) имеют 64-разрядную мантиссу и 15-разрядный порядок. Двоичное число без знака Е, содержащееся в поле порядка, указы­вает смещенный порядок. Истинный порядок числа будет равен (Е-Р), где Р - смещение, величина которого зависит от формата: Р = 127 для ОТ, Р = 1023 для ДТ, Р = 16383 для РТ. Мантисса записывается в нормализованном виде (за исключением особых случаев): 1 ,ххх...х. При этом стоящая перед точкой единица в форматах ОТ, ДТ не указывается в поле мантис­сы. В формате РТэта единица содержится в старшем разряде мантиссы: тбЗ = 1. .

Таким образом, значения вещественных чисел X определяются выражениями:

X = (-1) S х (1. m22 m21...mO) x 2 Е-127-для формата ОТ; X = (-1) S х (1. гп52 m51 ...тО) х 2 Е-1023 - для формата ДТ; X = (-1) S х (т63.т62 тО) х2 Е-16383-для формата РТ;

где S-знак мантиссы;...mlmO - разряды мантиссы.

Использование смещенного порядка Е позволяет упростить операцию сравнения веще­ственных чисел. При этом в большинстве случаев достаточно сравнить значения Е. Диапа­зон представляемых вещественных чисел составляет:

±10 ±38 –для формата ОТ, ±10 ±308-для формата ДТ, ± 10 ±4932 - для формата РТ.

Следует отметить, что диапазон чисел, представляемых в форматах ОТ, ДТ, вполне достаточен для решения практически любых задач. Поэтому данные, поступающие на обработку в FPU, обычно представлены в этих форматах. Однако в процессе обработки чисел FPU использует формат РТ, позволяющий избежать потери точности результата при многократном выполнении операций над вещественными числами.

Различные форматы представления вещественных чисел даны в табл. 2.26. Числа с ну­левым значением мантиссы и максимальным порядком отведены для представления бес­конечных значений. При этом различаются значения +L и - L, которые связаны соотношени­ем +L> - L (афинная арифметика). Для нуля так же введены два значения:+0 и - 0. При выполнении операций знак нуля устанавливается согласно правилам формирования знаков при соответствующих операциях, например: +X/+L = +0, +Х/ - L = - 0 и т. д.

В табл. 2.26 указаны максимальные (±Мах) и минимальные (±Min) десятичные значения представляемых вещественных чисел. При получении результатов, превышающих максималь­ное положительное число (+Мах), или меньших минимального отрицательного числа (- Min) в регистре FPSR устанавливается флаг переполнения ОЕ = 1. В этом случае либо реализуется прерывание, либо результатом операции является бесконечность (+L или - L). Если получен­ный результат меньше положительного минимального нормализованного числа (+Min) или больше отрицательного максимального нормализованного числа (- Мах), то в регистре FPSR уста­навливается флаг антипереполнения UE = 1. В таком случае FPU может перейти к обработке денормализованных чисел. При этом диапазон представления чисел расширяется в сторону нуля, и точность вычислений увеличивается. На рис. 2.17 показано размещение представляе­мых вещественных чисел на числовой оси и условия формирования признаков ОЕ, UE.

Специальные коды введены для представления нечисловых операндов NAN (Not-A-Number, не числа). Эти коды (см. табл. 2.26) имеют единичные значения всех разрядов порядка и произвольные значения знака и мантиссы (за исключением нулевого значения мантиссы, используемого для представления бесконечности). Различаются два типа не­ чисел: SNAN, имеющие нулевое значение старшего (после точки) разряда мантиссы; QNAN, имеющие единичное значение старшего разряда.

He-числа, выбираемые из памяти в качестве операндов FPU, определяются как SNAN. Если не число является результатом выполняемой операции FPU (например, извлечение квадратного корня из отрицательного числа, команда SQRT), то оно будет иметь тип QNAN. Отметим, что неопределенность является частным случаем не числа QNAN.

В табл. 2.26 представлены все форматы чисел, поддерживаемые процессором. Одна­ко существует множество чисел, не вошедших в эти форматы. В формате РТ к ним относят­ся: ненормализованные числа, имеющие ненулевое значение порядка и мантиссу с нуле­вым значением старшего разряда; псевдоненормализованные числа, имеющие нулевой порядок и мантиссу с единичным значением старшего разряда; ncesfloNAN и псевдобес­конечность, имеющие единичные значения всех разрядов порядка и мантиссу с нулевым значением старшего разряда. Такие варианты представления чисел называются неподдерживаемыми (unsupported) формами, так как их появление вызывает прерывание работы процессора.

При описании команд FPU выбираемые из памяти вещественные числа обозначаются символами m32real (число в формате ОТ), m64real (число в формате ДТ), mSOreal (число в формате РТ). Для обозначения целых чисел используются символы ml 6int (число в фор­мате ЦС), m32int (число в формате КЦ), m32 int (число в формате ДЦ). Двоично-десятичные числа обозначаются символом mSObcd.

. 2.4.2. ВЫПОЛНЕНИЕ ОПЕРАЦИЙ

Описанные в предыдущем разделе форматы применяются для представления целых, двоично-десятичных и вещественных чисел в памяти. При обработке чисел в FPU исполь­зуется только расширенный формат РТ. При вводе в FPU числа, представленные в форматах ЦС, КЦ, ДЦ, ДД, ОТ, ДТ, преобразуются в формат РТ. При записи результата из FPU в память производится, в случае необходимости, обратное преобразование.

Команды FPU имеют общий формат, показанный на рис. 2.11. При выполнении операций в качестве одного из операндов всегда используется содержимое ST(0) - регистра данных FPU, являющегося вершиной стека. Физический номер этого регистра определяется полем ТОР в регистре состояния FPSR (см. рис. 2.4), содержимое которого изменяется при вы­полнении ряда команд. Таким образом осуществляется заполнение или освобождение регистров арифметического стека. Второй операнд при выполнении двухоперандных ко­манд FPU выбирается из памяти или из i-ro регистра данных ST(i), входящего в состав арифметического стека.

Форматы команд FPU показаны на рис. 2.18. Каждая из этих команд начинается 5-бито­вым полем ESC =11011, поля ОРС определяют выбор одной из возможных операций FPU. При обращениях к памяти возможно использование всех способов адресации. При этом после байта MODR/M могут следовать байт SIB, обеспечивающей масштабирование адреса, байты d8, d16 или d32, задающие необходимое смещение DISP (см. рис. 2.18, а). При регистровой адресации (MOD =11) поле R/M задает адрес i арифметического регистра ST(i), из которого выбирается операнд (см. рис. 2.18, б). В качестве i используется не физи­ческий номер регистра, а его номер относительно вершины стека.

При выполнении операций FPU контролирует точность представления чисел и производит в случае необходимости округление результата. Эти процедуры осуществля­ются в соответствии со значениями полей PC, RC в регистре управления FPCR.

Значение поля PC (см. табл. 2.2) определяет точность результатов арифметических операций над вещественными числами: сложения, вычитания, умножения деления, извлече­ния квадратного корня (команды FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR, FSQRT). На результаты других операций FPU значение поля PC не влияет. При PC = 11 результат представляется с обычной для FPU расширенной точностью (64 значащих разряда мантис­сы), которая обеспечивается используемым форматом РТ. При PC = 00 или 10, реализуется одинарная (23 значащих разряда мантиссы) или двойная (52 значащих разряда мантиссы) точность представления чисел. В этом случае при получении результатов с более высокой точностью производится их округление. Значение PC = 01 не используется (резервировано).

Значение поля RC определяет способ округления результата операций FPU до заданной точности (см. табл. 2.1). При RC = 00 реализуется обычный способ округления. При RC = 01 или 10 выполняется округление в сторону меньших или больших чисел. При RC = 11 осуществ­ляется обнуление лишних разрядов мантиссы. Поле RC влияет на результаты арифметических операций (кроме операций, определяемых командами FPREM, FPREMI, FXTRACT, FABS, FCHS), операций вычисления трансцендентных функций и операций передачи, выполняемых по ко­мандам FST, FSTP, FIST.

При выполнении операций FPU контролируется шесть видов ошибок:

  1. #1 - недействительная операция;

  2. #D - поступление денормализованного операнда;

  3. #Z-деление на нуль;

  4. #О - переполнение;

  5. #U - антипереполнение;

  6. #Р - неточный результат.

При обнаружении ошибки устанавливается единичное значение соответствующего при­знака IE, DE, ZE, ОЕ, UE, РЕ в регистре состояний FPSR. В регистре управления FPCR содержатся маски этих ошибок IM, DM, ZM, ОМ, UM, РМ: при нулевом значении маски соот­ветствующая ошибка вызовет прерывание программы (исключение), при единичном зна­чении маски процессор продолжает выполнение программы.

Признак неточного результата РЕ = 1 устанавливается, если результат операции не мо­жет быть точно представлен в заданном командой формате. Если установлена маска РМ = 1, то процессор продолжает программу без прерывания. В этом случае производится округление результата в соответствии со значением поля RC в регистре FPCR (см. рис. 2.6).

Признак антипереполнения UE = 1 устанавливается, если результат слишком мал для представления нормализованным числом, т. е. меньше значений +Min для положительных или больше значений - Мах для отрицательных нормализованных чисел (см. табл. 2.26). Если установлена маска UM = 1, то процессор продолжает программу без прерывания, а результат представляется денормализованным числом.

Признак деления на нуль ZE = 1 устанавливается, когда делимое является конечным числом, отличным от нуля, а делитель равен нулю. Если установлена маска ZM = 1, то выполнение программы продолжается без прерывания, в качестве результата деления вы­дается код бесконечности. Знак результата определяется в зависимости от знаков операндов в соответствии с правилами деления.

Признак денормализованного операнда DE = 1 устанавливается, если денормализован хотя бы один из операндов. Если установлена маска DM =1, то процессор оперирует с де­нормализованным операндом, как с нормализованным.

Признак недействительной операции 1Е=1 устанавливается при извлечении содержимого из пустого регистра или загрузки в заполненный регистр, выполнении действий с не числами SNaN, QNaN, извлечении квадратного корня из отрицательного числа, делении L/L и ряде других операций, указанных в табл. 2.27. Если установлена маска IM = 1, то выполне­ние программы продолжается без прерывания, а результат недействительной операции определяется согласно табл. 2.27.

При выполнении операций FPU контролируется переполнение или антипереполнение ариф­метического стека. Переполнение фиксируется, если команда пытается произвести загрузку в заполненный регистр стека. При этом в регистре FPSR устанавливаются признак SF = 1 и бит условия С1 = 1. Антипереполнение фиксируется, если команда пытается считать опе­ранд из пустого регистра стека. В этом случае устанавливаются значения SF = 1 и С1 = 0. Значение SF = 1 указывает на выполнение недействительной операции и вызывает установ­ку признака 1Е=1. Если флаг IE маскирован (IM = 1), то результатом операций, вызвавших переполнение или антипереполнение стека, будет загрузка или считывание не числа QNAN.

Если хотя бы один из признаков IE, DE, ZE, OE, UE, РЕ установлен в состояние «1» и не маскирован, то общий признак ошибки устанавливается в состояние ES = 1 и формируется сигнал ошибки FERR# = 0 на внешнем выводе процессора. Если в регистре управления CRO установлено значение бита NE = 1, то в этом случае непосредственно перед следую­щей командой FPU реализуется исключение типа #MF («ошибка FPU»).

При значении NE = 0 процедура обработки прерывания вызывается командой INTn, формируемой внешним контроллером прерываний. Получив сигнал FERR#=0, этот контроллер должен подать сигнал IGNNE# = 1 на соответствующий вход процессора. Дан­ный сигнал вызывает остановку процессора непосредственно перед следующей командой FPU или WAIT. Эта остановка продолжается до поступления от контроллера прерываний команды INTn. Если на входе IGNNE# поддерживается состояние «О», то процессор продолжает выполнение программы, игнорируя ошибки FPU.

Процедуры обслуживания исключений, вызываемых FPU, могут использовать для вы­явления причины ошибок содержимое регистров FIP и FDP - указателей команд и данных, которое выводится из процессора с помощью команд управления FSTENV, FSAVE. В регистр FIP заносится адрес текущей команды FPU и 11 разрядов ее кода (два первых байта без кода ESC), если эта команда не входит в группу команд управления. Если команда выбирает операнд из памяти, то в регистр FDP заносится адрес операнда, в противном случае разряды регистра устанавливаются в неопределенное состояние. Когда выполнение команды вы­зывает немаскированное прерывание вследствие возникновения какой-либо из вышеука­занных ошибок, регистры FIP и FDP содержат информацию об этой команде и операнде, которая может быть использована для анализа причин ошибки. Так как команды управления не изменяют содержимое FIP и FDP, то процедура обработки ошибок FPU с помощью этих команд может выбирать содержимое FIP, FDP для проведения такого анализа.

Необходимо отметить влияние битов ЕМ, TS, МР регистра управления CRO на выполне­ние команд FPU и WAIT/FWAIT. При TS = 1 или ЕМ = 1 поступление команд FPU вызовет исключение типа #NMFPU недоступен»). Команда WAIT/FWAIT вызывает это исключение только при TS = МР = 1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]