Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы / Мышев А.В. (ч.1)

.pdf
Скачиваний:
37
Добавлен:
11.06.2015
Размер:
864.53 Кб
Скачать

Хбл= (М 2n ) × 2 П.

X бл+ = (М + 2n ) × 2 П.

Определим значение разности между соседними представимыми числами:

= ХблХ = 2n ×2П ,

+ = X бл+ Х = +2n × 2 П.

Значения ∆− и ∆+ равны по абсолютной величине и показывают абсолютную ошибку (погрешность) представления чисел. Обозначим ее через ∆:

= 2n × 2 П.

Ввычислениях важнее относительная ошибка δ, равная

δ =

=

2n ×2П

=

2

n

.

Х

М ×2

П

М

 

 

 

 

Чтобы получить максимальное значениеδ, необходимо взять минимальную мантиссу, т.е. 1/2:

δмакс = 2n = 2n+1.

12

Полученное выражение показывает, что количество битов мантиссы (или длина мантиссы) определяет ошибку представления чисел. Рассмотрим несколько примеров:

n = 24

δмакс = 223

(107 )

n =32

δмакс = 231

(109 )

n =56

δмакс = 255

(1016 )

n =64

δмакс = 263

(1019 )

Про относительную ошибку 10N говорят, что числа представимы с точностью до N-го десятичного разряда или точность представления чисел составляет N десятичных разрядов (цифр), поэто-

31

му, например, длина мантиссы n=56 соответствует точности представления чисел до 16-го десятичного разряда.

Для формата с плавающей точкой из выражения для абсолют-

ной ошибки ∆ = 2n ×2П следует, что величина ∆ зависит от порядка числа и при изменении порядка на единицу изменяется вдвое, но отношение ∆ к числу остается примерно постоянным. Таким образом, представимые числа «сгущаются» в области малых значений и «разрежаются» в области больших значений (рис. 1.16). Количество представимых чисел между соседними целыми степенями двух одно и то же, например, между 1/4 и 1/2 находится столько же представимых чисел, сколько между 4 и 8, между 16384 и 32768 и т. д. Объясняется это просто: при фиксированном порядке количество представимых чисел определяется длиной мантиссы п и равно

2n 1 (с учетом нормализации).

Рис. 1.16. Расположение на числовой оси чисел с плавающей точкой

В рассматриваемом формате имеется одно особое число – ноль. Оно представляется нулями во всех разрядах и называется истинным (или ненормализованным) нулем. В отличие от него иногда вводится так называемый машинный (или нормализованный) ноль, под которым понимается минимальное представимое число Хмин. Машинный ноль может быть положительным и отрицательным.

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

Получение результата, который больше максимального представимого числа Хмакс, называется переполнением или переполнением порядка (порядок результата больше 0.11...11). При возникновении переполнения продолжение программы не имеет смысла, поэтому в процессоре генерируется внутреннее прерывание, и опе-

32

рационная система прекращает выполнение программы, выдавая сообщение о переполнении.

Если результат операции оказывается меньше минимального представимого числа Хмин, возникает особый случай антипереполнения или исчезновения порядка (порядок результата меньше 1.11...

11). Особый случай антипереполнения не является столь катастрофическим, как переполнение. В большинстве компьютеров при возникновении антипереполнения как результата операции возвращается истинный или машинный ноль.

В некоторых операциях, например, сложение или вычитание, как результат операции может получиться число, мантисса которого равна нулю. Очевидно, независимо от значения порядка такое число равно нулю (его иногда называют псевдонулем). Такая ситуация называется потерей значимости и естественная реакция на ее возникновение – возвращение результата, равного истинному или машинному нулю.

ГЛАВА 2. ОПЕРАЦИИ НАД ЦЕЛЫМИ ЧИСЛАМИ

2.1.Арифметические флажки

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

1.Флажок переноса, обозначаемый С, СУ (CarrY) и СF (Саггу Flag), фиксирует цифру переноса из старшего бита при сложении чисел, т.е. он представляет собой расширение результата на один бит влево. В операции вычитания флажок переноса превращается во флажок заема (borrow) и устанавливается в 1, когда уменьшаемое меньше вычитаемого при интерпретации операндов как целых беззнаковых чисел. Очевидно, состояние флажка переноса при сложении беззнаковых чисел можно считать признаком переполнения: 0 – переполнения нет, 1 – возникло переполнение. При сложе-

33

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

2.Флажок вспомогательного или дополнительного переноса,

обозначаемый А (Auxiliary – дополнительный) или АF, показывает при сложении перенос, а при вычитании – заем из младшей тетрады (т.е. бита 3) результата. Применение этого флажка, недоступного программисту, ограничено командами десятичной арифметики.

3.Флажок нуля, обозначаемый Z (Zero) и ZF, своим состоянием показывает получение нулевого или ненулевого результата операции: Z=0 – результат не равен нулю, Z=1 – получен нулевой результат.

4.Флажок знака обозначается S (Sing), SF и N (Negative – отри-

цательный) и своим состоянием повторяет значение старшего бита результата. Поскольку в дополнительном коде старший бит является знаковым, то S=0, если получен положительный результат, и S=1, если результат операции отрицательный.

