我正在尝试在线查找汇编语言函数“je”的用法。我读到 je 意味着如果相等则跳跃,这正是我想要的。这个函数的实际用法是什么,或者换句话说,我如何键入这个函数来检查一个值并在它等于某物时跳转?
请告诉我。
顺便说一句,如果这有所作为,我正在使用 NASM。
我正在尝试在线查找汇编语言函数“je”的用法。我读到 je 意味着如果相等则跳跃,这正是我想要的。这个函数的实际用法是什么,或者换句话说,我如何键入这个函数来检查一个值并在它等于某物时跳转?
请告诉我。
顺便说一句,如果这有所作为,我正在使用 NASM。
假设您要检查是否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
and之类的指令CMP
。
例如:(如果我没记错的话,这是正确的:-)
cmp eax, ebx ; 从 EAX 中减去 EBX——结果被丢弃 ; 但是FLAGS寄存器是根据结果设置的。 je .SomeLabel ; 如果结果为零(即它们相等),则跳转到某个标签。 ; 这也是与“jz”相同的指令。
我不得不说 je func 是测试是否设置了零标志,然后跳转到其他地方或继续执行下一条指令。
test cx, cx
je some_label
测试指令只是对两个操作数进行按位与,并根据与结果设置 FLAG。je 指令然后使用零标志来决定跳转或继续。
上面的代码用于检查 cx 是否为零。
注意:je 不是测试相等,而是测试在此之前由某些指令设置的零标志。
您通常会在前面je
加上一个cmp
(test
或等价的),它在 EFLAGS 寄存器中设置一个标志。这是NASM 中一个简单的回显服务器的链接,通常可能会有所帮助。忽略烦人的谷歌广告。
的一个示例用法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 基本上你在 cmp 调用后调用 je label_to_jump_to。
如果 cmp 显示两个值相等,je 会跳转到指定的标签。如果没有,它将继续执行。