【发布时间】:2011-04-24 22:36:41
【问题描述】:
在 x86 汇编中,当对有符号整数的add 或sub 操作溢出时设置溢出标志,并且当对无符号整数的操作溢出时设置进位标志。
但是,当涉及到inc 和dec 指令时,情况似乎有些不同。根据这个website,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\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。
嗯?在这种情况下为什么不设置溢出标志?
【问题讨论】:
-
将
-1递增到0不是有符号 溢出,因此OF 被清除。 teaching.idallen.com/dat2343/10f/notes/040_overflow.txt -
很棒的链接,@PeterCordes!该文档提供了对任何事物的最佳解释之一。
标签: c assembly x86 x86-64 inline-assembly