Win32Asm Tutorial |
![]() |
назад | 9- Еще об опкодах | вперед | ![]() |
9.0 - Еще об опкодах
Здесь я расскажу еще о нескольких опкодах.
TEST |
Команда Test выполняет операцию AND (логическое И) с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. Test используется для проверки бит, например в регистре:
test eax, 100b ; (суффикс 'b' означает двоичное число)
jnz смещение
Команда jnz выполнит переход, если в регистре eax третий бит справа - установлен. Очень часто комманду test используют для проверки, равен ли регистр нулю:
test ecx, ecx
jz смещение
Команда jz выполнит переход, если ecx = 0.
Стековые операции |
Перед тем, как рассказать вам о стековых операциях, я сначала попытаюсь объяснить, что такое стек. Стек это область в памяти, на которую указывает регистр стека esp. Стек это место для хранения временных значений. Есть две команды, для размещения значения в стеке и извлечения его из стека: push и pop. Команда push размещает значение в стеке, а pop извлекает. Значение помещенное в стек последним, извлекается первым. При помещении значения в стек, указатель стека уменьшается, а при извлечении - увеличивается. Рассмотрим пример:
(1) mov ecx, 100
(2) mov eax, 200
(3) push ecx ; сохранение ecx
(4) push eax
(5) xor ecx, eax
(6) add ecx, 400
(7) mov edx, ecx
(8) pop ebx
(9) pop ecx
Анализ:
1: поместить 100 в ecx
2: поместить 200 в eax
3: разместить значение из ecx (=100) в стеке (размещается первым)
4: разместить значение из eax (=200) в стеке (размещается последним)
5/6/7: выполнение операций над ecx, значение в ecx изменяется
8: извлечение значения из стека в ebx: ebx станет 200 (последнее размещение, первое извлечение)
9: извлечение значения из стека в ecx: ecx снова станет 100 (первое размещение, последнее извлечение)
Чтобы узнать, что происходит в памяти, при размещении и извлечении значений в стеке, см. на рисунок ниже: