Команды сравнения

Программисту часто бывает необходимо организовать сравнение двух чисел, для того чтобы по результату этого сравнения выбрать один из возможных путей продолжения программы. Такое сравнение однобайтных чисел реализуется посредством оценки разности сравниваемых чисел. Командами сравнения CMP r, CMP M и CPI d8 организуется обычное однобайтное арифметическое вычитание (как в командах SUB r, SUB M и SUI d8), устанавливающее все биты признаков. Но в отличие от команд вычитания команды сравнения не сохраняют в аккумуляторе сам результат вычитания, поскольку целью сравнения является показ признаков вычитания. Имея состояния битов переноса CY и нулевого результата Z, и применяя команды условных ветвлений в программе, умеющих оценивать состояния признаков и выбирать пути продолжения программы, программист может воспользоваться результатами сравнения.

Три варианта команд сравнения различаются способом адресации операнда уменьшаемого. Команда CMP r адресует уменьшаемое в регистре r; команда CMP M адресует уменьшаемое в ячейке памяти M, адрес которой будет взят из регистровой пары HL; команда CPI d8 адресует уменьшаемое прямым определением его через байт d8 в составе команды.

Пример1.45

По условиям алгоритма требуется обеспечить переход к метке M1, если байты в регистрах E и C равны, и переход к метке M2, в противном случае.

Метка Мнемокод Комментарий

MOV A,E ; подготовить в A 1-й байт для сравнения из E

CMP C ; выполнить вычитание F(CY,Z)(A)–(C)

JZ M1 ; перейти к M1, если числа равны (Z=1)

JMP M2 ; иначе перейти к M2

……………………………..

M1:

……………………………..

M2:

……………………………..

 

Пример1.46

Требуется сравнить число в регистре D с числом 36h и записать большее в аккумулятор.

Метка Мнемокод Комментарий

MOV A,D ; подготовить в A 1-й байт для сравнения из D

CPI 36h ; выполнить вычитание F(CY,Z)(A)–36h

JC M1 ; к M1, если в результате операции потребовался

;заём, то есть он – отрицательный: (A)<36h

HLT ; иначе, когда останов (A)≥36h

M1: MVI A,36h ; записать 36h в A

HLT ; останов

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