Assembly 汇编编程中跳转语句的差异

Assembly 汇编编程中跳转语句的差异,assembly,x86,Assembly,X86,您如何决定何时使用哪种跳转语句…JG JNLE JNC等语句可以执行相同的任务?如何区分它们?一些助记符只是引用相同的指令。如果您对比较结果是否使用jG JGE等感兴趣。如果您对CPU标志集感兴趣,请使用JC、JZ等。这只会增加代码的可读性。您提到的跳转都是条件代码值上的跳转 JG和JNLE是一样的:它们有相同的操作码,做相同的事情。一个是“大于时跳转”,另一个是“不小于或等于时跳转”。想想看。这些是有符号的分支,这意味着它们在确定是否分支时会考虑符号标志 JNC表示“无进位跳转”。如果未设置进

您如何决定何时使用哪种跳转语句…JG JNLE JNC等语句可以执行相同的任务?如何区分它们?

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

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

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

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

通常用于CX寄存器中有一个用于限制循环中迭代的计数值

是一种无条件跳转,用于退出循环、在非基于调用的接口中输入API、构建跳转表等

用于根据先前计算的条件更改执行线程。有很多同义词(在我刚才提供的链接中有记录),这些同义词通常都有明显的原因。例如,JAE的意思是“高于或等于跳转”。这是JNC和JNB的同义词,JNC表示“无进位跳转”,JNB表示“不低于进位跳转”。您所使用的代码完全是为了让读者能够理解您的代码:

  • 如果您刚刚做了一个算术运算,那么您可能会对进位标志的状态感兴趣,因此将其编码为JNC
  • 如果您刚刚进行了比较(CMP操作),您可能会对JAE或JNB更感兴趣。您使用哪一个取决于在描述逻辑时哪一个最有意义
这实际上是语言设计中的一个经典问题:你是制造了大量的别名,使语法更加复杂,从而有利于澄清语义,还是限制了你的“关键字”(这里的操作码助记符),而牺牲了语义更难阅读