Страницы

Поиск по вопросам

пятница, 7 декабря 2018 г.

Явные отличия CMP от TEST

Я начал изучать устройство одной программы недавно, целиком написанной на ассемблере (т.е никакие трансляторы в машинный не применялись, как в языках высокого уровня). Так вот, в ней я очень часто встречаю конструкции вида TEST AL, AL ; TEST EAX, EAX и т.д.
Вот вопрос: почему применяется TEST, а не CMP? Да и какой смысл сравниваться с самим собой? Насколько я знаю, TEST использует логическое "И" (AND). Проясните, пожалуйста, в этих деталях я не особо просвещён.


Ответ

Команды вида test reg, reg используется для сравнения значения регистра с нулем. После этой операции флаги нуля, знака и чётности либо устанавливаются, либо сбрасываются. Почему не cmp reg, 0? Потому что в скомпилированном виде test reg, reg на целый байт короче, ну и по скорости наверное разница есть.
test эквивалентен побитовому and, за исключением того, что модифицируются только флаги, но не операнды. Обычно это нужно, чтобы узнать, установлены ли определенные биты в регистре.
А cmp эквивалентен обыкновенному вычитанию, но аналогично модифицирует флаги, не изменяя операнды.

Комментариев нет:

Отправить комментарий