Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在x86程序集中比较有符号值和无符号值_Assembly_Binary_X86_X86 64 - Fatal编程技术网

Assembly 如何在x86程序集中比较有符号值和无符号值

Assembly 如何在x86程序集中比较有符号值和无符号值,assembly,binary,x86,x86-64,Assembly,Binary,X86,X86 64,在x86汇编代码中,我很难找到比较正数和负数的方法 例如:当我比较-1和1时,我总是得到更大的-1。我知道这是因为2的补码格式使得底层二进制中的-1比1大 但有人能提供一个x86汇编代码片段来比较正数和负数,并得到正确的数学结果吗?(例如1>-1) 谢谢 您可能正在使用一种无符号变体,如: cmp eax, ebx jb lesser 有一些等价物可用于相互检查有符号的数字,例如: cmp eax, ebx jl lesser 对跳转变体进行了详细分析,包括它们的符号性和它们检查

在x86汇编代码中,我很难找到比较正数和负数的方法

例如:当我比较-1和1时,我总是得到更大的-1。我知道这是因为2的补码格式使得底层二进制中的-1比1大

但有人能提供一个x86汇编代码片段来比较正数和负数,并得到正确的数学结果吗?(例如1>-1)

谢谢

您可能正在使用一种无符号变体,如:

cmp  eax, ebx
jb   lesser
有一些等价物可用于相互检查有符号的数字,例如:

cmp  eax, ebx
jl   lesser
对跳转变体进行了详细分析,包括它们的符号性和它们检查的标志,部分复制到此处以进行自我控制:

Instruction  Jump if ...           Signed?   Flags
-----------  -----------           --------  -----
JO           overflow                        OF=1
JNO          not overflow                    OF=0
JS           sign                            SF=1
JNS          not sign                        SF=0
JE/JZ        equal
             zero                            ZF=1
JNE/JNZ      not-equal
             not-zero                        ZF=0
JB/JNAE/JC   below
             not-above-or-equal
             carry                 unsigned  CF=1
JNB/JAE/JNC  not-below
             above-or-equal
             no-carry              unsigned  CF=0
JBE/JNA      below-or-equal
             not-above             unsigned  CF=1 or ZF=1
JA/JNBE      above
             not-below-or-equal    unsigned  CF=0 and ZF=0
JL/JNGE      less
             not-greater-or-equal  signed    SF<>OF
JGE/JNL      greater-or-equal
             not-less              signed    SF=OF
JLE/JNG      less-or-equal
             not-greater           signed    ZF=1 or SF<>OF
JG/JNLE      greater
             not-less-or-equal     signed    ZF=0 and SF=OF
JP/JPE       parity
             parity-even                     PF=1
JNP/JPO      not-parity
             parity-odd                      PF=0
JCXZ/JECXZ   CX register is zero
             ECX register is zero
指令跳转,如果。。。签署?旗帜
-----------  -----------           --------  -----
JO溢出=1
JNO不溢出=0
符号SF=1
JNS不签名SF=0
JE/JZ同等
零ZF=1
JNE/JNZ不相等
非零ZF=0
JB/JNAE/JC如下
不高于或等于
进位无符号CF=1
JNB/JAE/JNC不低于
高于或等于
无进位无符号CF=0
JBE/JNA低于或等于
不高于无符号CF=1或ZF=1
JA/JNBE以上
不低于或等于无符号CF=0和ZF=0
JL/jngeless
不大于或等于符号SFOF
JGE/JNL大于或等于
符号不小于SF=OF
JLE/JNG小于或等于
不大于符号ZF=1或SFOF
JG/JNLE更大
不小于或等于符号ZF=0和SF=OF
JP/JPE平价
奇偶性PF=1
JNP/JPO不对等
奇偶校验PF=0
JCXZ/JECXZ CX寄存器为零
ECX寄存器为零

不能直接比较两个符号不同的数字。实际上,大多数软件语言都有这种流程。C和C++特别提到在他们的文档中,在大多数情况下,当使用同一表达式中的有符号和无符号整数时,会产生警告,从而导致未知的符号。 唯一的方法是首先检查有符号的数字是否为负数,如果是负数,那么您就知道它较小。然后可以将这两个数字作为无符号整数进行比较

; is eax < ebx (eax signed, ebx unsigned)

cmp eax, $0
jl less

cmp eax, ebx
jc less

(注意,我不保证jl是正确的,它可能是jle或jnl…

一个不一定是未签名的。有符号和无符号比较是相同的——这完全取决于如何解释标志。那么,你是如何解读这些标志的呢?:)在32位模式下,
movsx-eax,al
/
movzx-ebx,bl
将是最有效的方式。(在现代x86上也是16位模式,以避免错误的依赖关系)。无论如何,除非您需要在386之前的movzx bx上使用代码,否则bl将是比在大多数CPU上编写BH然后读取bx更好的选择。
movsx ax, al
xor bh, bh    ; or movzx bx, bl
cmp ax, bx
jl less