tags:

views:

83

answers:

3

I am new to x86 assembly language, I have a signed integer saved in register eax, and I want to check if the number is negative or positive. To do that, i used bt operator to check the first bit.

here is what I did:

bt eax,0
jnc isNegative

bt carries the first bit to carry flag, and i used jnc to check if carry flag is 0 or 1. If it's 1, it should be a negative number, and does negative instructions... however, the output is unpredictable, sometimes I have a positive and it recognize it as a negative number. Am I doing something wrong?

Thanks

EDIT: I just realized it could have something to do with endianess. It is actually checking the last bit instead of the first bit. Let me try use bt, 7

A: 

Your current solution checks if the number is even or odd, instead test the 31st bit:

bt eax, 31
jc number_is_negative

Or you can compare the number to zero, and test whether it's greater than or equal to it.

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
    ...
Joe D
+2  A: 

The value is negative if the MSB is set. It can be checked with

test eax, 0x80000000
jne is_signed

or, simplier:

test eax, eax
js signed

or for byte case:

test al, al
js is_signed
; or
test eax, 80h
jne is_signed
ruslik
A: 

You can use the jge and cmp instructions:

cmp eax, 0
jl isNegative
Nathon
Great, fixes the problem and simple! although, it should be cmp eax,0
Yonk
Depends on which assembler you're using, but for Intel's, yes. I guess that's where the downvote came from.
Nathon