Я попробовал следующий код в emu 80x86 IDE:
mov al,0h
sub al,1h
В выводе отображается в эмуляторе al=FF
и я это понял, но чего я не понял, так это почему в разделе флагов cf=1
Я попробовал следующий код в emu 80x86 IDE:
mov al,0h
sub al,1h
В выводе отображается в эмуляторе al=FF
и я это понял, но чего я не понял, так это почему в разделе флагов cf=1
Флаг переноса CF
используется, когда ЦП работает с целыми числами без знака (в 8-битных регистрах они могут иметь значение от 00h до FFh).
Когда сложение выполняется и результат превышает максимальное значение FFh, CF
сигнализирует о том, что это произошло, и что число 1 должно быть добавлено в регистр более высокого порядка (ah
).
Когда выполняется вычитание и результат ниже минимального значения 00h, CF
сигнализирует о том, что это произошло и что число 1 должно быть заимствовано (вычтено) из ah
.
В вашем примере кода результат вычитания 1h из 0h в al
ниже допустимого минимального значения, поэтому устанавливается CF.
Параметр cf=1
CPU указывает на потерю значимости при вычитании без знака.
Если рассматривать эти числа как целые числа со знаком, их допустимый диапазон составляет от -128 до +127 (от 80h до 7F), а переполнение или потеря значимости сигнализируется другим флагом of
. В вашем коде результат (обработанный как число со знаком) равен -1 (FFh), и это находится в пределах допустимого диапазона (без переполнения), поэтому вы должны увидеть в эмуляторе, что of=0
.