一、if else选择语句
1、分支跳转指令
我们将用相应的汇编指令来表示"比较x是否小于y","选择跳转到语句块B"
(1)slt指令-"比较x是否小于y"
格式:slt R4,R1,R2。该指令用来表示比较寄存器R1中的值是否小于R2中的值,如果小于则将寄存器R4置1,否则置0;
格式:slt R4,R1,constant。该指令用来表示比较寄存器R1中的值是否小于常数值constant,如果小于则将寄存器R4置1,否则置0;
(2)sle指令-"判断小于或等于"
格式:sle R4,R1,constant。该指令比较寄存器R1和常数值constant,如果R1中的数值小于或等于constant,则寄存器R4置1,否则置0;
(3)beqz指令-"选择跳转到语句块操作"
格式:beqz R4,label。指令“beqz”来查看寄存器中的值是否为0。如果为0,CPU将不再按顺序执行下一条语句,而是跳转到另一个语句块。对于将要跳转到的语句块,我们可以用一个“标签(label)”来标记。beqz需要两个操作数,前一个操作数是存储比较结果的寄存器,另一个寄
存器是一个标签。(汇编程序中有些指令块用标签label1, label2等标记,执行时就可以根据条件跳转,或者直接跳转到这些指令块处执行)
例:beqz R4,label2,该指令表示如果寄存器R4中的数值为零则跳转到标签label2标记的指令块处
(4)goto指令-"直接跳转到语句块"
格式:goto label。表示直接跳转到标签label标记的指令处(没有判断)
2、if else 选择语句的执行
对于开头处图片的案例,我们假设已经把x、y读取到了寄存器R1和R2中,用汇编指令表示CPU在执行if else选择语句时的操作如下图:
(1)运行过程
首先slt指令比较x与y的大小,如果x小于y则寄存器R4值1,否则置零,第二步,beqz指令判断R4是否为0,如果为0则跳转到lable0处执行语句块B,然后顺序执行语句块C,如果R4为1则顺序执行语句块A,然后跳转到label1处,执行语句块C
(2)在CPU和内存中的执行过程
a:假设if else语句翻译成汇编指令从地址304处开始存储在内存中,x和y已经从内存地址1000、1001处读取到了寄存器R1和R2处
b:执行slt指令,CPU现将slt指令读取到指令寄存器IR中进行解读,然后CPU将R1和R2中的值转移到ALU中,对于比较运算,ALU通过减法来判断,最终将比较结果存回到寄存器R4中,PC加1,指向下一条指令beqz。
c:执行beqz指令,CPU先将beqz指令读取到指令寄存器IR进行解读,然后CPU判断寄存器R4的值
d:如果R4为0则执行步骤e、f,相反执行步骤g、h、i;
e:R4为0跳转至label0处执行,如果所示PC值变为401,指向label0处,即语句块B的第一条语句
f:执行完B中所有语句后结束if else 语句,此后PC值为501,顺序执行语句块C
g:R4为1则顺序执行语句块A的第一条语句,这时PC的值为306,执行语句块A中的第一条语句
h:顺序执行完A中所有语句后,PC值为400,指向goto指令
i:如上图,CPU执行goto指令,跳转到label1,如图中虚线2所示,PC值为500,执行执行语句块C结束if else选择语句
二、while循环语句的执行
三、for循环语句的执行