2010-03-01 35 views

回答

4

J(E)CXZ通常用于当你有在您使用限制循环迭代的CX寄存器中的计数值。

JMP是用来退出循环,在非基于呼叫界面输入的API,建立跳转表无条件跳转等

Conditional jumps用来更改基于以前的计算条件的执行线程。有很多同义词(记载在我刚刚提供的链接中),同义词通常是由于明显的原因。例如,JAE的意思是“如果高于或等于跳跃”。这是JNC的同义词,意思是“如果不携带则跳”和JNB,意思是“如果不在下面跳”。您使用纯粹是使你的代码可以理解读者的问题:

  • 如果你只是做了一个算术运算,你可能有兴趣在进位标志的状态,所以你” d将其编码为JNC。
  • 如果你刚刚做了比较(CMP操作),你可能会更感兴趣,JAE或JNB。你使用哪一个取决于描述逻辑时哪个最有意义。

这实际上是在语言设计的一个经典问题:你的牺牲使大量的别名,使得语法更复杂的有利于澄清语义的,还是你限制你的“关键词”(操作码助记符这里)的语义难以阅读?

4

一些助记符只是指相同的指令。如果你对比较的结果是否感兴趣,请使用jG JGE等。如果你对CPU标志设置感兴趣,可以使用JC,JZ等。它只会增加代码的可读性

5

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

JG和JNLE是相同的:它们具有相同的操作码和做同样的事情。一个是“跳大于”,另一个是“跳不小于或等于”。想想看。这些是已签署的分支,这意味着他们在确定是否分支时考虑标志标志。

JNC的意思是 “如果跳不进”。如果进位标志没有设置,它将跳转。进位常用于检测算术溢出,例如,添加2个无符号整数时。