本文链接:http://www.orlion.ml/35/

一、概述

1、计算机中有两个主要的核心部件:CPU和内存,其中CPU负责运算而内存负责存储程序和相关的变量,每一条程序语句和变量都在内存中有对应的内存地址。

2、寄存器是CPU的存储单元,每一个CPU都会有通用寄存器来给程序使用,编号R1~R32,代表有32个通用寄存器。

3、CPU中的核心部件

(1)程序计数器PC(Program Counter)

  程序计数器是一个特殊的寄存器部件,程序执行时,PC始终指向内存中的某条指令语句(即该条语句的内存地址),然后CPU就是读取(PC)所指向的那条指令执行。

  在顺序执行程序语句时,PC通过顺序加1(32位CPU一个指令占4字节,64位8字节)自动指向下一条要执行的程序语句。但是对于一些控制结构语句如if else for while这时PC的值就不是顺序加1指向下一条语句了。

(2)指令寄存器IR(Instruction Register)

  指令寄存器也是一个特殊的寄存器,用来存放从内存中读取的指令。CPU从内存中读取指令到IR之后,由特定部件来解读这条指令,并执行相关的操作。

(3)算术逻辑单元ALU(arithmetic logic unit)

  ALU是处理器中进行真实运算的部件,执行指令时,CPU把寄存器中的值输入到ALU中,ALU做完运算后把结果存回寄存器

二、a=a+1

1、

对于a=a+1这条程序语句需要分解为三步,1、把变量a读取到某一个寄存器R存储,2、CPU对寄存器R的值进行计算,3、计算完成后将值存回内存

分解“a=a+1”的执行步骤:

第一步,CPU从地址300处读取第一条语句,CPU执行“读取a到R"语句,就会从地址1000出将a的值读到寄存器R中。

第二步,CPU从地址301处读取第二条语句,执行"R+1"语句,CPU会对R执行加1的操作

第三步,CPU从地址302出读取第三条语句,执行"将R存回a"语句,把寄存器R中变量a的值存回到内存中地址1000处。

2、汇编指令的概念

汇编指令由操作码和操作数组成,操作码是指令执行的基本动作,在load R1,(address)中,load是操作码,其后的寄存器R1和(address)都是操作数

  (1)"读取a到R"操作-load指令:

  load执行用来表示"CPU将内存中的a读取到寄存器R中"的操作。load指令需要有两个操作数。格式:load R1,(address),address是内存地址,(address)表示这个地址内存的值。例load R1,(1000)表示将地址1000处的变量值读取到寄存器R1中。

  (2)"R赋值"操作-mov指令:

  格式:mov R1,constant        mov用来将一个数赋给寄存器,mov指令有两个操作数前一个是寄存器,后一个是十六进制常数。例mov R1,0Ah表示将0Ah(十进制10)赋给寄存器R1。mov R2,R1表示将寄存器R1的值赋值给R2。

  (3)"R加1"操作-add指令

  格式:add R2,R1,constant    表示将R2=R1+constant。例add R2,R1,01h表示将寄存器R1中的值加1后将结果存到R2。例add R1,R1,R2表示将R1与R2的值相加将和存回R1。

  (4)减法指令-sub

  格式:sub R2,R1,constant  表示R2=R1-constant。例sub R3,R1,R2表示R3=R1-R2

  (5)左移位指令shiftl

  格式shiftl R2,R1,constant  表示R1寄存器的值左移constant位然后将值存入R2,左移一位就相当于乘以2,左移两位就相当与乘以4。例:

shiftl R2,R1,05h表示R2 = R1 * 2的5次方

  (6)右移位指令shiftr

  (7)"将R存回a"操作-store指令

  格式:store (address),R1     程序语句中的存回表示将寄存器R中的值存回到内存中。address是内存地址,(address)是要存回的值,R1是寄存器。例:store (500),R1表示将寄存器R1中的值存入到内存地址500处

3、a=a+1的完整执行过程

首先用汇编指令表示一下这个过程(a = 10;a = a + 1):

mov R1,0Ah
store (),R1
load R1,()
add R1,R1,01h
store (),R1

具体执行过程:

(1)CPU从地址301处开始执行,PC的值为301,CPU从地址301处读取mov指令到IR,解读并执行mov指令,给寄存器R1中的变量赋初值10,然后PC加1,指向下一条汇编指令

(2)PC值为302,CPU从地址302处读取store指令到IR,解读并执行store指令,将寄存器R1中的变量a的值存到内存地址1000处,然后PC加1指向下一条汇编指令

