程序的执行

CPU执行指令时:

1、首先,CPU读取程序计数器(PC,program counter)指针指向的指令,将它导入指令寄存器(IR, Instruction Register),具体来说,完成读取指令有3个步骤:

  1. CPU的控制单元操作地址总线指定需要访问的内存地址。(简单理解,就是把PC指针中的值拷贝到地址总线中)。
  2. CPU通知内存设备准备数据。
  3. CPU收到内存传来的数据后,将这个数据存入指令寄存器。

完成以上3步,CPU成功读取了PC指针指向指令,存入了指令寄存器。

然而,CPU分析指令寄存器中的指令,确定指令的类型和参数。如果是计算类型的指令,那么就交给逻辑运算单元计算;如果是存储类型的指令,那么由控制单元执行。

PC指针自增,准备获取下一条指令。

比如在32位的机器上,指令是32位4个字节,需要4个内存地址存储,因此PC指针会自增4。

 以a=11+15为例。

我们再 Review 下这个问题:程序员写的程序a=11+15是字符串,CPU 不能执行字符串,只能执行指令。所以这里需要用到一种特殊的程序——编译器。编译器的核心能力是翻译,它把一种程序翻译成另一种程序语言。

这里,我们需要编译器将程序员写的程序翻译成 CPU 认识的指令(指令我们认为是一种低级语言,我们平时书写的是高级语言)。

下面我们来详细阐述 a=11+15 的执行过程:

1.编译器通过分析,发现 11 和 15 是数据(代码我们会指明数据类型),因此编译好的程序启动时,会在内存中开辟出一个专门的区域存这样的常数,这个专门用来存储常数的区域,就是数据段,如下图所示:

11 被存储到了地址 0x100;

15 被存储到了地址 0x104;

  

2.编译器将a=11+15转换为4条指令,程序启动后,这些指令被导入了一个专门用来存储指令的区域,也就是正文段,如上图所示,这4条指令被存储到了0x200-0x20c的区域中:

 0x200 位置的 load 指令将地址 0x100 中的数据 11 导入寄存器 R0;

0x204 位置的 load 指令将地址 0x104 中的数据 15 导入寄存器 R1;

0x208 位置的 add 指令将寄存器 R0 和 R1 中的值相加,存入寄存器 R2;

0x20c 位置的 store 指令将寄存器 R2 中的值存回数据区域中的 0x1108 位置。

3.具体执行的时候,PC 指针先指向 0x200 位置,然后依次执行这 4 条指令。

这里还有几个问题要说明一下: 

1.变量 a 实际上是内存中的一个地址,a 是给程序员的助记符。
2.为什么 0x200 中代表加载数据到寄存器的指令是 0x8c000100,我们会在下面详细讨论。

3.不知道细心的同学是否发现,在上面的例子中,我们每次操作 4 个地址,也就是 32 位,这是因为我们在用 32 位宽的 CPU 举例。在 32 位宽的 CPU 中,指令也是 32 位的。但是数据可以小于 32 位,比如可以加和两个 8 位的字节。

4.关于数据段和正文段的内容,会在模块四进程和线程部分继续讲解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值