В сборке 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
Но когда мы делаем то же самое со значением unsigned , поведение не такое, как я ожидаю:
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
.
А?Почему он не установил флаг переполнения в этом случае?