程序是如何执行的(二)控制结构的执行

一、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循环语句的执行

时间: 2024-10-11 06:48:38

程序是如何执行的(二)控制结构的执行的相关文章

黑马程序员——Java基础语法(二)---流程控制

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 本文主要介绍java基础语法中的流程控制,流程控制是我们写出灵活代码的基础.常见的流程控制主要有四类:判断结构.选择结构.循环结构.其他控制结构 一.判断结构 判断结构的标志是if语句,if语句主要有三种表现形式: 1.if(条件表达式) { 执行语句 } 注意: 1.如果if语句中只有一条语句,那么可以不写大括号.不过初学者一定要写括号,以免出错. 2.如果if语句没写大括号,if就只能控制

《卓有成效的程序员》----读书笔记二

六大方面对比Launchy和TypeAndRun(TAR) 对于快速启动工具,很多人都有自己的偏好,多次听到朋友介绍Launchy的好,虽然自己一直在使用着TAR,还是克制不住对于好软件的渴求,下载Launchy进行试用.很多软件都是有一个试用期的,也许新的软件确实不错,但是你习惯了以前使用的那个软件.今天就比较客观的将Launchy和TAR进行一下对比,从界面.上手速度到功能.自定义,以及软件的稳定性.占用资源进行详细的比较. [界面美观]Launchy:毫无疑问这是它的强项.1.0正式版自带

ASP.NET Web API 过滤器创建、执行过程(二)

前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器中,当然默认的基础服务也是有的,并且根据这些提供程序所获得的的过滤器信息集合进行排序.本篇就会对过滤器在创建完之后所做的一系列操作进行讲解. ASP.NET Web API 过滤器创建.执行过程(二) FilterGrouping过滤器分组类型 FilterGrouping类型是ApiController类型中的私有类型,它的作用就如同它的命名一样,用来对过

MVC应用程序请求密码的功能(二)

在完成<MVC应用程序请求密码的功能(一)>http://www.cnblogs.com/insus/p/3471534.html之后,如果你照着做,所有请求只会列在MailingList表中,并没发送出去. Insus.NET现在就继续下去,让这个功能能尽量完美下去. 在上一篇中,有一个存储过程: 在这个存储过程#38与#39行代码,是一个超链接,它是真正存在MVC的应用程序中.也就是说,给会员发送邮件时,就是把这个链接的视图发送至会员的邮箱中.因此,我们得创建这个视图. 创建这个视图,得先

回溯法-01背包问题之二:顺序执行模式

上文已讲述了回溯法以及01背包问题的原理,本文讲述如何顺序执行解决01背包问题以及通过模板模式重构软件. 一.顺序执行流程图 图1无剪枝函数的01背包问题顺序执行算法流程图 图2 有剪枝函数的01背包问题顺序执行算法流程图 无剪枝函数是通用的深度遍历算法,为了减少搜索深度可通过剪枝函数处理完全不可能的分枝.与递归方案的区别主要表现在i>=n后需要"回溯",即用后进先出的方式将物品逐个拿出. 二.执行代码 递归与顺序执行方法仅仅是实现方法Backtracking(int i)不同,

(二)slatstack远程执行

salt执行模块 在远程主机上运行预定义的或任意命令,也称为远程执行,是saltstack的核心功能. salt执行模块是由远程执行系统调用来执行各种各样的任务.这些模块提供的功能,如安装包,重启服务,远程命令运行,传输文件等. 远程执行命令: 命令格式 salt 目标 模块.方法 返回信息 salt '*' test.ping salt '*' cmd.run "uptime" salt 'salt-client.com' state.highstate -v test=True  

黑马程序员_类对象创建代码的执行顺序测试总结

class StaticCode { // 类的非静态成员变量(实例变量)定义语句: // 作用:用来存储对象的特有数据的成员变量. // 运行:当类对象被创建时就执行,按照顺序自上而下执行,和构造代码块平级.(即当有多个构造函数 // 代码块和多个非静态成员变量时,JVM按照自上而下的顺序来执行所有语句,包括构造代码块里的代码 // 和非静态成员的声明.) // 存储位置:非静态变量位于堆内存中的对象实体中. int num = 3; // 构造代码块 { System.out.println

Windows批处理 调用程序后 不等待子进程 父进程继续执行命令

从DOS过来的老鸟应该都知道批处理,这个功能在WINDOWS中仍然保留着.批处理 说白了就是把一系列DOS命令写在一个文本文件里,然后把这个文件命名为XXX.bat(WINXP以后的系统也可以命名为*.cmd),然后运行它就可 以一次执行一系列命令和程序了,当然也包括WINDOWS下的程序. 昨天处理一个问题时需要写一个批处理,批处理的前面运行了几个DOS命令,最后调用一 个WINDOWS程序.可问题是,调用的WINDOWS程序打开后,CMD命令提示符窗口不会关闭,而是要等待这个WINDOWS程

详述执行map reduce 程序的步骤(本地执行MR、服务器上执行MR)

MR程序的执行环境有两种:本地测试环境.服务器环境. 1.本地环境执行MR程序的步骤: (1)在windows下配置hadoop的环境变量 (2)拷贝debug工具(winutils)到HADOOP_HOME/bin (3)从源码中拷贝org.apache.hadoop.io.nativeio.NativeIO.java到我们的mr的src目录下,修改NativeIO.java.(大家可去http://download.csdn.net/detail/u013226462/9516657下载.)

iOS动画开发之二——UIView动画执行的另一种方式

iOS动画开发之二--UIView动画执行的另一种方式 上一篇博客中介绍了UIView的一些常用动画,通过block块,我们可以很方便简洁的创建出动画效果:http://my.oschina.net/u/2340880/blog/484457,这篇博客再介绍一种更加传统的执行UIView的动画的方法. 这种方式相比如block的方式,显得要麻烦一些,apple官方也推荐我们使用带block的创建动画的方式,我们可以将编程重心更多的放在动画逻辑的实现上.使用begin和commit方式主要分为三个