2.3 Арифметические команды
Форматы знаковых и беззнаковых чисел на Ассемблере
Таблица
Тип |
Беззнаковое |
Размер |
Знаковое |
Размер |
DB |
|
028-1 (0255) |
|
-2728-1 (-128127) |
DW |
|
0216-1 (065535) |
|
-215215-1 (-3276832767) |
DD |
|
0232-1 |
|
-232232-1 |
Для беззнаковых чисел вся разрядная сетка формата отводится под биты данных, а для знаковых чисел разрядная сетка формата занимает все биты, кроме крайнего левого - знакового бита.
2.3.1 Команды сложения и вычитания
Команды ADDиSUBне делают разницы между знаковыми и беззнаковыми числами, они просто складывают и вычитают биты по законам двоичной арифметики.
|
Беззнаковое |
Знаковое |
11111001 |
249 |
-7 |
00000010 |
2 |
+2 |
11111011 |
251 |
-5 |
Двоичное представление результата сложения одинаково для беззнакового и знакового числа. Однако интерпретация беззнаковых и знаковых чисел различна.
Практический интерес представляют ситуации переноса и переполнения при сложении и вычитании, учет которых позволит корректно завершать арифметические команды. Выявление неправильных результатов выполняется путем анализа комбинаций бит регистра флагов СF(переноса/заема),OF(переполнения).
Знаковые числа
Для знаковых чисел ситуация переносавозникает в случае, когда имеется перенос в знаковый разряд.Состояние переполнениявозникает в случае, когда перенос в знаковый разряд не создает переноса из разрядной сетки или перенос из разрядной сетки происходит без переноса в знаковый разряд.
Таким образом, OF=1 является достоверным признаком некорректного результата при работе со знаковыми числами.
Беззнаковые числа
Для беззнаковых чисел ситуация переноса/заемавозникает в случае, когда возникает перенос/заем из разрядной сетки.Состояние переполнениявозникает, если при сложении беззнаковых чисел возникает перенос.
Таким образом, CF=1 является достоверным признаком некорректного результата на беззнаковых числах для командADD,ADC.
|
Беззнаковое |
Знаковое |
CF |
OF |
11111100 |
252 |
-4 |
|
|
00000101 |
5 |
+5 |
|
|
00000001 |
1 |
1 |
1 |
0 |
|
(неправильно) |
|
| |
|
|
| ||
01111001 |
121 |
+121 |
|
|
00001011 |
11 |
+11 |
|
|
10000100 |
132 |
-124 |
0 |
1 |
|
(неправильно) |
|
| |
|
|
| ||
11110110 |
246 |
-10 |
|
|
10001001 |
137 |
-119 |
|
|
01111111 |
127 |
+127 |
1 |
1 |
|
(неправильно) (неправильно) |
|
|