В сборке x86 флаг переполнения устанавливается при выполнении операции add
или sub
при переполнении целого числа со знаком, а флаг переноса устанавливается, когда выполняется операция с непознанным целым числом.
Однако, когда дело доходит до инструкций inc
и dec
, ситуация выглядит несколько иначе. Согласно этому веб-сайту, команда inc
не влияет на флаг переноса вообще.
Но я не могу найти никакой информации о том, как inc
и dec
влияют на флаг переполнения, если это вообще возможно.
Do inc
или dec
установить флаг переполнения при переполнении целого числа? И такое поведение одинаково для как подписанных, так и целых чисел без знака?
============================ РЕДАКТИРОВАТЬ ========== ===================
Итак, по существу, консенсус здесь заключается в том, что INC и DEC должны вести себя так же, как ADD и SUB, с точки зрения установки флагов, за исключением флага переноса. Это также говорится в руководстве Intel.
Проблема в том, что я не могу фактически воспроизвести это поведение на практике, когда дело доходит до целых чисел без знака.
Рассмотрим следующий код сборки (используя встроенную сборку GCC, чтобы упростить распечатку результатов).
int8_t ovf = 0;
__asm__
(
"movb $-128, %%bh;"
"decb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
Здесь мы уменьшаем подписанное 8-битное значение -128. Поскольку -128 - наименьшее возможное значение, переполнение неизбежно. Как и ожидалось, это печатает: Overflow flag: 1
Но когда мы делаем то же самое с непознанным значением, поведение не так, как я ожидаю:
int8_t ovf = 0;
__asm__
(
"movb $255, %%bh;"
"incb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d\n", ovf);
Здесь я увеличиваю 8-битное значение без знака 255. Поскольку 255 является наибольшим возможным значением, переполнение неизбежно. Однако это печатает: Overflow flag: 0
.
А? Почему он не установил флаг переполнения в этом случае?