Учебное пособие для иностранных студентов (1110580), страница 3
Текст из файла (страница 3)
Ответ: число без знака 185;
число со знаком -71.
П.4. Арифметические операции (сложение и вычитание).
В этом пункте мы рассмотрим, как выполняются сложение и вычитание для чисел без знака и для чисел со знаком.
Рассмотрим сначала байты - числа без знака. Поскольку биты являются двоичными цифрами чисел, для выполнения сложения и вычитания можно применить обычные алгоритмы вычисления в столбик.
Пример 1. 120 + 43
120 = 011110002, 43 = 001010112
....
01111000 (120)
+00101011 (43)
10100011 (163)
Пример 2. 120 - 43
....
01111000 (120)
-00101011 (43)
10100011 (77).
Однако, надо иметь в виду следующее: из-за того, что мы работаем только с восемью разрядами, при выполнении операции может получиться неверный результат. Следующие примеры показывают, как это может произойти.
Пример 3. 200 + 60
.....
11001000 (200)
+00111100 (60)
100000100 (4).
не уместилась в байте.
При сложении чисел 200 и 60 произошел выход за разрядную сетку. Поскольку мы располагаем только восемью разрядами, в ответе имеем число 4; коэффициент при 28 = 256, получившийся в результате переноса, потерялся. Вспомним, что в виде чисел без знака представимы числа из диапазона [0, 255]. Число 260 = 200 + 60 не принадлежит допустимому диапазону, что и привело к неверному результату сложения.
Пример 4. 10 - 20
.... .
00001010 (10)
-00010100 (20)
11110110 (246).
При выполнении вычитания приходится делать заём из несуществующего разряда. В итоге получается неправильный ответ. Правильный результат -10 = 10 - 20 не принадлежит представимому диапазону, следовательно, вычитание не может выполниться корректно.
Рассмотрим теперь байты - числа со знаком. Используемое нами представление (для отрицательных чисел - в дополнительном коде) позволяет применять обычные алгоритмы вычисления в столбик.
Обозначим P(a) - представление числа a (a[-128,127]). Пусть x и y - числа из интервала [-128, 127]. Пусть надо вычислить x + y (или x - y ), то есть получить представление P(x + y) ( или P(x - y) ) для числа x + y (x - y соответственно).
Напомним, что
P(a) = a mod 256.
Воспользуемся известным соотношением
( a b ) mod c = ( a mod c b mod c ) mod c.
Если число x + y (число x - y) представимо в виде числа со знаком (принадлежит отрезку [-128, 127]), его представление можно получить, выполнив соответствующую арифметическую операцию над представлениями чисел x и y :
P(xy) = (xy) mod 256 = (x mod 256 y mod 256 ) = ( P(x) P(y) ) mod 256.
Взятие результата по модулю 28 обозначает тот факт, что вычисления производятся с использованием восьми разрядов, лишние возникающие цифры (или заём из несуществующего разряда) не учитываются.
Примеры.
Пример 1. Вычислить 110 + (-3)
......
01101110 (110)
+11111101 (-3)
101101011 (107).
Пример 2. Вычислить 20 - (-103)
..... ..
00010100 (20)
-10011001 (-103)
01111011 (123).
При выполнении вычитания мы вынуждены сделать заем из несуществующего разряда, что не отразилось на правильности результата, так как вычисления производятся по модулю 256.
Следующий пример показывает, как вычисление может дать неверный результат.
Пример 3. Вычислить 110+110
.. ...
01101110 (110)
+01101110 (110)
11011100 (-36).
Поскольку результат сложения 220 нельзя представить как число со знаком, в результате сложения получился неверный ответ. (Если считать, что мы работаем с числами без знака, ошибки не происходит. Рассматривая байт 11011100 как число без знака, имеем 110111002 = 220)
Замечание: Подчеркнём, что существование алгоритмов сложения и вычитания, применимых как к числам без знака, так и к числам со знаком, вытекает из использования представления чисел в дополнительном коде.
Для выполнения умножения и деления приходится применять различные алгоритмы для чисел без знака и для чисел со знаком.
П.5 Арифметические флаги.
В §2 при обсуждении устройства процессора мы говорили, что ЦП содержит регистр СС – слово-состояние процессора. Регистр СС включает в себя биты, которые называются флагами. Есть четыре флага, отвечающих за арифметические операции (арифметические флаги). Некоторые флаги сигнализируют об ошибке при выполнении арифметической операции. Если ошибки нет, они устанавливаются в 0, если ошибка есть – в 1. Флаги имеют названия:
CF – carry flag (флаг переноса)
OF – overflow flag (флаг переполнения)
SF – sign flag (флаг знака)
ZF – zero flag (флаг нуля).
Флаги имеют следующий смысл.
CF: Отвечает за работу с числами без знака. Он устанавливается в 1, если в результате выполнения операции с числами без знака получился результат, не представимый как число без знака (то есть не принадлежащий интервалу [0, 255]).
OF: Отвечает за работу с числами со знаком. Он устанавливается в 1, если в результате выполнения операции с числами со знаком получился результат, не представимый как число со знаком (то есть не принадлежащий интервалу [-128, 127]).
SF: Отвечает за работу с числами со знаком. Устанавливается в 1, если в результате выполнения арифметической операции со знаковыми числами получилось отрицательное число, и в 0 – в противном случае. Если результат был вычислен неверно (OF = 1), SF неверно указывает его знак (противоречит знаку результата); если правильный результат положительный, то SF равен 1, если правильный результат отрицательный, то SF равен 0.
ZF: Устанавливается в 1, если результат по модулю 256 равен 0, и ZF=0 в противном случае. Этот флаг используется при работе с числами без знака и при работе с числами со знаком.
Процессор использует следующие правила при установлении значений флагов.
Флаг CF | CF=1, | при выполнении сложения произошёл перенос за разрядную сетку; |
CF=0, | в противном случае | |
CF=1, | при выполнении вычитания был сделан заём из-за разрядной сетки; | |
CF=0, | в противном случае | |
Флаг OF | OF=1, | при выполнении сложения перенос в знаковый разряд не совпадает с переносом из знакового разряда (за разрядную сетку); |
OF=0, | переносы совпадают | |
OF=1 | при выполнении вычитания заём из знакового разряда не совпадает с заёмом в знаковый разряд (из-за разрядной сетки); | |
OF=0 | заёмы совпадают | |
Флаг SF | совпадает со знаковым разрядом результата | |
Флаг ZF | ZF=1, | все разряды результата равны 0; |
ZF=0, | в противном случае |
Примеры. Определить, какие значения получат арифметические флаги в результате выполнения следующих операций.
Пример 1. 200 + (-20).
CF: CF отвечает за работу с беззнаковыми числами. Следовательно, надо записать этот пример так, чтобы оба операнда были числами без знака. Числу -20 соответствует код 256-20 = 236. Пример будет выглядеть так: 200+236 = 436. 436[0,255], следовательно, CF=1.
OF: OF отвечает за работу со знаковыми числами. Нам надо записать пример так, чтобы оба операнда были числами со знаком. Числу 200 соответствует число
-(256-200)= -56. (200 является дополнительным кодом для числа -56). Итак, пример запишется так: -56+(-20) = -76. Число -76 принадлежит интервалу
[-128,127], следовательно, OF=0.
SF: OF=0 и результат -76 – отрицательный, значит, SF=1.
ZF: -760, следовательно, ZF=0.
Пример 2. (-100) + 150.
CF: Перепишем пример так, чтобы операнды были числами без знака:
156+150 = 306 > 255 , следовательно, CF=1.
OF: Перепишем пример так, чтобы операнды были числами со знаком:
(-100) + (-106) = -206 < -128, следовательно, OF=1.
SF: OF=1, -206<0, следовательно, SF=0 (противоречит знаку правильного результата).
ZF: ZF=0.
Пример 3. 128 + 128.
CF: 128 + 128 = 256 > 255 , значит, CF=1.
OF: (-128) + (-128) = -256 < -128, значит, OF=1.
SF: OF=1, -256<0, следовательно, SF=0.
ZF: 256 mod 256 = 0, значит, ZF=1.
Замечание. В последующих примерах для краткости будем использовать шестнадцатиричную систему вместо двоичной при записи содержимого байта. В этом случае байт запишется в виде двух шестнадцатиричных цифр, каждая цифра изображает четыре двоичных разряда.
016 – 00002 | 416 – 01002 | 816 – 10002 | C16 – 1210 – 11002 |
116 – 00012 | 516 – 01012 | 916 – 10012 | D16 – 1310 – 11012 |
216 – 00102 | 616 – 01102 | A16 – 1010 – 10102 | E16 – 1410 – 11102 |
316 – 00112 | 716 – 01112 | B16 – 1110 – 10112 | F16 – 1510 – 11112 |
Пример 4. 6A16 - D616
CF: | . . . 01101010 -11010110 10010100 | Поскольку был произведен заем из-за разрядной сетки в старший разряд, CF=1 |
OF: | . . . 01101010 -11010110 10010100 | Заём в старший разряд есть, а заёма из старшего разряда нет, следовательно, OF=1 |
SF: | SF=1, совпадает со старшим разрядом результата | |
ZF: | ZF=0, в результирующем байте есть биты, равные 1 |
Пример 5. 7516 + 5C16
CF: | . .... 0 1110101 +0 1011100 1 1010001 | Нет переноса за разрядную сетку, CF=10 |
OF: | ..... 0 1110101 +0 1011100 1 1010001 | Перенос в старший разряд есть, переноса из старшего разряда нет, значит, OF=1 |
SF: | SF=1 | |
ZF: | ZF=0 |
Пример 6. B716 - CC16
CF=1 | .. . 10110111 -11001100 11101011 | |
OF=0 | .. . 10110111 -11001100 11101011 | Были сделаны заём из старшего разряда и заём в старший разряд из-за разрядной сетки |
SF=1 | ||
ZF=0 |
Пример 8. 8016 + 8016
CF=1 | . 10000000 +10000000 100000000 | |
OF=1 | . 10000000 +10000000 100000000 | |
SF=0, | совпадает со старшим разрядом результата. Единица вышла за разрядную сетку, не попала в результат. | |
ZF=1, | все биты результата равны 0 |
§4. Учебные машины.
Ранее мы рассмотрели общие принципы построения ЭВМ. В данном параграфе мы разберем 4 учебные вычислительные машины. Эти машины называются учебными, потому что они не существуют на самом деле. Однако они помогут нам представить работу реальных ЭВМ, разобрать некоторые проблемы, возникающие при построении ЭВМ, и способы решения этих проблем.
Для записи содержимого ячеек будем пользоваться шестнадцатиричными цифрами.
П.1. Учебная трехадресная машина УМ-3.
1. Структура процессора.