为什么这些应该在无符号整数上运行的指令仍会影响处理有符号数时使用的标志?

时间:2011-02-13 17:01:06

标签: assembly x86 flags

据记载,“INC”,“DEC”和“MUL”指令应该用于无符号整数,但仍然有两个第一个指令影响溢出和符号标志,“MUL”影响溢出标志,这是处理有符号数时使用的标志这个文档没有意义,为什么呢?

3 个答案:

答案 0 :(得分:4)

我不确定您认为incdec应限制为无符号整数的地方。请指出相关文档。

通常,8086处理器对签名/未签名操作没有不同的指令。处理器内置了关于如何在“签名”世界中查看操作结果的知识,但这几乎就是它。这已经贯彻到x86处理器设计的最新版本。

使用仅使用无符号值的inc指令没有多大意义,因为增加有符号值会非常昂贵(您必须使用add或添加1)的adc指令,或者在执行inc(或dec)后检查溢出是非常昂贵的。

答案 1 :(得分:2)

假设我们在这里讨论x86,Wikipedia page on the overflow flag表示它是由所有算术运算设置的。您指的是哪种文件,否则会提示?

答案 2 :(得分:-1)

这是它的工作原理:

考虑两个字节值0x65和0x31。它们都是无符号值,无论您是从有符号还是无符号的角度来看它们。

然后你添加它们:

0x65 + 0x31变为0x96,从无符号的角度来看很好(总和适合一个字节,因此没有设置进位标志)。但是,从签名视图中添加两个正数导致负数,因此设置了溢出和符号标志。实际上,对于所有带符号的数字,如果最高有效位由于操作而改变,则设置溢出标志,否则它被清除。

通过为unsigned和signed add设置适用的标志,你可以看到cpu为每条指令执行两次操作。之后,由编译器(或汇编程序员)决定是否使用无符号条件分支(使用标志零和进位)或带符号的条件分支(使用标志零,符号和溢出)。

那有什么意义呢?

关键在于,如果没有以这种方式完成,处理器将需要一组用于签名操作的指令(这只会影响零,符号和溢出标志),另一组用于无符号操作(影响零和进位)