程序是如何执行的(一)a=a+1

本文详细解析了计算机CPU的核心组成部分及其工作原理,包括程序计数器、指令寄存器、算术逻辑单元等关键部件,并通过实例阐述了如何执行'a=a+1'这一基本操作的全过程,涉及读取、计算、存储等步骤,以及汇编指令的使用,为读者提供了一次全面的CPU指令执行流程学习之旅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文链接: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 (1000),R1
load R1,(1000)
add R1,R1,01h
store (1000),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为舟》

 

文本(Halstead)复杂度是种软件度量方法,用于评估程序的难度,它考虑了源代码的长度和结构。这里我们主要关注两个指标:程序长度(L)和程序体积(V)。对于给定的代码片段: ```java a=1; if (a>10): a=a+2; else: a=a+5; b=4; c=a*b; return c; ``` 首先,我们忽略注释和空白,然后逐行统计指令数(指令集是基本的算术、比较和逻辑操作): 1. 定义变量a: 1条指令 2. 条件判断(包含个if...else): 这里有两个独立的路径,每个路径包含1条增量操作,所以是2条指令 - 如果分支:1条加法 - 否则分支:1条加法和1条赋值b 3. 计算c = a * b: 乘法操作1条 4. 返回c: 1条返回指令 将它们相加得到总指令数(L): L = 1 + 2 + 1 + 1 = 5 接下来计算程序体积(V),它是指令数乘以不同的运算符种类的组合。通常假设有两个基本操作:赋值(如a=1)和条件操作(如if...else)。这里我们可以假设有两到三种操作(如果、赋值、算术),所以V大约是L的倍至三倍之间,但精确值取决于实际代码中有多少种独特的运算符。 为了简化计算,假设这里有三个操作符种类(条件、赋值、算术),则V ≈ L = 5。 最后,Halstead复杂度公式通常是M = V / L 或 M = (L + D) / (V + N),其中D是数据复杂度(常量的数量),N是语句的分支数。在这里,由于没有提供具体的D和N值,我们将只计算程序长度L和体积V。 所以,程序长度L = 5,如果假设体积V ≈ L,则V = 5。实际的M值需要更多上下文信息才能准确计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值