美文网首页
比较和跳转指令

比较和跳转指令

作者: rustydaar | 来源:发表于2016-11-20 19:40 被阅读0次

所有的体系结构都必须要有比较和条件跳转,虽然很多相似之处,但是各个体系结构都有自己的一套实现。

SPARC使用4种传统的状态位:负数,零,进位,和溢出。所有的算术和逻辑指令都可能设置它们,旧的体系结构中,这些位可能被所有的指令设置。明确的操作更利于流水线的实现。虽然状态位可能被其他操作影响,但是显式的比较可以用r0作为目的寄存器来生成。SPARC的条件跳转会比较所有的条件位来确定所有可能的跳转。浮点使用专门的条件位。第9版SPARC分支跳转扩展了4种情况:一个是为64bit设计的独立的条件编码;一个是跟0的各种情况比较(参考下面的MIPS);3种新的浮点条件码;最后是静态编码了的分支预测。

PowerPC也是用四种状态编码:小于,大于,等于,以及溢出,不过存在8份拷贝。这种冗余设计本质上来说,就是为PowerPC多添加了8个4位寄存器,让PowerPC的指令在使用状态的时候减少冲突。每个状态码都可以是一个比较指令的目的,也可以是一个条件跳转的源。整数指令有一个可选位,来标识这个整数操作后是否有一个与零比较来设置状态寄存器。浮点指令也可以选择设置第二个状态寄存器。PowerPC提供对这8个4位寄存器的逻辑操作(CRAND,CROR,CRXOR,CRNAND,CRNOR,CREQV),为单条的分支指令提高更复杂的条件比较。

MIPS用寄存器来获取分支状态。可以用任意的两个寄存器来构造一条相等(BEQ)或者不相等(BNE)指令,通过他们的结果来决定分支是否跳转。小于置位指令(SLT,SLTI,SLTU,SLTIU)比较两个操作数然后设置目的寄存器,如果小于就设置为1,否则就将目的寄存器设置为0。这些指令就可以组合出所有的可能。因为跟0比较很常见,所以MIPS还包括一些特殊的跟0的比较跳转指令:大于等于0(BGEZ),大于0(BGTZ),小于等于0(BLEZ),还有小于0(BLTZ)。当然,等于或者不等于也可以由r0跟BEQ和BNE组合出来。跟SPARC一样,MIPS I为浮点比较和跳转指令提供一个单独的状态码;MIPS IV将状态码扩展到8个,来标识浮点的比较和条件指令状态。

Alpha指令(CMPEQ,CMPLE,CMPLE,CMPULT,CMPULE)比较两个寄存器的值,然后设置第三个寄存器的值,条件为真设置为1,否则这是为0。浮点指令(CMTEQ,CMTLT,CMTLE,CMTUN)在判断条件为真的时候将结果设置为2.0,否则设置为0。分支指令将一个寄存器的值跟0比较(BEQ,BGE,BGT,BLE,BLT,BNE),或者它的最低有效位(BLBC,BLBS),如果条件成立就跳转。

PA-RISC有很多分支选项,我们在“Alpha的指令独特点”小结会看到。最直接的是比较并且跳转(COMB),比较两个寄存器,然后根据它们的结果来判断是否跳转,并且测试比较的最低有效位。

ARM跟SPARC类似,指令中提供四种可以选择设置的状态条件码。CMP用一个操作数减去另外一个操作数的结果来设置状态位。负数比较(MN)用一个操作数加上另外一个操作数,用和来设置状态位。TST用两个操作数逻辑与来设置所有的状态码,TEQ用独有的或操作来设置前三个状态码。跟SPARC一样,ARM分支指令通过测试状态位来判断所有的有符号和无符号关系。我们会在“SPARC v.9的指令独特点”中看到,ARM的一个不常用的特点是,每条指令都可以根据状态码来选择是否执行。(这个PA-RISC的选项类似,见“Alpha的独特点”)。

