如何检查有符号整数是否为负或位?

时间:2010-10-25 17:57:54

标签: assembly x86

我是x86汇编语言的新手,我有一个保存在寄存器eax中的有符号整数,我想检查数字是负数还是正数。为此,我使用bt指令检查第一位。

这是我做的:

bt eax,0
jnc isNegative

bt携带第一个进位标志位,我用jnc检查进位标志是0还是1。 如果它是1,它应该是负数,并做负面指令...... 然而,输出是不可预测的,有时我有一个积极的,它认为它是一个负数。我做错了吗?

编辑:我刚刚意识到它可能与endianess有关。它实际上是检查最后一位而不是第一位。让我尝试使用bt,7

3 个答案:

答案 0 :(得分:17)

如果设置了MSB,则该值为负。可以使用

进行检查
test eax, 0x80000000
jne is_signed

或,更简单:

test eax, eax
js signed

或用于字节大小写:

test al, al
js is_signed
; or
test eax, 80h
jne is_signed

答案 1 :(得分:5)

您可以使用jgecmp说明:

cmp eax, 0
jl isNegative

答案 2 :(得分:1)

您当前的解决方案会检查数字是偶数还是奇数,而是测试第31位:

bt eax, 31
jc number_is_negative

或者您可以将数字与零进行比较,并测试它是否大于或等于它。

main:
    ...
    cmp eax, 0 ; Compare the number to zero
    jge .number_is_positive ; If it's positive jump to .number_is_positive
    ; And only arrive here if a number is negative
    ...
.number_is_positive:
    ; Yay! number is positive
    ...