Assembly 在IA32中执行cmpl操作时,如何判断数字是无符号的还是有符号的?

Assembly 在IA32中执行cmpl操作时,如何判断数字是无符号的还是有符号的?,assembly,x86,comparison,unsigned,signed,Assembly,X86,Comparison,Unsigned,Signed,进行此比较时,-30-(-20)=-10,因此设置有符号标志。但是什么时候你会把负数解释为无符号/有符号 Suppose %eax contains -20 and %ecx contains -30. cmpl %eax, %ecx 在本例中,-10被解释为一个大的无符号数,并设置进位标志。为什么不解释为20-(-10)=30,并且不设置任何标志 这没有道理。你有32位,它们不是有符号的或无符号的,甚至不是一个真正的数字。那只是你对它的解释 cmp与所有ALU操作一样,设置所有标志(从而有效

进行此比较时,-30-(-20)=-10,因此设置有符号标志。但是什么时候你会把负数解释为无符号/有符号

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

在本例中,-10被解释为一个大的无符号数,并设置进位标志。为什么不解释为20-(-10)=30,并且不设置任何标志

这没有道理。你有32位,它们不是有符号的或无符号的,甚至不是一个真正的数字。那只是你对它的解释

cmp
与所有ALU操作一样,设置所有标志(从而有效地将数字同时解释为有符号和无符号),其中包括进位标志(将数字解释为无符号时有用)、溢出标志(将数字解释为有符号时有用)和符号标志(这只是结果顶部位的副本)


-10和大的无符号数(4294967286)其实并没有什么不同。它们只是从两个角度来看待位模式FFFFFFF6。

这没有意义。你有32位,它们不是有符号或无符号的,甚至不是真正的数字。这只是你对它的解释

cmp
与所有ALU操作一样,设置所有标志(从而有效地将数字同时解释为有符号和无符号),其中包括进位标志(将数字解释为无符号时有用)、溢出标志(将数字解释为有符号时有用)和符号标志(这只是结果顶部位的副本)


-10和大的无符号数(4294967286)其实并没有什么不同。它们只是从两个角度来看待位模式FFFFFFF6。

记住标志发生了什么是一个很好的做法。 但是,您可以简单地记住,使用jge、jle、jg、gl用于有符号比较,而ja、jae、jb、jbe用于无符号比较

因此,基本上,您可以对无符号比较执行以下操作:

Suppose %eax contains -10 and %ecx contains 20.
cmpl %eax, %ecx
和用于符号比较

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

正如harold所说,当您使用cmp指令时,所有标志都会发生变化(特别是:符号标志、溢出标志、零标志和进位标志)。关键在于您关心哪些标志,哪些标志会产生差异。

记住这些标志发生了什么是一个很好的做法。 但是,您可以简单地记住,使用jge、jle、jg、gl用于有符号比较,而ja、jae、jb、jbe用于无符号比较

因此,基本上,您可以对无符号比较执行以下操作:

Suppose %eax contains -10 and %ecx contains 20.
cmpl %eax, %ecx
和用于符号比较

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

正如harold所说,当您使用cmp指令时,所有标志都会发生更改(特别是:符号标志、溢出标志、零标志和进位标志)。这只是关于你关心哪些标志,哪些标志起作用。

谢谢,我想我现在明白了。所以,一般来说,当确定设置了哪些标志时,你会将其解释为未签名和已签名。谢谢,我想我现在明白了。所以,一般来说,当确定设置了哪些标志时,你会将其解释为未签名和已签名。你必须查看在
cmpl
之后使用标志的指令中,通常是条件分支。您必须查看在
cmpl
之后使用标志的指令,通常是条件分支。