显然的,Thumb跟ARM很像。不同的地方是状态码不再可选,没有了TEQ指令,也没有了条件执行的指令。

Hitachi SuperH只有一个单独的T状态位,可以通过比较指令设置。两个分支指令可以用来跳转,在T位是1的时候跳转(BT)或者T位是0的时候(BF)。这两种分支可以减少比较指令。

M32R也只有一个单独的条件状态码(C),有符号比较和无符号比较(CMP,CMPI,CMPU,CMPUI)都用C位来标识一个寄存器的值是否小于另一个,就像MIPS的小于置位指令一样。灵感废纸指令测试C位是否为1或0:BC和BNC。M32R也包含相等跳转,不相等跳转(BEQ和BNE),以及一个寄存器值跟0比较(BGEZ,BGTZ,BLEZ,BLTZ,BEQZ,BNEZ).后面这些都是32位宽指令。

MIPS16保留了小于置位指令(SLT,SLTI,SLTU,SLTIU),但是不再将结果放到8个寄存器中,而是放到一个专门的T寄存器。MIPS16总是在完整的32位MIPS指令集机器上面实现,所以,T寄存器实际上就是完整MIPS体系结构中的寄存器24。MIPS16的分支指令测试一个寄存器是否等于0(BEQZ和BNEZ)。也有测试T寄存器是否为0的(BTEQZ和BTNEZ)。为了测试两个寄存器中的值是否相等,MIPS还添加了比较指令(CMP,CMPI),指令会把或的结果存到T寄存器。MIPS16删减了寄存器是否等于的比较跳转(BEQ和BNE)。

图18和图19汇总了条件分支的设计。

图18桌面RISC条件分支汇总。PA-RISC的浮点分支实现需要将FP状态寄存器拷贝到整数寄存器,然后用分支指令测试FP的比较结果。SPARC的整数比较是由使用R0作为目的寄存器的算术指令组合出来的。 图19嵌入式RISC条件分支汇总

相关文章

  • 比较条件跳转指令

    比较条件跳转指令类似于比较指令和条件跳转指令的结合体,它将比较和跳转两个步骤二合为一。 这里指令有:if_icmp...

  • 比较和跳转指令

    所有的体系结构都必须要有比较和条件跳转,虽然很多相似之处,但是各个体系结构都有自己的一套实现。 SPARC使用4种...

  • 条件跳转指令

    条件跳转指令通常和比较指令结合使用。在条件跳转指令执行前,一般可以先用比较指令进行栈顶元素的准备,然后进行条件跳转...

  • <> 一

    1.入门指令 jz指令:跳转指令,可以理解成如果前面比较指令的比较结果相同则跳转到指定的地址;jnz指令:与jz指...

  • ARM 汇编指令学习:[2]ARM指令集

    ARM 汇编指令学习:[2]ARM指令集 一、跳转指令 1、 B(跳转指令)及BL(带返回跳转指令) 其中: L决...

  • Cortex-M0指令集——B

    跳转指令: (1)可条件执行的跳转指令 B 此指令在计算跳转地址时...

  • ARM汇编之跳转指令

    b跳转指令 单个标签 可以有多个同名数字标签 bl跳转指令 bl跳转指令在执行的时候,自动将当前指令下一条指令的地...

  • Cortex-M0指令集——BX

    跳转指令: 跳转到寄存器指定的地址和指令。ARMv6-M只支持Thumb状态。试图改变指令执行状态会导致异常。 B...

  • 2020-08-26(比较和条件跳转指令)

    比较指令CMP 比较指令 该指令是比较两个操作数的,相当于SUB指令,不保存结果,只改变标志位. 例如 :当两个操...

  • 逆向 - 汇编 - 第四天

    Call 指令和 ret 指令 Call 指令:将下一条指令的偏移地址入栈;跳转到定位的地址, 执行指令; ret...

网友评论

      本文标题:比较和跳转指令

      本文链接:https://www.haomeiwen.com/subject/gnsypttx.html