2010-10-25 9 views
8

Jestem nowym językiem asemblera x86, mam zapisaną liczbę całkowitą zapisaną w rejestrze eax i chcę sprawdzić, czy liczba jest ujemna czy dodatnia. Aby to zrobić, użyłem instrukcji bt, aby sprawdzić pierwszy bit.Jak sprawdzić, czy liczba całkowita ze znakiem jest neg lub pos?

Oto co zrobiłem:

bt eax,0 
jnc isNegative 

bt niesie pierwszy bit nosić flagę, a ja jnc aby sprawdzić, czy wskaźnik przeniesienia jest 0 lub 1. Jeśli jest to 1, powinna ona być ujemna numer, i robi instrukcje ujemne ... jednak wynik jest nieprzewidywalny, czasami mam wartość dodatnią i rozpoznaje ją jako liczbę ujemną. czy robię coś źle?

EDYCJA: Właśnie zdałem sobie sprawę, że to może mieć coś wspólnego z endiansem. W rzeczywistości sprawdza on ostatni bit zamiast pierwszego. Pozwól mi spróbować użyć bt, 7

Odpowiedz

15

Wartość jest ujemna, jeśli ustawiono MSB. To może być sprawdzana z

test eax, 0x80000000 
jne is_signed 

lub, prostsza:

test eax, eax 
js signed 

lub dla przypadku bajtów:

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

swoje obecne kontrole rozwiązanie, jeśli liczba jest parzysta lub nieparzysta, zamiast testować 31-bitowe:

bt eax, 31 
jc number_is_negative 

Albo można porównać liczbę zero, i sprawdzić, czy jest to większa równy lub równy temu.

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

Można użyć jge i cmp instrukcji:

cmp eax, 0 
jl isNegative 
+0

Świetnie, rozwiązuje problem i proste! chociaż powinien to być cmp eax, 0 – Yonk

+0

Zależy od używanego asemblera, ale od Intela, tak. Domyślam się, że właśnie stąd doszło. – nmichaels

+0

cmp jest dłuższy niż test, dlatego często preferowany jest test http://stackoverflow.com/a/147183/995714 –

Powiązane problemy