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

КТП / 7,8 Представление отрицательных чисел, организация операции вычитания, сравнение однобайтных чисел

.doc
Скачиваний:
21
Добавлен:
11.04.2015
Размер:
78.85 Кб
Скачать

7 Представление отрицательных чисел, организация операции вычитания, сравнение однобайтных чисел

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

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

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.