2014-03-28 11 views
0
Suppose %eax contains -20 and %ecx contains -30. 
cmpl %eax, %ecx 

进行此比较时,-30 - ( - 20)= -10如此签名标志被设置。虽然你什么时候将负数解释为无符号/有符号?在IA32中进行cmpl操作时,如何判断某个数字是否未签名或签名?

Suppose %eax contains -10 and %ecx contains 20. 
cmpl %eax, %ecx 

在这个例子中,-10被解释为一个大的无符号数并且进位标志被设置。为什么不把它解释为20 - ( - 10)= 30并且没有设置标志?

+0

你必须看看'cmpl'后通常使用条件分支的指令。 – starblue

回答

3

这没有意义。你有32位,他们没有签名或没有签名,甚至是一个数字。这只是你对它的解释。

cmp,像所有的ALU运算,将所有标志(从而有效地解释数作为同时符号和无符号),其中包括进位标志(解释数字时为unsigned这是有用的),溢出标志(在将数字解释为有符号时很有用)以及符号标志(它只是结果最高位的一个副本)。

-10和大的无符号数(4294967286)并不是真正不同的东西。它们只是查看位模式FFFFFFF6的两种方式。

+0

谢谢,我想我现在明白了。因此,通常在确定设置了哪些标志时,将其解释为无符号和有符号。 – MeesterMarcus

1

这是一个很好的做法,记住旗子正在发生什么。 但是,您可以简单地记住使用jge,jle,jg,gl用于签名比较,ja,jae,jb,jbe用于无符号比较。

因此,基本上,你可能只是做无符号比较如下:

cmp ecx,eax 
ja some_label ; Jump if ecx > eax (unsigned) 

而对于符号比较

cmp ecx,eax 
jg some_label ; Jump if ecx > eax (signed). 

正如哈罗德说,当你使用CMP指令的所有标志改变(特别是:符号标志,溢出标志,零标志和进位标志)。这是关于哪些标志你关心哪些因素造成了不同。

相关问题