有条件的跳转指令?

时间:2009-10-11 20:53:42

标签: compiler-construction cpu

进行编译器设计课程:

条件跳转指令是什么意思?我是基于C / C ++的程序员,所以如果该范例中有任何代码示例,您可以分享以帮助我更好地理解这一点。

无限条件跳转指令意味着什么?

书中声明的一个例子:

  

许多处理器都有条件跳转   指令仅适用于条件   跳跃范围有限。对于   例如,跳跃的目标可能   距离不超过128个字节   来自目前的计划柜台。   有时候,这样的汇编程序   处理器仍允许无限制   条件跳跃。

我是否必须了解汇编编程才能理解这一点?

我喜欢参考材料的链接以供进一步阅读。

6 个答案:

答案 0 :(得分:3)

关于条件分支,您可以从这个定义开始:

Branch (computer science)

  

有两种常见的分支形式   指令:一个条件分支   可以采取或不采取,   取决于诸如CPU之类的条件   标志和无条件分支   总是采取。

if, for, while C语句被编译为条件跳转程序集运算符。而goto语句被编译为无条件跳转运算符。

关于跳转的有限/无限范围:范围是跳转指令的地址和跳转的地址之间的内存中的“距离”。维基百科中的Program counter文章可以为您提供有关此事的更多信息。

为了理解这些主题,您不必了解汇编程序编程,但我建议您学习CPU架构的基础知识。

答案 1 :(得分:3)

我认为这解决了您的问题:例如,在Microchip PIC18F系列中,您有bra(分支)命令和goto命令。它们实际上是相同的,但区别在于bra命令只能从其位置跳转到-1024到+1023个字的位置,并且它只使用一个程序存储器字。 goto命令可以在程序存储器中的任何地方,但它需要两个字的程序存储器才能允许跳转到任何地方。

如果你错误地尝试分支到太远的标签,编译器会给你一个错误。

当你只有2K字的程序记忆时,这些额外的词会有所作为。

bragoto本身就是无条件的跳跃;但是,有几个条件分支命令,例如bc(分支,如果进位),bz(分支,如果为零),bnz(分支,如果不是零)等,所有检查状态寄存器来自最后一次(算术)操作,只有在指定条件为真时才执行分支。

如果您需要条件goto,那么您将拥有类似

的内容
DELAY
    nop
    nop
    decfsnz DelayCount
    goto DONE_WITH_DELAY
    bra DELAY

我们执行两次无操作以暂时“睡觉”;递减名为DelayCount的“变量”,如果DelayCount为零,则我们无条件地跳转到标记为DONE_WITH_DELAY的代码;如果它不为零,我们跳回到DELAY标签并再次执行。 (decfsnz表示“减少f,如果不是零则跳过”

答案 2 :(得分:3)

  

许多处理器只对条件跳转有条件跳转指令。例如,跳转的目标可能不会超过当前程序计数器的128个字节。

JNZ为例进行x86条件跳转,这意味着“如果未设置处理器的零标志则跳转”(processor flags将由先前的算术运算设置或清除。)

JNZ操作码有一个操作数,表示跳转多远。对于JNZ操作码,操作数使用单个字节进行编码(即只将操作码解释为操作数后的第一个字节;下一个字节是下一个操作码的开头),因此它可以指定跳转不超过正负128个字节。

[它使用一个短的1字节操作数,因为短跳是最常见的情况,这种最常见情况的优化有助于使整个代码更小]。

  

有时,这种处理器的汇编程序仍允许无限制的条件跳转。

这意味着当您在高级程序集中编写时,可以编写...

jnz distant_label
[other instructions]
distant_label:

...即使远距离标签超过128个字节。当CPU本身只支持短条件跳转时,它怎么能做到这一点?可能是因为汇编程序(它'汇编'你的汇编语言,就像编译器一样)会自动插入一些额外的必要操作码,这样实际上最终发出的东西就像... ...

jz nearby_label
jmp distant_label
nearby_label:
[other instructions]
distant_label:

......其中:

  • 而不是jnz distant_label jmp distant_label - JMP是无条件跳转,它具有更大的操作数,可以无限制地跳跃
  • 而不是jnz distant_labeljz nearby_label - 'JNZ'被'JZ'取代,这意味着代替“如果标志不为零则跳转到远处标签”它会“跳转到附近的标签” ,所以不要做远跳,如果标志为零“(最终意味着与你所写的相同,因为”如果不为零则跳跃“意味着”如果为零则不跳“)

答案 3 :(得分:2)

条件跳转会在逻辑上转换这个if语句:

if(a == b)
{
  // do something
}

// do something else

进入这个:

if(!(a==b)) goto somethingElse;
// do something

somethingElse:
// do something else

然后if(!(a==b))行将变为汇编命令:

CMP A, B
JNE somethingElse

现在,至于“无限条件跳跃”,我认为它们意味着远距离跳跃?

答案 4 :(得分:1)

条件跳转就像

if (condition) goto
C中的

无条件跳转就像

goto

在C。

我不知道“无限”意味着什么。它可能特定于正在讨论的特定处理器。

答案 5 :(得分:0)

简而言之:

条件意味着类似

if(condition)
{
  //condition met
}
else
{
  //condition no met
}

这意味着程序流程根据条件表达式而改变。

无条件跳转是goto语句或函数调用的典型编译器实现。