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