Агрегация языка
Я пытаюсь найти в Интернете использование функции ассемблера "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 будет переходить к указанной метке. Если нет, он будет продолжать выполнение потока.