首页
学习
活动
专区
圈层
工具
发布

装配SF旗
EN

Stack Overflow用户
提问于 2017-10-10 10:59:04
回答 1查看 8.9K关注 0票数 1

所以我有两个寄存器,eax保存0xDEADC0DE,ebx保存0x1337CA5E。

第一个数字比第二个数字大。但是,在cmp指令:cmp eax, ebx之后,设置了SF (符号标志)。为什么?

为什么如果结果是阳性的(eax - ebx)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-10 12:14:53

cmp执行sub (但不保留结果)。

让我们用手做同样的事情:

代码语言:javascript
复制
 reg     hex value   binary value    

 eax = 0xdeadc0de    ‭11011110101011011100000011011110‬
 ebx = 0x1337ca5e    ‭00010011001101111100101001011110‬
  -    ----------
 res   0xCB75F680    11001011011101011111011010000000 

这些旗帜设置如下:

代码语言:javascript
复制
OF (overflow) : did bit 31 change      -> no
SF (sign)     : is bit 31 set          -> yes
CF (carry)    : is abs(ebx) < abs(eax) -> no  
ZF (zero)     : is result zero         -> no
PF (parity)   : is parity of LSB even  -> no (archaic)
AF (Adjust)   : overflow in bits 0123  -> archaic, for BCD only.

正如您所看到的,结果是位31集,因此它是负的。

就像-3 -1= -4 (仍然是负的)。

您不能使用SF (符号标志)来确定是否为EBX > EAX。您需要对有符号数字使用OF (溢出标志),对无符号数字使用CF (进位标志)。

阳性或阴性

CPU不知道(或关心)一个数字是正数还是负数。唯一知道的人就是你。如果测试SFOF,则将数字视为签名。如果您只测试CF,那么您将该数字视为无符号。

为了帮助您,处理器同时跟踪所有标志。您可以决定要测试哪些标志,通过这样做,您可以决定如何解释数字。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46665039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档