(3)PC的值为304,CPU从地址304处读取add指令到IR,解读并执行add指令,将寄存器R1中变量a的值加1,并将结果再存回寄存器R1,然后PC加1,指向下一条汇编指令。

本文参考书籍:《计算机科学导论:以Python为舟》

程序是如何执行的(一)a=a+1的更多相关文章

  1. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法

    这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...

  2. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...

  3. 检测到 LoaderLock:DLL"XXXX"正试图在OS加载程序锁内执行

    解决方法: ctrl+D+E或alt+ctl+e或使用菜单调试——>异常——>异常窗口——>Managed Debugging Assistants——>去掉LoaderLoc ...

  4. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码

    来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...

  5. 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。

    出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...

  6. 一个简单的mfc单页界面文件读写程序(MFC 程序入口和执行流程)

    参考:MFC 程序入口和执行流程  http://www.cnblogs.com/liuweilinlin/archive/2012/08/16/2643272.html 程序MFCFlie      ...

  7. MFC 程序入口和执行流程

    MFC(微软基础类库)以C++类的形式封装了Windows API,给开发者提供了便利,但是初学者常常会疑惑MFC程序的入口在哪里?下面给大家简单介绍一下MFC 程序入口和执行流程. 一 MFC程序执 ...

  8. 在AE二次开发中出“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”异常解决方案

    今天的一个项目总用到了AE的开发组件,也就是ESRI公司提供的一系列的开发包(组件)都是以dll(动态链接库的形式)然后今天在调试的时候却出现了“正试图在 OS 加载程序锁内执行托管代码.不要尝试在 ...

  9. PHP实现程序单例执行

    原创文章,转载请注明出处:http://huyanping.sinaapp.com/?p=222 作者:Jenner 一.场景描写叙述: 近期我们一块业务.须要不断的监听一个文件夹的变化.假设文件夹中 ...

  10. c# 程序调用cmd执行命令如SVN.exe

    c# 程序调用cmd执行命令如SVN.exe string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Di ...

随机推荐

  1. Jquery Mobile 学习笔记(一)

    1.模拟器,IOS:XCODE GENYMOTION  ANDROID:ECLIPSE GENYMOTION 2.jquery mobile data-role=page 代表一个页面 data-po ...

  2. uva-439

    题意:骑士在一个8*8的棋盘上移动,1-8代表行号,a-h代表列号,给出骑士的初始位置和目的位置,求骑士最少的移动步数:题目隐含一层意思(骑士移动规则是中国象棋的“马”的走法) 输入:一串字符串,包含 ...

  3. Centos配置查看

    Reference: [1] http://www.centoscn.com/CentOS/help/2013/0928/1743.html [2] http://www.cnblogs.com/hi ...

  4. 如果你觉得我的博客对你有帮助,请帮忙加点我所在团队博客访问量http://home.cnblogs.com/u/newbe/

    RT http://home.cnblogs.com/u/newbe/ 跪谢~

  5. requirejs按需加载angularjs文件

    之前分享了一篇用ocLazyLoad实现按需加载angular js文件的博客.本来当时想会使用一种方法就行了.可最近刚好有时间,在网上查找了一下requirejs实现angular js文件按需加载 ...

  6. JavaScript 基础第一天

    一.前言 如果将前端比喻成一人,那么Html就是这个人的骨骼脉络,CSS则是这个人的身上的装饰,JavaScript则是这个人的行为.作为一种脚本语言JavasSript具有着弱类型等特点.(在这里我 ...

  7. cas+shiro实现不时时的去请求cas进行身份验证

    cas+shiro不进行时时去cas验证身份信息,需要用shiro在当前系统有一份完整的认证机构. 那么有一个问题,什么时候去cas校验信息,目前的配置方式: cas系统设置默认的浏览器session ...

  8. (转)linux服务器安全配置攻略

    引言: 最小的权限+最少的服务=最大的安全 所以,无论是配置任何服务器,我们都必须把不用的服务关闭.把系统权限设置到最小话,这样才能保证服务器最大的安全.下面是CentOS服务器安全设置,供大家参考. ...

  9. linux上创建ftp服务器下载文件///使用AWS服务器作为代理,下载sbt相关的包

    最近觉得自己下载有些jar的速度太慢了,就在aws上下好了,然后转到我电脑上来,在aws上开了ftp服务器.结果就倒腾了一上午,作个记录,以便后面查看. 1.安装vsftpd yum -y insta ...

  10. C#异常Retry通用类

    系统里面常常调用服务和读写文件里面需要对发生异常,操作失败时进行Retry来尽可能程序的健壮性.最近工作中遇到了,参考了网上的资料,扩展了下.在博客里面备用下: //Retry机制 public st ...