当前位置: 首页 > article >正文

一条指令,是怎么被机器读懂的

你每次敲下一行代码按下运行屏幕上出现结果。这个过程看起来很自然自然得像呼吸一样。但在这个过程里有一件事情发生得悄无声息大多数人从来没有想过你写的那行代码最终变成了什么才能被机器执行答案是它变成了一串二进制数字。一串0和1。但这串0和1不是随机排列的。它有结构有格式有严格的规定规定哪几位是什么意思哪几位控制什么行为。这个结构叫做机器指令的位字段划分。一、先从一个比喻开始想象你是一个工厂的调度员。你需要给工人发指令但你不能说话只能发一张卡片。卡片上有固定的格子每个格子填不同的内容。第一个格子填做什么搬运、组装、检测、包装。第二个格子填用什么工具叉车、手推车、传送带。第三个格子填从哪里取仓库A、仓库B、生产线1。第四个格子填放到哪里成品区、半成品区、废料区。工人拿到卡片看每个格子就知道该做什么了。机器指令就是这张卡片。CPU拿到一条指令看指令里的每个字段就知道该做什么操作操作哪些数据结果放到哪里。不同的是工厂卡片上填的是文字机器指令里填的是二进制数字。二、一条指令到底长什么样不同的处理器架构指令的格式不一样。但它们都有一个共同点一条指令是固定长度或者有限几种长度的二进制串被划分成若干个字段每个字段有固定的位置和含义。我们用一个简化的例子来说明。假设我们设计一个简单的处理器指令长度是16位。这16位被划分成这样| 操作码 | 寄存器1 | 寄存器2 | 立即数/偏移量 | | 4位 | 3位 | 3位 | 6位 |总共16位分成四个字段。每个字段有自己的名字有自己的位置有自己的含义。这就是位字段划分。三、操作码告诉CPU做什么第一个字段叫做操作码英文是OpcodeOperation Code的缩写。它是指令里最重要的字段因为它告诉CPU这条指令要做什么操作。在我们的例子里操作码占4位。4位能表示多少种操作2的4次方16种。也就是说这个处理器最多支持16种不同的指令。比如0000 → 加法ADD 0001 → 减法SUB 0010 → 乘法MUL 0011 → 除法DIV 0100 → 加载数据LOAD 0101 → 存储数据STORE 0110 → 跳转JUMP 0111 → 条件跳转BRANCH ……CPU拿到一条指令第一件事就是读操作码判断这是什么类型的指令然后决定接下来怎么处理其他字段。操作码是指令的动词。没有动词其他字段都没有意义。四、寄存器字段告诉CPU操作谁操作码告诉CPU做什么但做什么操作总得有操作对象。操作对象通常是寄存器里的数据。寄存器是CPU内部的一小块存储空间速度极快但数量很少。在我们的例子里有两个寄存器字段各占3位。3位能表示多少个寄存器2的3次方8个。也就是说这个处理器有8个通用寄存器编号从0到7用二进制表示就是000到111。一条加法指令可能长这样0000 001 010 000000 操作码 寄存器1 寄存器2 未使用 ADD R1 R2意思是把寄存器1和寄存器2里的数相加。结果放哪里不同的设计有不同的规定。有的设计结果放回寄存器1。有的设计有第三个寄存器字段专门指定结果放哪里。有的设计结果放在一个固定的累加器寄存器里。这些都是设计选择没有绝对的对错只有适不适合这个处理器的应用场景。五、立即数字段直接把数字塞进指令里有时候你不想从寄存器里取数你想直接用一个固定的数字。比如你想把寄存器1里的值加上5。这个5不在任何寄存器里它就是一个常数。这种情况就用到了立即数字段。立即数就是直接嵌在指令里的数字。在我们的例子里最后6位可以用作立即数。6位能表示的无符号整数范围是0到63。如果用补码表示有符号整数范围是-32到31。一条加立即数的指令可能长这样1000 001 000 000101 操作码 寄存器1 未用 立即数 ADDI R1 5意思是把寄存器1里的值加上5结果放回寄存器1。立即数字段让指令可以直接携带数据不需要额外的内存访问执行速度更快。但立即数的位数有限能表示的数字范围也有限。如果你需要用一个很大的数字就需要先把它加载到寄存器里再进行操作。这是一个设计上的权衡立即数字段越宽能表示的数字范围越大但指令里留给其他字段的位数就越少。六、偏移量字段告诉CPU去哪里找数据除了立即数最后那几位还可以用作偏移量。偏移量是用来计算内存地址的。比如你想从内存里加载一个数据到寄存器但内存地址很大放不进指令里。怎么办用一个寄存器存基地址用偏移量表示相对于基地址的距离。实际地址 基地址寄存器里的值 偏移量一条加载指令可能长这样0100 001 010 000100 操作码 目标寄存器 基址寄存器 偏移量 LOAD R1 R2 4意思是从内存地址R2的值 4处加载数据到R1。这种寻址方式叫做基址加偏移寻址是非常常用的一种内存访问方式。数组的访问就是这样实现的。R2存数组的起始地址偏移量是元素的索引乘以元素大小。七、真实世界里的指令格式我们上面说的是一个简化的例子。真实的处理器指令格式更复杂但原理是一样的。来看一个真实的例子MIPS架构。MIPS是一个经典的RISC架构指令长度固定为32位有三种基本的指令格式。R型指令寄存器型| op | rs | rt | rd | shamt | funct | | 6位 | 5位 | 5位 | 5位 | 5位 | 6位 |op操作码6位。rs第一个源寄存器5位能表示32个寄存器。rt第二个源寄存器5位。rd目标寄存器5位结果写入这里。shamt移位量5位用于移位指令。funct功能码6位配合op进一步指定操作类型。R型指令用于寄存器之间的运算比如加法、减法、逻辑运算。I型指令立即数型| op | rs | rt | immediate | | 6位 | 5位 | 5位 | 16位 |I型指令有一个16位的立即数字段能表示的范围更大。用于加载、存储、条件分支以及带立即数的运算。J型指令跳转型| op | target | | 6位 | 26位 |J型指令大部分位都用来表示跳转目标地址用于无条件跳转。三种格式应对三种不同的需求在指令长度固定的前提下尽可能高效地利用每一位。八、位字段划分背后的设计哲学看到这里你可能会想为什么要这么设计为什么不直接用更长的指令把所有信息都放进去不用这么抠门地分配每一位这背后有几个核心的设计考量。第一硬件实现的复杂度。指令越长解码电路越复杂芯片面积越大功耗越高成本越贵。固定长度的指令解码电路可以做得非常简单每个字段在固定的位置直接读取就行不需要复杂的解析逻辑。第二内存和带宽。指令存在内存里CPU从内存里取指令。指令越短同样大小的内存能存更多指令从内存取指令的带宽消耗也更小。第三流水线的效率。现代CPU用流水线来提高执行效率同时处理多条指令的不同阶段。固定格式的指令流水线的各个阶段可以并行工作不需要等前一条指令解码完才能开始解码下一条。这些考量共同决定了指令格式的设计。每一位的分配都是在各种约束下做出的权衡。九、一条指令的一生现在把整个过程串起来看一条指令从诞生到执行的完整旅程。你写了一行C代码intcab;编译器把它翻译成汇编指令ADD R3, R1, R2意思是把R1和R2相加结果放到R3。汇编器把这条汇编指令翻译成机器指令一串二进制数字000000 00001 00010 00011 00000 100000这串数字按照MIPS的R型格式被划分成六个字段op000000rs00001R1rt00010R2rd00011R3shamt00000funct100000加法。这串数字被存进内存。CPU的取指单元从内存里取出这串数字。解码单元读取op字段知道这是一条R型指令再读取funct字段知道这是加法。然后读取rs和rt字段知道要读R1和R2。读取rd字段知道结果要写入R3。执行单元从寄存器堆里读出R1和R2的值送入加法器计算结果。写回单元把结果写入R3。整个过程在纳秒级别完成。然后CPU取下一条指令重复这个过程。你现在再看那串0和1它不再是随机的噪音。它是一张精心设计的卡片每一位都有它的位置每一个字段都有它的含义。操作码说做什么寄存器字段说操作谁立即数字段直接携带数据偏移量字段指向内存的某个角落。这套语言是人类和机器之间最底层的对话方式。简洁精确没有歧义。每一位都算数。

