CPU 执行程序的秘密,藏在了这 15 张图里( 四 )
CPU 从程序计数器读取指令、到执行、再到下一条指令 , 这个过程会不断循环 , 直到程序执行结束 , 这个不断循环的过程被称为 CPU 的指令周期 。
文章插图
a = 1 + 2 执行具体过程知道了基本的程序执行过程后 , 接下来用 a = 1 + 2 的作为例子 , 进一步分析该程序在冯诺伊曼模型的执行过程 。
CPU 是不认识 a = 1 + 2 这个字符串 , 这些字符串只是方便我们程序员认识 , 要想这段程序能跑起来 , 还需要把整个程序翻译成汇编语言的程序 , 这个过程称为编译成汇编代码 。
针对汇编代码 , 我们还需要用汇编器翻译成机器码 , 这些机器码由 0 和 1 组成的机器语言 , 这一条条机器码 , 就是一条条的计算机指令 , 这个才是 CPU 能够真正认识的东西 。
下面来看看 a = 1 + 2 在 32 位 CPU 的执行过程 。
程序编译过程中 , 编译器通过分析代码 , 发现 1 和 2 是数据 , 于是程序运行时 , 内存会有个专门的区域来存放这些数据 , 这个区域就是「数据段」 。 如下图 , 数据 1 和 2 的区域位置:
- 数据 1 被存放到 0x100 位置;
- 数据 2 被存放到 0x104 位置;
文章插图
编译器会把 a = 1 + 2 翻译成 4 条指令 , 存放到正文段中 。 如图 , 这 4 条指令被存放到了 0x200 ~ 0x20c 的区域中:
- 0x200 的内容是 load 指令将 0x100 地址中的数据 1 装入到寄存器 R0;
- 0x204 的内容是 load 指令将 0x104 地址中的数据 2 装入到寄存器 R1;
- 0x208 的内容是 add 指令将寄存器 R0 和 R1 的数据相加 , 并把结果存放到寄存器 R2;
- 【CPU 执行程序的秘密,藏在了这 15 张图里】0x20c 的内容是 store 指令将寄存器 R2 中的数据存回数据段中的 0x108 地址中 , 这个地址也就是变量 a 内存中的地址;
上面的例子中 , 由于是在 32 位 CPU 执行的 , 因此一条指令是占 32 位大小 , 所以你会发现每条指令间隔 4 个字节 。
而数据的大小是根据你在程序中指定的变量类型 , 比如 int 类型的数据则占 4 个字节 , char 类型的数据则占 1 个字节 。
指令上面的例子中 , 图中指令的内容我写的是简易的汇编代码 , 目的是为了方便理解指令的具体内容 , 事实上指令的内容是一串二进制数字的机器码 , 每条指令都有对应的机器码 , CPU 通过解析机器码来知道指令的内容 。
推荐阅读
- 程序员为教师妻子开发应用:将iPhone变成文档摄像头
- 飞书文档微信小程序审核被卡?字节跳动副总裁谢欣:希望腾讯停止无理由封杀
- 多家快递暂停发往河北省快件,顺丰表示先暂停三天,京东小程序已无法下单
- 2021年换手机哪个配置最重要,CPU只能排第三位
- 8核Zen3 AMD新CPU现身:锐龙7 5700G
- 全新8核国产CPU深入探秘:马上能买到
- 字节跳动高管喊话腾讯,称“飞书文档”小程序审核被卡近两月
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 苹果改变立场 称macOS实用程序Amphetamine可继续留在Mac应用商店中
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回