gpt4 book ai didi

c - x86 程序集 : INC and DEC instruction and overflow flag

转载 作者:太空狗 更新时间:2023-10-29 16:37:38 25 4
gpt4 key购买 nike

在 x86 汇编中,当对有符号整数进行 addsub 操作溢出时设置溢出标志,当对无符号整数进行操作时设置进位标志整数溢出。

但是,当涉及到incdec指令时,情况似乎有些不同。根据这个website , inc 指令根本不影响进位标志。

但我找不到任何关于 incdec 如何影响溢出标志的信息,如果有的话。

发生整数溢出时,incdec 是否设置溢出标志?对于有符号整数和无符号整数,这种行为是否相同?

=============================编辑 ========== ===================

好吧,基本上这里的共识是 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

嗯?为什么在这种情况下不设置溢出标志?

最佳答案

当操作会导致符号改变时设置溢出标志。您的代码非常接近。我能够使用以下 (VC++) 代码设置 OF 标志:

char ovf = 0;

_asm {
mov bh, 127
inc bh
seto ovf
}
cout << "ovf: " << int(ovf) << endl;

当 BH 递增时,MSB 从 0 变为 1,导致设置 OF。

这也设置了 OF:

char ovf = 0;

_asm {
mov bh, 128
dec bh
seto ovf
}
cout << "ovf: " << int(ovf) << endl;

请记住,处理器不区分有符号数和无符号数。当您使用 2 的补码运算时,您可以使用一组指令来处理这两种运算。如果要测试无符号溢出,则需要使用进位标志。由于 INC/DEC 不影响进位标志,因此您需要在这种情况下使用 ADD/SUB。

关于c - x86 程序集 : INC and DEC instruction and overflow flag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com