Разница в операторах перехода в программировании на ассемблере - PullRequest
4 голосов
/ 01 марта 2010

Как вы решаете, когда вы используете, какой оператор перехода ... операторы, такие как JG JNLE JNC могут выполнять ту же работу, как вы их различаете?

Ответы [ 3 ]

5 голосов
/ 01 марта 2010

Упомянутые вами переходы - это все переходы на значениях кодов условий.

JG и JNLE одинаковы: они имеют одинаковый код операции и делают одно и то же. Одним из них является «прыжок, если больше, чем», а другой - «прыжок, если не меньше или равно». Думаю об этом. Это подписанные ветви, это означает, что они принимают во внимание флаг знака при определении, следует ли переходить.

JNC означает «прыгать, если нет переноса». Он будет прыгать, если флаг переноса не установлен. Carry часто используется для обнаружения арифметического переполнения, например, при добавлении 2 целых чисел без знака.

4 голосов
/ 01 марта 2010

J (E) CXZ обычно используется, когда у вас есть значение счетчика в регистре CX, которое вы используете для ограничения итераций в циклах.

JMP - это безусловный переход, используемый для выхода из циклов, ввода API в интерфейс без CALL, построения таблиц переходов и т. Д.

Условные переходы используются для изменения потока выполнения на основе условий предыдущих вычислений. Есть много синонимов (задокументировано в только что приведенной ссылке), и синонимы обычно по понятным причинам. JAE, например, означает «Прыжок выше или равно». Это синоним для JNC, что означает «Перейти, если нет переноски» и JNB, что означает «Перейти, если не ниже». То, что вы используете, это просто вопрос того, чтобы ваш код был понятен читателю:

  • Если вы только что выполнили арифметическую операцию, вас, вероятно, заинтересует состояние флага переноса, поэтому вы закодируете его как JNC.
  • Если вы только что провели сравнение (операция CMP), вы, скорее всего, больше будете интересоваться JAE или JNB. То, что вы используете, зависит от того, что имеет смысл при описании логики.

Это на самом деле классическая проблема в языковом дизайне: вы делаете много псевдонимов, усложняете ли синтаксис в пользу уточнения семантики, или вы ограничиваете свои «ключевые слова» (здесь мнемоника кода операции) за счет того, что семантика труднее читать?

4 голосов
/ 01 марта 2010

Некоторые мнемоники просто ссылаются на одну и ту же инструкцию. Если вас интересует результат сравнения, используйте jG JGE и т. Д. Если вас интересует установка флагов процессора, используйте JC, JZ и т. Д. Это только увеличит читабельность кода

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