Язык сборки 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 перейдет к указанной метке. Если нет,то исполнение будет продолжаться.