相关文章:

一条指令,是怎么被机器读懂的

你每次敲下一行代码,按下运行,屏幕上出现结果。 这个过程,看起来很自然,自然得像呼吸一样。 但在这个过程里,有一件事情发生得悄无声息,大多数人从来没有想过: 你写的那行代码,最终变…...

模拟PPG生物信号,利用短时傅里叶变换滤波,提取心率

1、利用短时傅里叶变换滤波,提取心率def test06():import numpy as npimport matplotlib.pyplot as pltfrom scipy import signalfrom scipy.signal import find_peaks# ---------- 参数设置 ----------fs 1000 # 采样率 (Hz)duration 10 # 信号时长 (秒)t np.…...

软件测试入门封神指南!从理论到实战,核心知识点一篇全覆盖

目录零基础也能看懂的测试体系课,搞定开发模型、测试流程、用例设计、BUG管理全链路一、先搞懂软件开发流程!测试人必知的4大经典模型1. 瀑布模型2. V模型3. W模型4. 快速原型模型二、软件测试全流程!9个核心步骤,一步都不能错1. …...

C语言从入门到进阶——第15讲:深入理解指针(5)

文章目录1. 回调函数是什么?2. qsort使用举例2.1 使用qsort函数排序整型数据2.2 使用qsort排序结构数据3. qsort函数的模拟实现1. 回调函数是什么? 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来…...

