Assembly 汇编语言je跳转函数

Assembly 汇编语言je跳转函数,assembly,conditional-statements,Assembly,Conditional Statements,我试图在网上找到汇编语言函数“je”的用法。我读到je的意思是如果相等的话跳跃,这正是我想要的。这个函数的实际用途是什么,或者换句话说,我如何键入这个函数来检查一个值并在它等于某个值时跳转 请让我知道 顺便说一句,如果有什么不同的话,我正在使用NASM。嗯,我终于找到了我的答案P基本上,在一次cmp呼叫后,你呼叫je标签到跳转到 如果cmp显示两个值相等,je将跳转到指定的标签。如果没有,它将保持执行流动。您通常会在je之前使用cmp(或test或等效项),在EFLAGS寄存器中设置标志。下面是

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

请让我知道


顺便说一句,如果有什么不同的话,我正在使用NASM。

嗯,我终于找到了我的答案P基本上,在一次cmp呼叫后,你呼叫je标签到跳转到


如果cmp显示两个值相等,je将跳转到指定的标签。如果没有,它将保持执行流动。

您通常会在
je
之前使用
cmp
(或
test
或等效项),在EFLAGS寄存器中设置标志。下面是NASM中一个简单的echo服务器的一个示例,它通常会有所帮助。忽略恼人的谷歌广告

je
的一个示例用法可能是:

    cmp eax, ebx
    je  RET_FAIL
    jmp RET_SUCCESS

RET_FAIL:
    push 1
    pop  eax
    ret

RET_SUCCESS:
    push 0
    pop eax
    ret
如果设置了
标志
寄存器中的“相等标志”(也称为“零标志”),则会跳转。这是由于算术运算或指令(如
TEST
CMP
)而设置的

例如:(如果我记性好,这是正确的:-)

cmp-eax,ebx;从EAX中减去EBX——结果被丢弃 ; 但是标志寄存器是根据结果设置的。 je.SomeLabel;如果结果为零(即,它们相等),则跳转到某个标签。
; 这也是与“jz”相同的指令。假设您想检查
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 ...

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

test cx, cx
je   some_label
测试指令只对两个操作数进行位AND运算,并根据AND结果设置标志。然后,je指令使用零标志决定跳转或继续

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

  • 如果cx为零,测试将设置零标志,那么je将导致跳转到某个地方
  • 如果cx不为零,测试将不设置零标志,je将继续执行后面的指令

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

Edsger Dijkstra肯定讨厌assembler;它充满了GOTO:-)它不必遵循
CMP
指令,尽管这是最常见的情况。正如其他人所说,
Jcc
指令可以跟随设置
标志的任何指令。这包括几乎所有的算术指令和其他一些指令。如果RET_失败之前出现RET_SUCCESS,您不需要第二次跳转。谢谢,这只是从一个未评分的学生的作业中复制意大利面。这里使用的是哪种汇编语法?它能检查除EAX之外的任何其他寄存器吗?
test cx, cx
je   some_label