代码之家  ›  专栏  ›  技术社区  ›  Shawn Mclean

条件跳转指令?

  •  1
  • Shawn Mclean  · 技术社区  · 15 年前

    进行编译器设计课程:

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

    无限条件跳转指令是什么意思?

    本书中的一个陈述示例:

    许多处理器都有条件跳转 仅用于有条件的说明 跳跃范围有限。为了 例如,跳跃的目标可能 不超过128字节 从当前程序计数器。 有时,这样的装配工 处理器仍然允许无限 条件跳转。

    我需要知道汇编程序编程才能理解这一点吗?

    我希望链接到参考资料以便进一步阅读。

    6 回复  |  直到 15 年前
        1
  •  3
  •   ChrisW    15 年前

    许多处理器只有有限范围的条件跳转指令。例如,跳转的目标与当前程序计数器的距离不能超过128字节。

    执行x86条件跳转 JNZ 例如,这意味着“如果处理器的零标志未设置,则跳转”(即 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远标 jz nearby_label --“jnz”替换为“jz”,意思是“如果标志不是零,就跳到远处的标签上”,它是“跳到附近的标签上”,因此如果标志是零,就不要跳到远处的标签上”(这意味着与您所写的内容相同,因为“如果不是零,就跳”意味着“如果是零,就不跳”)。
        2
  •  3
  •   Mark Rushakoff    15 年前

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

    如果错误地尝试将分支转移到离标签太远的地方,编译器会给出一个错误。

    当然,当你只有2K字的程序内存时,这些额外的字就可以产生不同的效果。

    文胸 转到 本身就是无条件跳转;但是,有几个条件分支命令,例如 bc (如果带分支) bz (如果为零,则分支), bnz (如果不是零,则进行分支)等,它们都检查上一次(算术)操作的状态寄存器,并且仅在指定条件为真时执行分支。

    如果你需要一个条件 古托 ,那么你就要

    DELAY
        nop
        nop
        decfsnz DelayCount
        goto DONE_WITH_DELAY
        bra DELAY
    

    在这里,我们执行两个no ops来暂时“休眠”;减少一个名为 DelayCount 如果 延迟计数 是零,然后我们无条件地跳转到标记为 DONE_WITH_DELAY 如果不是零,我们跳回到 DELAY 贴上标签,然后再做一次。( decfsnz 表示“减量 f ,如果不是零则跳过)

        3
  •  3
  •   Igor    15 年前

    关于 条件分支 ,可以从以下定义开始:

    Branch (computer science) 以下内容:

    有两种常见的分支形式 指令:一个条件分支 可采取或不采取, 取决于CPU等条件 标志和无条件分支 它总是被拿走的。

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

    关于 有限/无限范围 跳跃的范围:范围是记忆中跳跃指令地址和跳跃地址之间的“距离”。这个 Program counter 维基百科上的文章可以给你更多关于这件事的信息。

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

        4
  •  2
  •   John Gietzen    15 年前

    条件跳转将在逻辑上转换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
    

    现在,对于“无限条件跳转”,我假设它们是指远跳转?

        5
  •  1
  •   user181548    15 年前

    有条件跳转就像

    if (condition) goto
    

    在C语言中,无条件跳跃就像

    goto
    

    在C.

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

        6
  •  0
  •   Frank Bollack    15 年前

    简而言之:

    有条件的意思是

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

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

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