Флаг переноса операции 0-1 в 8-битном регистре

Я попробовал следующий код в emu 80x86 IDE:

mov al,0h
sub al,1h

В выводе отображается в эмуляторе al=FF и я это понял, но чего я не понял, так это почему в разделе флагов cf=1


person smailys    schedule 09.05.2020    source источник
comment
teaching.idallen.com/dat2343/10f/notes/040_overflow.txt   -  person Peter Cordes    schedule 09.05.2020


Ответы (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.

person vitsoft    schedule 09.05.2020