问题描述
我一直在玩装配了一会儿,看一些code。
其中AL首先被设置到的0x84然后CMP AL,的0x30被使用。
然后,此指令触发溢出标志。
I've been playing with assembly for a while and looking at some code.in which AL is first set to 0x84 then cmp AL, 0x30 is used.This instruction then triggers the Overflow flag.
从我读CMP应该从第一减去第二个数字,然后设置标志,在这种情况下,它应该是0x84-0x30结果是0x54,没有溢出。
From what I read CMP is supposed to subtract the second number from the first then set the flags, in that case it should be 0x84-0x30 the result is 0x54 and there is no overflow.
推荐答案
还有,如果你是跨preT这些值作为无符号数只是没有溢出 - 如果你跨preT你的的0x84
作为签约,肯定有溢出:
There's only no overflow if you're interpret those values as unsigned numbers - if you interpret your 0x84
as signed, there's definitely overflow:
- PTED为有符号的8位值的0x84间$ P $是-124
- PTED为有符号的8位值的0x30间$ P $ 48
- -124 - 48 = -172
-172是一种符号的8位值(-128到+127)的范围之外,这就是为什么在的
标志置位。您应该检查 CF
,表示无符号溢出。
-172 is outside of the range of a signed 8-bit value (-128 to +127) and that's why the OF
flag gets set. You should check CF
which indicates unsigned overflow.
从Intel 64和IA-32架构软件开发人员手册,第2卷CMP:
的比较是通过从第一操作数中减去第二个操作数,然后以相同的方式作为SUB指令设定状态标志进行。
和SUB:
SUB指令执行整数加减。它计算两种符号和无符号整数运算的结果,并设置和CF标志来表示有符号或无符号结果溢出,分别。 SF标志表示有符号结果的符号。
这篇关于为什么CMP 0x84,0x30触发溢出标志?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!