2010-10-25 31 views
8

Soy nuevo en el lenguaje de ensamblaje x86, tengo un entero con signo guardado en el registro eax, y quiero verificar si el número es negativo o positivo. Para hacer eso, utilicé la instrucción bt para verificar el primer bit.¿Cómo comprobar si un entero con signo es neg o pos?

Esto es lo que hice:

bt eax,0 
jnc isNegative 

bt lleva el primer bit de llevar la bandera, y yo solía jnc para comprobar si bandera de acarreo es 0 o 1. Si es 1, debe ser un negativo número, y hace las instrucciones negativas ... sin embargo, la salida es impredecible, a veces tengo un positivo y lo reconoce como un número negativo. ¿Estoy haciendo algo mal?

EDIT: Me acabo de dar cuenta de que podría tener algo que ver con endianess. En realidad, está comprobando el último bit en lugar del primer bit. Permítanme tratar de utilizar bt, 7

Respuesta

15

El valor es negativo si está configurado el MSB. Se puede comprobar con

test eax, 0x80000000 
jne is_signed 

o, más simple:

test eax, eax 
js signed 

o para el caso de bytes:

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

Sus cheques solución actual si el número es par o impar, en vez probar el bit 31:

bt eax, 31 
jc number_is_negative 

O puede comparar el número a cero, y comprobar si es mayor que o igual a eso.

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 
    ... 
4

Puede utilizar los jge y cmp instrucciones:

cmp eax, 0 
jl isNegative 
+0

Genial, soluciona el problema ¡y simple! aunque, debería ser cmp eax, 0 – Yonk

+0

Depende del ensamblador que esté utilizando, pero para Intel sí. Supongo que de ahí viene el vástago. – nmichaels

+0

cmp es más largo que la prueba, por lo que a menudo se prefiere probar http://stackoverflow.com/a/147183/995714 –

Cuestiones relacionadas