Как проверить, является ли целое число со знаком отрицательным или положительным? - PullRequest
10 голосов
/ 25 октября 2010

Я новичок в языке ассемблера x86, у меня есть целое число со знаком, сохраненное в регистре eax, и я хочу проверить, является ли число отрицательным или положительным. Для этого я использовал инструкцию bt, чтобы проверить первый бит.

Вот что я сделал:

bt eax,0
jnc isNegative

bt несет первый бит для флага переноса, и я использовал jnc, чтобы проверить, равен ли флаг переноса 0 или 1. Если это 1, это должно быть отрицательное число, и делает отрицательные инструкции ... однако вывод непредсказуем, иногда у меня есть положительный результат, и он распознает его как отрицательное число. Я что-то не так делаю?

РЕДАКТИРОВАТЬ: Я просто понял, что это может иметь какое-то отношение к endianess. Это на самом деле проверка последнего бита вместо первого бита. Позвольте мне попробовать использовать bt, 7

Ответы [ 3 ]

17 голосов
/ 25 октября 2010

Значение является отрицательным, если установлен 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
5 голосов
/ 25 октября 2010

Вы можете использовать инструкции jge и cmp:

cmp eax, 0
jl isNegative
1 голос
/ 25 октября 2010

Ваше текущее решение проверяет, является ли число четным или нечетным, вместо этого проверьте 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
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...