5.Флажок переполнения обозначается О, OV (ОVerflow – пере-

полнение) или ОF. В операциях сложения и вычитания знаковых чисел этот флажок показывает, находится ли результат внутри диапазона представимых чисел: V=0 – результат правильный, переполнения нет, V=1 – возникло переполнение. Флажок переполнения относится только к операциям над знаковыми числами. Кроме операций сложения и вычитания флажок переполнения действует и в операции деления, показывая, что частное слишком велико для отведенного ему места. В операции умножения состояние V=1 означает, что старшая половина произведения содержит значащие разряды.

2.2.Сложение

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

34

дополнительного кода заключается в том, что операнды команды ADD можно интерпретировать и как целые знаковые числа – результат будет правильным (конечно, с учетом возможного переполнения). Различие между формами представления операндов приводит к различной интерпретации состояний флажков. Покажем это на примерах, используя операнды длиной в один байт.

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

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

Из примера видно, что в системе команд весьма желательно иметь команду, которая не только суммирует операнды, но и прибавляет в младший бит значение флажка переноса (0 или 1). Такая команда есть во всех микропроцессорах, она называется сложением с переносом и обычно имеет мнемонику ADC (Аdd with Саггу). Ее очень удобно использовать в программном цикле сложения длинных операндов, обеспечив, чтобы при сложении младших частей флажок переноса находился в состоянии 0. Команда АDС воздействует на арифметические флажки точно так же, как и команда АDD.

35

Пример 2.1

Пример 2.2. Сложить, операнды 11001000 01110101 11101111 и 00010010 11111111 11001011.

Начинается сложение с младших байтов:

флажок С=1 Суммируются средние байты с учетом единицы переноса: перенос от

сложения младших байтов

флажок С=1

36

Наконец суммируются старшие байты чисел: перенос от сложения младших байтов

флажок С=0

Получен результат 11011011 01110101 10111010, флажок переноса находится в состоянии 0.

К командам сложения обычно относят и однооперандную команду инкремента (INCrement) с мнемоникой INC или INR, осуществляющую увеличение значения своего единственного операнда на 1. Отличительная особенность этой команды заключается в том, что она воздействует на все арифметические флажки, за исключением флажка переноса, который при ее выполнении сохраняет свое текущее состояние. Объясняется эта особенность тем, что наиболее часто команда инкремента применяется для модификации указателей памяти, и значение переноса здесь не играет никакой роли.

2.3.Вычитание

Всистемах команд всех микропроцессоров есть двухоперандная команда вычитания с мнемоникой SUВ (SUBtгасt), в которой определяются уменьшаемое и вычитаемое, а разность обычно помещается на место уменьшаемого. Операнды этой команды, как и операнды команды сложения, можно интерпретировать как целые беззнаковые или знаковые числа при условии представления знаковых чисел в дополнительном коде. Команда вычитания воздействует на все арифметические флажки, причем флажок переноса становится флажком заема.

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

37

да вычитаемого. Рассмотрим действие команды вычитания на нескольких примерах.

Пример 2.3

а). Уменьшаемое равно 0101 0111, вычитаемое равно 0100 1000. Обычное вычитание:

Дополнительный код вычитаемого равен 1011 ,1000. Сложение его с уменьшаемым дает

б). Уменьшаемое равно 0111 0111, вычитаемое равно 1011 0101. Дополнительный код вычитаемого равен 0100 1011 и при сложении его с уменьшаемым получим

При интерпретации операндов как целых беззнаковых чисел возник заем (119<181), а если операнды считать знаковыми числами, возникло переполнение.

в). Уменьшаемое равно 1000 1111, вычитаемое равно 1111 1111. Дополнительный код вычитаемого равен 0000 0001. Сложив его с уменьшаемым, получим

38

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

Пример 2.4. Уменьшаемое равно 11001000 01110101 11101111, а вы-

читаемое 00010010 11111111 11001011. Сначала производится традиционное вычитание:

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

Вычитаются средние байты операндов; дополнительный код среднего байта вычитаемого равен 00000001 и при сложении его со средним байтом уменьшаемого имеем

Флажок С будет установлен в 1 и заем необходимо учесть (т.е. вычесть) при вычитании старших байтов операндов. Дополнительный код старшего байта вычитаемого равен 1110110 и сложение его со старшим байтом уменьшаемого дает

Теперь необходимо учесть единицу заема, т.е. вычесть единицу, которая в дополнительном коде имеет вид 11111111:

39

Полученный результат совпадает с разностью, найденной выше прямым вычитанием.

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

Рассмотренное показывает, что для вычитания чисел с длиной, большей длины машинного слова, удобно иметь команду, которая не просто вычитает два числа, но и автоматически учитывает состояние флажка переноса (заема). Такая команда называется вычитанием с заемом и имеет мнемонику SВВ (SuBtract with Borrow). Действие ее описываем следующим образом, полагая, что разность замещает уменьшаемое:

Уменьшаемое← уменьшаемое – вычитаемое – состояние заема

Команду SВВ легко встраивать в программные циклы вычитания. Она воздействует на арифметические флажки так же, как команда вычитания SUВ.

К командам вычитания относится однооперандная команда декремента (DECrement) с мнемоникой DEC и DСК. Она производит уменьшение на единицу значения своего единственного операнда. Команда декремента воздействует на все арифметические флажки, за исключением флажка переноса, сохраняющего текущее состояние. Объясняется эта особенность команды декремента тем, что наиболее часто она применяется для модификации счетчиков циклов и указателей памяти. В таких применениях команды декремента знать значение переноса (возник он или нет) не требуется.

40