КТП / 7,8 Представление отрицательных чисел, организация операции вычитания, сравнение однобайтных чисел
.doc7 Представление отрицательных чисел, организация операции вычитания, сравнение однобайтных чисел
Отрицательные числа в машинном представлении определяются следующим образом. Весь диапазон двоичных чисел (например, для одного байта) разделяется пополам. "Нижнюю" половину (от нуля до половины диапазона) занимают положительные числа, а оставшуюся "верхнюю" половину занимают отрицательные числа, представленные в так называемом дополнительном коде (дополнительный код = инверсный + единица):
11111111В -1;
11111110В -2;
11111101В -3;
11111100В -4;
..……………………….
10000011В -125;
10000010В -126;
10000001В -127;
10000000В -128;
_____________________
01111111В 127;
01111110В 126;
01111101В 125;
01111100В 124;
………………………...
00000011В 3;
00000010В 2;
00000001В 1;
00000000В 0.
Например, чтобы получить число –125 в двоичном виде, необходимо число 125 в двоичном виде проинвертировать и прибавить 1, т.е.:
125=01111101В; -125=10000010В+1В=10000011В.
Если в ассемблере конкретного микропроцессора не предусмотрена операция вычитания, то один из способов реализации этой операции (назовем его первым способом) как раз и основан на представлении вычитаемого в виде дополнительного кода, т.е. А-В=А+(-В). Например, необходимо решить следующую задачу: (R6)(R5) - (R4). Тогда, в общем виде:
;(R6)(R5) - (R4)
MOV A,R4; (A)(R4)
CPL A; (A)not(A)
INC A; (A)(A)+1
ADD A,R5; (A)(A)+(R5)
MOV R6,A; (R6)(A).
Чтобы убедиться в правильности алгоритма, рассмотрим предыдущий пример с конкретными числами: 8EH - 5FH (8EH - 5FH=2FH).
|
A |
R4 |
R5 |
R6 |
C |
|
00H |
5FH |
8EH |
00H |
0 |
MOV A,R4 |
5FH |
- |
- |
- |
- |
CPL A |
A0H |
- |
- |
- |
- |
INC A |
A1H |
- |
- |
- |
- |
ADD A,R5 |
2FH |
- |
- |
- |
1 |
MOV R6,A |
2FH |
5FH |
8EH |
2FH |
1 |
A0H=not(5FH) или 10100000B=not(01011111B);
A1H=A0H + 01H;
12FH=A1H + 8EH, причем (C)1, (A)2FH.
Следует заметить, что при реализации операции вычитания по первому способу при положительной разности в старшем разряде появляется единица, выходящая за рамки диапазона (в данном случае эта единица попадает в С). При отрицательной же разности результат получается в дополнительном коде (а в С получается ноль). Например, необходимо вычислить 5FH – 8FH.
|
A |
R4 |
R5 |
R6 |
C |
|
00H |
8EH |
5FH |
00H |
0 |
MOV A,R4 |
8EH |
- |
- |
- |
- |
CPL A |
71H |
- |
- |
- |
- |
INC A |
72H |
- |
- |
- |
- |
ADD A,R5 |
D1H |
- |
- |
- |
- |
MOV R6,A |
D1H |
8EH |
5FH |
D1H |
0 |
71H=not(8EH) или 01110001B=not(10001110B);
72H=71H + 01H;
D1H=72H + 5FH.
Таким образом, 5FH – 8FH=D1H. Но если D1H представить как отрицательное число, то получим:
not(D1H)=2EH или not(11010001B)=00101110B;
2FH=2EH+01H.
Т.е. получается D1H= - 2FH или 5FH – 8EH= -2FH.
Еще один способ реализации операции вычитания (назовем его вторым способом) реализует следующий алгоритм А – В=not(A + not(B)). Это эквивалентно (но не равнозначно) А – В= - (A + (- B)). Тогда, решение предыдущей задачи в общем виде по второму способу:
;(R6)(R5) - (R4)
MOV A,R5; (A)(R5)
CPL A; (A)not(A)
ADD A,R4; (A)(A)+(R4)
CPL A; (A)not(A)
MOV R6,A; (R6)(A).
Теперь два примера с конкретными числами: 8EH - 5FH и 5FH – 8EH.
|
A |
R4 |
R5 |
R6 |
C |
|
00H |
5FH |
8EH |
00H |
0 |
MOV A,R5 |
8EH |
- |
- |
- |
- |
CPL A |
71H |
- |
- |
- |
- |
ADD A,R4 |
D0H |
- |
- |
- |
- |
CPL A |
2FH |
- |
- |
- |
- |
MOV R6,A |
2FH |
5FH |
8EH |
2FH |
0 |
71H=not(8EH) или 01110001B=not(10001110B);
D0H=71H + 5FH;
2FH=not(D0H) или 00101111B=not(11010000B).
|
A |
R4 |
R5 |
R6 |
C |
|
00H |
8EH |
5FH |
00H |
0 |
MOV A,R5 |
5FH |
- |
- |
- |
- |
CPL A |
A0H |
- |
- |
- |
- |
ADD A,R4 |
2EH |
- |
- |
- |
1 |
CPL A |
D1H |
- |
- |
- |
- |
MOV R6,A |
D1H |
8EH |
5FH |
D1H |
1 |
A0H=not(5FH) или 10100000B=not(01011111B);
12EH=A0H + 8EH, причем (C)1, (A)2EH
D1H=not(2EH) или 11010001B=not(00101110B).
По второму способу при положительной разности результат получается "чисто", а в С получается ноль. При отрицательной же разности результат получается в дополнительном коде, а в С попадает единица.
Сравнение двух чисел можно произвести путем нахождения разности между первым и вторым числами, например, с помощью второго способа. Если при этом признак переполнения (С)=0, то первое число больше или равно второму, а если (С)=1, то первое меньше второго. Далее по содержимому С можно организовать соответствующее ветвление в программе. Допустим, в аккумулятор требуется записать максимальное значение содержимого одного из двух регистров R4 или R6. Тогда, решение задачи в общем виде:
;(A)max [(R4), (R6)]
MOV A,R4; (A)(R4)
CPL A; (A)not(A)
ADD A,R6; (A)(A)+(R4)
CPL A; (A)not(A) – не обязателен
JNC M1; переход при (C)=0, т.е. когда (R4)>=(R6)
MOV A,R6; иначе, при (C)=1 (A)(R6), т.е. когда (R4)<(R6)
JMP M2; и обход альтернативного действия
M1: MOV A,R4; (A)(R4) при (C)=0, т.е. когда (R4)>=(R6)
M2: NOP; пустой оператор или продолжение программы.
Если само значение разности не нужно, то второй оператор CPL A не обязателен, т.к. он не влияет на содержимое признака С.
Теперь два примера этой же задачи с конкретными числами.
|
A |
R4 |
R6 |
C |
|
00H |
98H |
3CH |
0 |
MOV A,R4 |
98H |
- |
- |
- |
CPL A |
67H |
- |
- |
- |
ADD A,R6 |
A3H |
- |
- |
- |
JNC M1 |
- |
- |
- |
- |
MOV A,R6 |
|
|
|
|
JMP M2 |
|
|
|
|
M1: MOV A,R4 |
98H |
- |
- |
- |
M2: NOP |
98H |
98H |
3CH |
0 |
67H=not(98H) или 01100111B=not(10011000B);
A3H=67H + 3CH, причем (C)=0.
|
A |
R4 |
R6 |
C |
|
00H |
3СH |
98H |
0 |
MOV A,R4 |
3СH |
- |
- |
- |
CPL A |
С3H |
- |
- |
- |
ADD A,R6 |
5BH |
- |
- |
1 |
JNC M1 |
- |
- |
- |
- |
MOV A,R6 |
98H |
- |
- |
1 |
JMP M2 |
- |
- |
- |
- |
M1: MOV A,R4 |
|
|
|
|
M2: NOP |
98H |
3CH |
98H |
1 |
С3H=not(3СH) или 11000011B=not(00111100B);
15BH=С3H + 98H, причем (C)1, (A)5BH.