Непонятное поведение флага CF
Допустим есть часть кода:
mov al, 12
mov bl, 4
sub al, bl
При этом флаг CF = 0, но по-моему должен быть равным 1, поскольку операция вычитания реализована на операции сложения и процессор не знает что мы даем ему на вход, будь-то числа знаковые или беззнаковые, он просто выполняет свою работу.
То есть код выше эквивалентен следующему:
Занести в регистр al значение 12, то есть 0000 1100
Занести в регистр bl значение 4, то есть 0000 0100
Далее идет операция вычитание, поскольку первый операнд положительный, то преобразований в дополнительный код нету. Поскольку второй тоже положительный, то тоже преобразований нету, но поскольку выполняется операция вычитания, то второй операнд переводится в дополнительный код и процессор выполняет операцию сложения (вычитание реализовано сложением), то есть:
12: 0000 1100 -4: 1111 1100 12 - 4 = 12 + (-4) = 0000 1100 + 1111 1100 = 1 0000 1000
То есть, результат мы получили верный - 8, но CF = 0, если продебажить. Почему так? Единичка, что вышла за разрядную сетку помещается в CF, но CF = 0.
Ответы (1 шт):
Не стоит мудрить и усложнять.
Результат правильный и вполне логичный.
Флаг CF выставляется в случае переполнения при сложении, либо заёма при вычитании, при этом рассматривать операцию надо естественным интуитивным способом, как делается в математике.
Рассмотрим сложение:
al = 12
bl = 4
result = 16
max(al) = 255 - максимум для регистра
Если бы результат сложения был бы больше 255, то флаг был бы поднят.
Если при вычитании бы было так:
al = 4
bl = 12
Потребовался бы заём, соответственно, флаг переноса был бы установлен в 1.
На интуитивном уровне схема такая:
- не выходят ли разряды за разрядную сетку при сложении
- достаточно ли единиц у уменьшаемого при вычитании