двойная проверка состояния в сборке - PullRequest
5 голосов
/ 04 марта 2011

Я начинаю сборку, я использую nasm для сборки кода, я пытаюсь обработать строку, находящуюся в памяти, и изменить ее, я хочу проверить, находится ли байт в определенном диапазоне (ascii), такя могу решить, что с этим делать, я не могу понять, как проверить, находится ли значение в определенном диапазоне, я знаю все о различного рода флагах перехода, но как я могу объединить 2 оператора cmp?

мой вопрос: как мне сделать что-то похожее на это в сборке?

if (x>=20 && x<=100)
     do something

спасибо большое!

Ответы [ 4 ]

24 голосов
/ 04 марта 2011

Там - это способ выразить проверку диапазона следующим образом, используя только один условный переход:

     sub  %eax,  20
     cmp  %eax,  80
     ja   END
     // do something
END: ret

Это очень распространенный прием оптимизации при работе с целочисленными диапазонами.Начальное вычитание отображает диапазон [20,100] в [0,80];членство в этом диапазоне затем проверяется с помощью одного без знака сравнения.

Обратите также внимание, что то же самое можно сделать в C:

unsigned int upperBound = 100;
unsigned int lowerBound = 20;
if (yourValue - lowerBound <= upperBound - lowerBound) {
    // do something
}
6 голосов
/ 04 марта 2011

В зависимости от того, какой синтаксис вы используете, и при условии, что x находится в регистре eax, что-то вроде этого:

cmp  %eax, 20
jl   ELSE
cmp  %eax, 100
jg   ELSE
#do something
jmp  END

ELSE:
#do else

END:
1 голос
/ 04 марта 2011

Вы можете попробовать скомпилировать его из языка более высокого уровня (C / C ++ / ...) с оптимизацией на высоком уровне (-O3 для gcc) и посмотреть, что генерирует компилятор (objdump). Он должен генерировать очень эффективный код.

0 голосов
/ 04 марта 2011

Как это?

x<20
if false jump to ELSE
x>100
if false jump to ELSE
  do something
  jump to ENDIF
:ELSE
  do something else
:ENDIF

Или вы имеете в виду использование только одной инструкции по сборке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...