基于跨模态医学图像生成模型的早期肺癌风险评估研究-(resnet)-大数据深度学习算法毕设毕业设计项目-含完整论文源码

博主介绍:👉全网个人号和企业号粉丝40W,每年辅导几千名大学生较好的完成毕业设计,专注计算机软件领域的项目研发,不断的进行新技术的项目实战👈 ⭐️热门专栏推荐订阅⭐️ 订阅收藏起来,防止下次找不到 &am…...

【C++项目】从零实现高并发内存池(一):核心原理与设计思路

一:什么是内存池? 1. 池化技术 定义:程序先向系统申请过量资源,自己管理备用,避免频繁申请系统资源的开销。核心思想:提前申请 → 自行管理 → 快速复用,提升运行效率。常见应用:内…...

深度学习野外环境下野生动物检测(YOLOv12/v11/v8/v5模型+数据集)(源码+lw+部署文档+讲解等)

摘要 随着全球生态系统的不断变化,野生动物的保护和监测已成为生态学和环境科学领域的重要任务。传统的野生动物监测方法如人工观察和固定摄像头拍摄,存在效率低、成本高和环境适应性差等问题。近年来,深度学习技术的快速发展为野生动物的自动…...

全面理解MySQL架构

目录学前目标一条查询SQL是如何执行的mysql组成架构客户端服务端完整执行流程一条更新SQL是如何执行的学前目标 掌握 MySQL 整体架构划分,清晰区分 Server 层和存储引擎层的功能与核心组件; 理解一条 SQL 查询 / 更新语句的完整执行流程; 掌握…...

android java设置控件不可见+高度=0

holder.im_plan_pic_in_plan_item.setVisibility(View.GONE);就这样就可以了,不会有任何高度:This view is invisible, and it doesnt take any space for layout purposes. Use with setVisibility and android:visibility. 可以看到这个图片是完全没有…...

从发布到可见:让自定义业务对象真正落地到 SAP Fiori 的完整路径

在很多项目里,开发人员完成 Custom Business Object 建模、点击 Publish 之后,往往会产生一种错觉:业务对象已经生成了,应用应该马上就能给业务用户使用。可一回到 launchpad,却发现既搜不到应用,也看不到磁贴,甚至连进入页面的入口都没有。真正的原因并不复杂:Publish…...

