Агрегация языка

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

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

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

Ответ 1

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

  ; ... 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 ...

Ответ 2

Это произойдет, если установлен флаг "равный флаг" (также известный как "флаг нуля" ) в регистре 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".

Ответ 3

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

test cx, cx
je   some_label

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

Приведенный выше код используется для проверки того, является ли cx нулевым или нет.

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

ПРИМЕЧАНИЕ: je не должен тестировать равный, но для проверки флага ZERO, установленного некоторой инструкцией перед этим.

Ответ 4

Как правило, перед 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

Ответ 5

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

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