Сборка - инструкция JZ после CMP - PullRequest
13 голосов
/ 18 февраля 2012

У меня есть следующая инструкция:

cmp al, 1
jz mub

Когда al равен 2 (10 в двоичном виде). Что бы сделать эту инструкцию? Как я знаю, я могу использовать JE, JNE, JA и т. Д., Но что означает jz после инструкции cmp?

Спасибо

Ответы [ 3 ]

22 голосов
/ 18 февраля 2012

jz - «скачок, если ноль».cmp вычитает два его операнда и соответственно устанавливает флаги.(См. здесь для справки.)

Если два операнда равны, вычитание приведет к нулю, и будет установлен флаг ZF.

Так что вваш образец, скачок будет выполнен, если al был 1, иначе не будет принято.

4 голосов
/ 18 февраля 2012

jz означает скачок, если ноль. В этом контексте он будет прыгать только, если al было 1.

Это потому, что cmp обычно эквивалентно sub (вычитать), но без фактического изменения значения.

cmp al, 1 установит флаги процессора (включая флаг нуля) на основе того, что произошло бы, если бы вы вычли 1 из al.

Если al равно 2, переход не будет выполнен (поскольку флаг нуля не установлен), и код продолжит выполняться по инструкции, следующей за jz.

Кроме того, jz часто является таким же кодом операции, что и je, поскольку они фактически означают одно и то же. См., Например, страницу Википедии о потоке управления x86 :

Перейти на ноль
jz loc
Загружает EIP с указанным адресом, если нулевой бит установлен из предыдущего арифметического выражения. jz идентичен je.

1 голос
/ 18 февраля 2012

'Jump Zero' - перейти к метке 'mub', если установлен нулевой флаг. 'cmp' - это вычитание, которое устанавливает только флаги и поэтому, если al равно 2, (2-1) <> 0, поэтому флаг нуля сброшен и переход не будет выполнен.

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