指令集架构如何检查操作的结果?


条件分支指令主要用于两种情况。最常见的是用来检查指令结果是否满足指定条件,例如结果是否等于 0,是否为负数等等。

如果满足指定的条件,则控制权转移到程序中的指定位置。另一种常见的情况是比较两个操作数,例如询问它们是否相等,然后如果满足指定的条件则跳转到指定位置。

指令集架构 (ISA) 检查操作结果有两种基本方法,分别是结果状态概念和直接检查概念。

结果状态概念

结果状态概念假设在相关的 ISA 中声明了一个结果状态。它以条件码或标志的形式表示。结果状态保存有关操作结果的相关信息,例如结果是否 = 0,< 0 等等。在这个概念中,操作的结果在指令执行期间会自动针对特定条件(如 = 0,< 0 等)进行检查。

例如,如果加法运算的结果随后在除法中用作除数,则可以如下检查算术运算的结果:

add r1, r2, r3; // r1←(r2)+(r3)

beq zero; // 测试结果是否等于零,如果是则跳转到位置 'zero'

div r5, r4, r1; // r5←(r4)/(r1)
…….

zero: // 处理除数等于零的情况

此外,架构还必须提供一些特定的指令来检查任何已生成的运算数值的相关条件,并相应地设置结果状态。

直接检查概念

直接检查概念是检查操作结果的另一种基本替代方案。在这种情况下,没有声明结果状态。相反,如果需要,可以使用专用指令直接检查操作结果是否满足指定条件。如果满足指定条件,则启动条件分支。

当通过两个单独的指令实现直接检查时,首先通过适当的比较指令检查结果值。此指令将检查结果写入选定的寄存器。条件分支指令用于测试存储的测试结果,并在满足指定条件时跳转到给定区域,如下例所示:

add r1, r2, r3;
cmpeq r7, r1; // r7←true,if (r1)=0,else NOP
bt r7, zero; // branch to ‘zero’: if (r7) = true, else NOP
div r5, r4, r1;
……..
zero:

在此示例中,cmpeq(比较是否相等)指令测试寄存器 r1 的内容是否为零,如果 (r1) = 0,则将布尔值 'true' 设置到寄存器 r7 中。随后的 bt(如果为真则跳转)指令查询寄存器 r7 中存储的布尔值,如果存储的值为 'true',则启动到标签 'zero' 的跳转。

更新于: 2021-07-23

318 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.