程序是如何执行的(二)控制结构的执行
来源:互联网 发布:借钱软件 编辑:程序博客网 时间:2024/05/18 01:09
一、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循环语句的执行
- 程序是如何执行的(二)控制结构的执行
- 程序是如何执行的(二)控制结构的执行
- 计算机是如何执行程序的
- 计算机是如何执行程序的
- Dalvik虚拟机是如何执行程序的
- 程序是如何执行的(三)函数调用
- 程序是如何执行的(三)函数调用
- 程序是如何执行的(三)函数调用
- 程序是怎么执行的??
- 程序是怎么执行的
- FAQ4:Windows的执行程序是如何加载的?
- jsp是如何执行的
- springMVC是如何执行的?
- 操作系统执行可执行程序时,内存是如何分配的?
- 程序是如何被计算机所执行的?
- 程序是如何被计算机所执行的?
- ppc控制面板程序的执行参数
- 程序是如何执行的(一)a=a+1
- Struts核心业务之请求数据的自动封装
- MAMP 数据库文件的位置
- 解决微信授权回调页面域名只能设置一个的问题 [php]
- 图的两种存储结构及其互相转换
- tiny4412内核自带led驱动分析
- 程序是如何执行的(二)控制结构的执行
- 原始套接口的ping命令编程
- 命令模式
- 摩尔定律还有效吗?
- 每个开发人员都应该知道的 10 个 Linux 命令
- 归一化的学习心得
- 断点续传的mvp
- 一个要重新奋斗的初学码农
- openssl vs2015编译静态库