Язык сборки je функция перехода

Я пытаюсь найти в интернете использование функции языка ассемблера "Йе". Я читал, что je означает прыжок, если он равен, и это именно то, что я хочу. Каково фактическое использование этой функции или, другими словами, как я набираю эту функцию, чтобы проверить значение и перейти, если оно равно чему-то?

пожалуйста, дайте мне знать.

кстати, я использую NASM, если это имеет значение.

5 ответов


предположим, вы хотите проверить, если EAX равна 5, и выполнять различные действия, основанные на результате этого сравнения. Другими словами, утверждение if.

  ; ... some code ...

  cmp eax, 5
  je .if_true
  ; Code to run if comparison is false goes here.
  jmp short .end_if
.if_true:
  ; Code to run if comparison is true goes here.
.end_if:

  ; ... some code ...

это будет прыгать, если " равный флаг "(также известный как "нулевой флаг") в FLAGS регистр имеет значение. Это устанавливается в результате арифметических операций, или инструкция, как TEST и CMP.

например: (если память мне не изменяет, это правильно :-)

cmp eax, ebx    ; Subtract EBX from EAX -- the result is discarded
                ; but the FLAGS register is set according to the result.
je .SomeLabel   ; Jump to some label if the result is zero (ie. they are equal).
                ; This is also the same instruction as "jz".

Я должен сказать, что je func должен проверить, установлен ли нулевой флаг, а затем перейти в другое место или продолжить следующую инструкцию.

test cx, cx
je   some_label

тестовая инструкция просто выполняет побитовое и из двух операндов и устанавливает флаг в соответствии с результатом AND. Затем инструкция je использует нулевой флаг, чтобы решить прыгать или продолжать.

приведенный выше код используется для проверки, если СХ равен нулю или нет.

  • если cx равен нулю, test установит нулевой флаг, тогда je заставит прыгать в какое-то место;
  • если cx не равен нулю, test не установит нулевой флаг, je продолжит выполнение следующей инструкции.

Примечание: je не должен тестироваться равным, но тестировать нулевой флаг, который установлен некоторой инструкцией перед этим.


ты перед je С cmp (или test или эквивалент) обычно, который устанавливает флаг в регистре EFLAGS. Вот ссылке на простой эхо-сервер в NASM, который может помочь в целом. Игнорировать назойливую рекламу в Google.

пример использования je может быть:

    cmp eax, ebx
    je  RET_FAIL
    jmp RET_SUCCESS

RET_FAIL:
    push 1
    pop  eax
    ret

RET_SUCCESS:
    push 0
    pop eax
    ret

Ну, наконец-то я нашел ответ. :P в основном вы вызываете je label_to_jump_to после вызова cmp.

Если cmp показывает, что два значения равны, je перейдет к указанной метке. Если нет,то исполнение будет продолжаться.