【发布时间】:2010-12-07 15:58:24
【问题描述】:
我正在网上查找汇编语言函数“je”的用法。我读到 je 意味着如果相等则跳跃,这正是我想要的。这个函数的实际用法是什么,或者换句话说,我如何输入这个函数来检查一个值,如果它等于某个值就跳转?
请告诉我。
顺便说一句,我正在使用 NASM,如果这有影响的话。
【问题讨论】:
标签: assembly conditional-statements
我正在网上查找汇编语言函数“je”的用法。我读到 je 意味着如果相等则跳跃,这正是我想要的。这个函数的实际用法是什么,或者换句话说,我如何输入这个函数来检查一个值,如果它等于某个值就跳转?
请告诉我。
顺便说一句,我正在使用 NASM,如果这有影响的话。
【问题讨论】:
标签: assembly conditional-statements
我不得不说je func是测试是否设置了零标志,然后跳转到其他地方或继续执行下一条指令。
test cx, cx
je some_label
测试指令只是对两个操作数进行按位与,并根据与结果设置FLAG。 je 指令然后使用零标志来决定跳转或继续。
上面的代码用于检查cx是否为零。
注意:je 不是测试相等,而是测试在此之前由某些指令设置的零标志。
【讨论】:
您通常会在je 前面加上cmp(或test 或等效项),这会在EFLAGS 寄存器中设置一个标志。这是 NASM 中一个简单的回显服务器的link,它通常可能会有所帮助。忽略烦人的 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
【讨论】:
假设您要检查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 ;从 EAX 中减去 EBX——结果被丢弃
;但是FLAGS寄存器是根据结果设置的。
je .SomeLabel ;如果结果为零(即它们相等),则跳转到某个标签。
;这也是与“jz”相同的指令。
【讨论】:
好吧,我终于找到了答案。 :P 基本上你在 cmp 调用后调用 je label_to_jump_to。
如果cmp显示两个值相等,je会跳转到指定的标签。如果没有,它将继续执行。
【讨论】:
CMP 指令,尽管这是最常见的情况。正如其他人所说,Jcc 指令可以遵循任何设置FLAGS 的指令。这包括几乎所有的算术指令,以及其他一些指令。