21

我正在尝试在线查找汇编语言函数“je”的用法。我读到 je 意味着如果相等则跳跃,这正是我想要的。这个函数的实际用法是什么,或者换句话说,我如何键入这个函数来检查一个值并在它等于某物时跳转?

请告诉我。

顺便说一句,如果这有所作为,我正在使用 NASM。

4

5 回答 5

22

假设您要检查是否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 ...
于 2009-10-17T19:14:03.953 回答
14

FLAGS如果设置了寄存器中的“相等标志”(也称为“零标志”),这将跳转。这被设置为算术运算的结果,或者像TESTand之类的指令CMP

例如:(如果我没记错的话,这是正确的:-)

cmp eax, ebx ; 从 EAX 中减去 EBX——结果被丢弃
                ; 但是FLAGS寄存器是根据结果设置的。
je .SomeLabel ; 如果结果为零(即它们相等),则跳转到某个标签。
                ; 这也是与“jz”相同的指令。
于 2009-10-17T19:11:50.853 回答
13

我不得不说 je func 是测试是否设置了零标志,然后跳转到其他地方或继续执行下一条指令。

test cx, cx
je   some_label

测试指令只是对两个操作数进行按位与,并根据与结果设置 FLAG。je 指令然后使用零标志来决定跳转或继续。

上面的代码用于检查 cx 是否为零。

  • 如果 cx 为零,test 将设置零标志,然后 je 将导致跳转到某个地方;
  • 如果 cx 不为零,test 不会设置零标志,je 将继续执行后面的指令。

注意:je 不是测试相等,而是测试在此之前由某些指令设置的零标志。

于 2011-05-25T03:40:28.673 回答
2

您通常会在前面je加上一个cmptest或等价的),它在 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
于 2009-10-17T19:11:48.910 回答
0

好吧,我终于找到了我的答案。:P 基本上你在 cmp 调用后调用 je label_to_jump_to。

如果 cmp 显示两个值相等,je 会跳转到指定的标签。如果没有,它将继续执行。

于 2009-10-17T19:10:52.680 回答