从 Key User 扩展到可运输交付:彻底吃透 SAP Fiori 中的 Adaptation Transport Organizer

在很多团队里,业务顾问第一次接触 SAP Fiori 扩展工具时,都会有一个很直观的问题:为什么我在 Custom Fields and Logic、运行时适配,或者其他 Key User 扩展场景里做了增强,却看不到熟悉的 package 和 transport request 录入步骤?答案就在 Adaptation Transport Organiz…...

JAVA学习第二天作业笔记

题目1.能够在Java程序中使用注释:单行注释"\\"只可以注释一行,\* *\多行注释,\** *\文档注释2.能够说出变量的作用:变量就是内存中的一块区域,可以理解成一个盒子,用来装程序要处理的数据的3.能…...

氢电混合储能系统仿真(光伏,锂电池,燃料电池) 储能共直流母线 光伏储能共交流母线 储能由氢燃...

氢电混合储能系统仿真(光伏,锂电池,燃料电池) 储能共直流母线 光伏储能共交流母线 储能由氢燃料电池锂电池组成 直流母线电压稳定在800v 考虑光伏故障下系统的运行特性在新能源领域,氢电混合储能系统正逐渐成为研究的热…...

造点弯月数据

BPAdaboost模型 1、Adaboost算法是将BP神经网络作为“弱”分类器,通过不断训练BP神经网络,每次迭代更新的过程中不断更新数据的权重分布,通过Adaboost算法得到多个BP神经网络弱分类器组成的强分类器; 2、通过这个让你彻底理解和应…...

Flow3d+edem的粉末床激光增材制造熔池流动数值模拟 内容包含如下: 1该模拟资料包含粉...

Flow3dedem的粉末床激光增材制造熔池流动数值模拟 内容包含如下: 1该模拟资料包含粉床建立部分(EDEM,和Gambit软件)以及模型模拟部分Flow3D软件,全部具有视频讲解,步骤清晰,内筒详细。 2所给资料包含粉床模…...

H∞鲁棒控制入门案例(Matlab + Simulink)

