在x86程序集中,当对有符号整数的add
或sub
操作溢出时,会设置溢出标志;当对无符号整数的操作溢出时会设置进位标志。
然而,当谈到inc和
dec指令时,情况似乎有所不同。据此网站,
inc
指令根本不影响进位标志。
但我找不到任何关于inc和
dec如何影响溢出标志的信息。
当发生整数溢出时,inc或
dec是否设置溢出标志?有符号整数和无符号整数的这种行为相同吗?
=========================编辑=============================
好吧,基本上,这里的共识是INC和DEC在设置标志方面应该与ADD和SUB相同,除了进位标志。这也是英特尔手册中所说的。
问题是,当涉及到无符号整数时,我实际上无法在实践中重现这种行为。
考虑以下程序集代码(使用GCC内联程序集可以更容易地打印结果)
int8_t ovf = 0;
__asm__
(
"movb $-128, %%bh;"
"decb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d
", ovf);
这里我们递减一个带符号的8位值-128。由于-128是可能的最小值,因此溢出是不可避免的。正如预期的那样,这会打印出:溢出标志:1
但是,当我们对<em>unsigned</em>值执行相同操作时,行为与我预期的不同:
int8_t ovf = 0;
__asm__
(
"movb $255, %%bh;"
"incb %%bh;"
"seto %b0;"
: "=g"(ovf)
:
: "%bh"
);
printf("Overflow flag: %d
", ovf);
这里我增加一个无符号的8位值255。由于255是可能的最大值,因此溢出是不可避免的。但是,这会打印出:溢出标志:0
。
嗯?为什么在这种情况下不设置溢出标志?