汇编编程中跳转语句的区别

时间:2010-03-01 13:02:03

标签: assembly x86

你如何决定何时使用哪个跳转声明...如JG JNLE JNC这样的声明可以做同样的工作你如何区分它们?

3 个答案:

答案 0 :(得分:5)

你提到的跳跃都是条件代码值的跳转。

JG和JNLE是相同的:它们具有相同的操作码并执行相同的操作。一个是“如果大于”则跳跃,另一个是“跳跃,如果不小于或等于”。想一想。这些是签名分支,这意味着它们在确定是否分支时会考虑符号标记。

JNC表示“如果没有携带就跳”。如果未设置进位标志,它将跳转。 Carry通常用于检测算术溢出,例如添加2个无符号整数时。

答案 1 :(得分:4)

有些助记符只是指同一条指令。如果您对比较结果感兴趣使用jG JGE等。如果您对CPU标志感兴趣,请使用JC,JZ等。它只会提高代码的可读性

答案 2 :(得分:4)

当您在CX寄存器中有一个计数值时,通常会使用

J(E)CXZ来限制循环中的迭代。

JMP是一个无条件跳转,用于退出循环,在非基于CALL的界面中输入API,构建跳转表等。

Conditional jumps用于根据先前计算的条件更改执行的线程。有很多同义词(记录在我刚才提供的链接中),同义词通常是出于显而易见的原因。例如,JAE的意思是“如果高于或等于跳跃”。这是JNC的同义词,意思是“如果没有携带则跳转”和JNB,这意味着“如果不低于跳跃”。您使用的仅仅是让您的代码可以理解为读者:

  • 如果您刚刚进行了算术运算,您可能会对进位标志的状态感兴趣,因此您将其编码为JNC。
  • 如果您刚刚进行了比较(CMP操作),您可能会对JAE或JNB更感兴趣。您使用哪种方法取决于在描述逻辑时最有意义。

这实际上是语言设计中的一个经典问题:你是否制作了很多别名,使语法更复杂,有利于澄清语义,或者你是否以语义为代价来限制你的“关键词”(这里是操作码助记符)难读?