指令集架构如何检查操作结果?
条件分支指令主要用于两种情况。最常见的情况是检查指令结果是否符合指定条件,例如结果是否等于 0、是否为负数等等。
如果满足指定条件,控制权将转移到程序中的指定位置。另一种常见情况是比较两个操作数,例如判断它们是否相等,如果满足指定条件,则控制权转移到指定位置。
指令集架构 (ISA) 检查操作结果有两种基本方法,例如结果状态概念和直接检查概念。
结果状态概念
结果状态概念假设在相关 ISA 中声明了一个结果状态。它以条件码或标志的形式表示。结果状态包含与运算结果相关的信息,例如结果是否为 = 0、< 0 等等。在此概念中,指令执行期间会自动检查运算结果是否符合特定条件,例如 = 0、< 0 等等。
例如,如果加法运算的结果随后在除法运算中用作除数,则可以按如下方式检查算术运算的结果 −
add r1, r2, r3; // r1←(r2)+(r3)
beq zero; // 测试结果是否等于零,如果是,则分支到位置"零"
div r5, r4, r1; // r5←(r4)/(r1) …………
零://处理除数等于零的情况
此外,架构还必须提供一些特定的指令来检查生成的任何操作数值的相关条件,并相应地设置结果状态。
直接检查概念
直接检查概念是检查运算结果的另一种基本方法。在这种情况下,不声明结果状态。而是根据需要,使用专用指令直接检查运算结果是否符合指定条件。如果满足指定条件,则启动条件分支。
当通过两条单独的指令实现直接检查时,首先通过适当的比较指令检查结果值。该指令将检查结果写入选定的寄存器。条件分支指令用于测试已存储的测试结果,如果满足指定条件,则分支到指定区域,如下例所示 −
add r1, r2, r3; cmpeq r7, r1; // r7←true,if (r1)=0,else NOP bt r7, zero; // 分支到"零":if (r7) = true, else NOP div r5, r4, r1; …….. 零:
在此示例中,cmpeq(比较相等)指令测试寄存器 r1 的内容是否为零,如果 (r1) = 0,则将布尔值"真"设置为寄存器 r7。后续的 bt(若真则分支)指令查询寄存器 r7 中存储的布尔值,如果存储的值为"真",则启动到标签"零"的分支。

