我试图在网上找到汇编语言函数“je”的用法。我读到,如果相等,那意味着跳跃,这正是我想要的。这个函数的实际用法是什么,换句话说,如何输入这个函数来检查一个值,如果它等于某个值就跳转?
请告诉我。
顺便说一下,如果有所作为,我正在使用NASM。答案 0 :(得分:19)
假设您要检查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 ...
答案 1 :(得分:13)
如果设置了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".
答案 2 :(得分:6)
我必须说je func是测试是否设置了零标志然后跳转到其他地方或继续下一条指令。
test cx, cx
je some_label
测试指令只对两个操作数进行按位AND,并根据AND结果设置FLAG。然后,je指令使用ZERO标志来决定跳转或继续。
上面的代码用于检查cx是否为零。
注意:je不是测试相等,而是测试在此之前由某些指令设置的ZERO标志。
答案 3 :(得分:2)
您通常会在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
答案 4 :(得分:1)
好吧,我终于找到了答案。 :P基本上你在cmp调用后调用je label_to_jump_to。
如果cmp显示两个值相等,则je将跳转到指定的标签。如果没有,它将继续执行。