H∞鲁棒控制入门案例(Matlab Simulink)✅ 第一步:Matlab 中设计 H∞ 控制器 matlab 编辑 1%% H∞鲁棒控制入门案例 - Matlab部分 2clear; clc; close all; 3 4% 1. 定义被控对象(二阶系统) 5% G(s) 1 / (s^2 2ζωn…...

【CLAUDE.md优化】从一锅炖到分层治理:我的 CLAUDE.md 重构实录

网上教你写 CLAUDE.md 的文章不少,该放什么、格式怎么写、层级怎么分,讲得都对。但看完你还是不知道一件事:**我的 CLAUDE.md 到底什么时候该拆、怎么拆、拆到什么程度。**这个问题没有标准答案,因为 CLAUDE.md 不是配置文件&…...

利用 Matlab/Simulink 平台搭建双馈风力发电机在电网中的模型 双馈风力发电机在风速变化的影响下转矩、电流、电压等参数波形变化。 适用于风电并网时对风电场影响的研究

利用 Matlab/Simulink 平台搭建双馈风力发电机在电网中的模型 双馈风力发电机在风速变化的影响下转矩、电流、电压等参数波形变化。 适用于风电并网时对风电场影响的研究对于“适用于风电场影响研究”且需要观察“风速变化下转矩、电流、电压波形”的需求,最稳健且适…...

080校园共享系统-springboot+vue

文末领取项目源码springbootvue 1.首页请文末卡片dd我获取源码...

博途1200PLC下的高效脉冲除尘控制方案研究

No.121.基于博途1200PLC的脉冲除尘控制某水泥厂除尘车间里,十几个电磁阀突然集体罢工,操作面板上红色警报闪得人头皮发麻。老张叼着半截烟头蹲在PLC柜前,嘴里嘟囔着:"这脉冲时序怕不是被狗啃了"。今天咱们就来聊聊怎么用…...

基于Matlab Simulink仿真的光伏并网最大功率点追踪(MPPT)及双闭环电压电流调节...

光伏并网 MPPT追踪光伏最大发电功率 光伏boostmpptdc-ac电压电流双闭环 两级式三相光伏并网 双PI SPWM调制 Matlab/Simlink仿真 三相L LC LCL并网逆变器 采用双闭环电压电流调节 锁相环 电网电压 并网电流同频同相 仿真正确波形 波形完美 附带参考文献光伏并网系统里&…...

2026 年 1-2 月中国大模型备案发展分析报告

一、报告核心概况2026 年 1-2 月,国家网信办持续推进生成式人工智能服务备案工作,期间共完成 48 款大模型备案,覆盖全国 16 个省级行政区及国资委监管的中央企业。此次备案大模型呈现 “区域分布多元、行业场景聚焦” 的特征,技术…...

协程学习笔记2

一、Flow通过flow异步返回多个值fun simpleFlow() flow<Int> {for (i in 1..5) {delay(1000)emit(i)} }Test fun 通过flow异步返回多个值() runBlocking {launch {for (k in 1..5) {delay(500)println("k:$k")}}delay(500)simpleFlow().collect {println(it)…...

嵌入式工程师必学(176):深入ADC

前言: 对于要理解芯片而言,不仅要理解芯片内部的模块构成,接口就是要知道接口内部结构是怎么构成的,但是每个接口功能而言,内部和外部是一个有联系有关联的系统,要一起看,电压的分配,电流的流动,电阻的匹配 ,电容的充放电。 ADC这个接口看似简单,也不简单。ADC芯片…...

和我一起学软件架构:C编译流程

引言 我们基于两个材料进行实验&#xff1a;&#xff08;一个简单的C语言代码) (GNU工具-GCC) 源代码 // hello.c #include <stdio.h> #define PI 3.14159 int main() {double radius 5.0;double area PI * radius * radius;printf("Area %f\n", area);re…...

【力扣-239. 滑动窗口最大值[特殊字符]】Python笔记

单调队列与滑动窗口算法详解滑动窗口概念滑动窗口技术用于在数组或字符串上维护一个固定大小的子区间。传统暴力解法每次滑动窗口后重新计算极值会导致O(nk)时间复杂度&#xff0c;在数据规模较大时效率低下。单调队列特性单调队列通过特殊结构保证队列元素始终有序&#xff1a…...

linux的指令(2)

find&#xff08;用于查找文件&#xff09;find目录/ -name文件名&#xff08;文件名中加*是通配符&#xff0c;如第二张图&#xff09;which 用于查找指令通常指令都是处于bin文件中&#xff08;所有指令本质上都已Linux中的一个文件&#xff09;&#xff08;is where用于少数…...

工具管理化技术工具选型与集成评估

工具管理化技术工具选型与集成评估&#xff1a;提升企业效率的关键路径 在数字化转型的浪潮中&#xff0c;技术工具的选型与集成已成为企业提升运营效率、优化资源分配的核心环节。面对市场上种类繁多的技术工具&#xff0c;如何科学评估、合理选型&#xff0c;并实现高效集成…...

Phi-3 Forest Laboratory 工具链整合:Visual Studio Code高效开发插件推荐与配置

Phi-3 Forest Laboratory 工具链整合&#xff1a;Visual Studio Code高效开发插件推荐与配置 你是不是也遇到过这种情况&#xff1a;写代码写到一半&#xff0c;突然卡在一个函数实现上&#xff0c;或者面对一段复杂的遗留代码&#xff0c;需要花半天时间去理解它的逻辑。传统…...

AnythingtoRealCharacters2511部署教程:NVIDIA Jetson Orin Nano边缘端轻量部署方案

AnythingtoRealCharacters2511部署教程&#xff1a;NVIDIA Jetson Orin Nano边缘端轻量部署方案 1. 引言&#xff1a;让动漫角色走进现实 你是否曾经想过&#xff0c;让喜欢的动漫角色变成真实人物的样子&#xff1f;现在&#xff0c;通过AnythingtoRealCharacters2511模型&a…...