《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 8 章 机器码与汇编语言 阅读笔记 8
《计算机是如何工作的人人都能懂的计算机软硬件工作原理》第 8 章 机器码与汇编语言 阅读笔记 8我们已经介绍了计算机的物理部分内存、CPU和 I/O 设备。理解计算机的硬件部分很重要但是硬件只起一半作用。计算机的魔力在于软件。软件把计算机从固定用途的设备变成了高度灵活的设备它能轻松地实现新的功能本章将介绍底层软件——机器码和汇编语言。我发现交互方法是理解这些主题的最好方法所以本章的大部分内容都体现在设计中。8.1 软件术语要讨论软件需要首先介绍一些术语。告诉计算机做什么的指令被称为 “软件”​这与硬件形成了对比硬件是计算机的物理元素。完成任务的一组有序的软件指令被称为 “程序”​编程就是编写这种程序的行为。术语 “应用程序” 有时被用作程序的同义词尽管应用程序往往指的是直接与人进行交互的程序而不是与软件或硬件交互的程序。应用程序也可能由多个程序构成。app 这个词大约在 2008 年开始流行其中含有的其他意思将在第 13 章中介绍。另一个指代一组软件指令的名称是 “计算机代码” 或 “代码”​。CPU 执行 “机器码”​而软件开发人员一般用高级编程语言编写源代码。术语 “源代码” 是指由开发人员最初编写的程序文本。这种代码一般不会用 CPU 能直接理解的形式来编写因此在其能被计算机运行之前还需要进行其他处理。我将在第 9 章详细介绍源代码和高级编程语言但是现在我们先来看看软件的基础机器码。机器码是二进制机器语言指令形式的软件。如第 7 章所述CPU 的架构决定了 CPU 能理解的指令。就像人类语言是用词汇表构成的一样机器语言是用 CPU 系列已知的指令列表构成的。词汇表中的词语排列成句子来表达含义CPU 指令排列成程序后也具有相同功能。不管程序最初是如何编写的编写程序的方法有很多种​它最终都需要在 CPU 上作为一系列机器语言指令来执行。正如你所期望的CPU 指令可以归结为一系列 0 和 1就像计算机处理的所有其他事情一样。这里值得重复一下不论程序最初是如何编写的也不论用的是哪种编程语言更不论使用的是什么技术最后程序都会变成一系列的 0 和 1表示 CPU 可以执行的指令。几年前我有一项工作是关于诊断软件故障的。通常我要分析发生在其他公司编写的软件中的问题。我没有这类软件的源代码也没有很多关于它应如何工作的相关信息但是我的工作就是确定软件故障的原因我有个同事对此很淡然他常常提醒我 “这就是个代码”​。换句话说故障软件就是一组被 CPU 解释为指令的 1 和 0。如果 CPU 可以理解代码那么你也可以。8.2 机器指令示例我认为切入机器码主题的最简单方法就是看示例。我们来看看 ARM 系列处理器能理解的特定机器指令。你可能还记得大多数智能手机上都能发现 ARM 处理器所以你的手机可能也可以理解这条指令。我们的示例指令告诉处理器把数字 4 移动到寄存器 r7 中r7 是 ARM 处理器通用寄存器中的一个。回忆一下我们之前讨论的计算机硬件寄存器是 CPU 中的一种小容量存储位置。执行这个操作的 ARM 指令的二进制形式如下我们来看看 ARM CPU 是如何理解这条指令的如图 8-1 所示。注意我们跳过了无关的一些位。图 8-1 ARM 指令条件部分指示了在什么条件下该指令应该执行。1110 意味着这条指令是无条件执行的所以 CPU 应该总是执行它。虽然本例中不是这样的但是有些指令只需要在特定条件下执行。接下来的两位本例中为 00与我们的讨论无关所以跳过它们。立即数位告诉我们将要访问的是寄存器中的值还是指令本身指定的值称为立即数​。本例中立即数位为 1要访问的是指令中指定的数。如果立即数位是 0那么被访问寄存器将由指令中的其他位来指定。操作码表示 CPU 要执行的操作。本例中操作码是 mov意思是 CPU 要移动数据。目标寄存器 0111 告诉我们把值移动到寄存器 r70111 是十进制的 7中。最后立即数值 00000100 是十进制的 4这是我们想要移动到 r7 中的数。简单概括一下这个二进制序列告诉 ARM CPU 把数字 4 移动到 r7 寄存器中。CPU 总是用二进制处理各种事情但是绝大多数人很难处理这些 0 和 1。现在我们用十六进制表示同样的指令以便让它更容易读懂现在是不是好点啦好吧也许不是。这种格式比二进制格式更加紧凑也更容易区分但它的含义仍然不明显。对我们而言幸运的是还有另一种方法来表示这条指令汇编语言。汇编语言是一种编程语言它的每一条语句都直接表示一条机器语言指令。每种类型的机器语言都有对应的汇编语言—如 x86 汇编语言、ARM 汇编语言等。汇编语言语句由一个表示 CPU 操作码的助记符和其他必需的操作码比如寄存器或数值组成。助记符是人类可读的操作码形式它允许汇编语言程序员在代码中用 mov 而不是 1101。之前讨论过的相同的 ARM 指令也可以用如下汇编语言语句表示与相应的二进制和十六进制表示相比这个语句当然是表示 “把 4 移动到 r7 寄存器中的” 更好的方式最起码对人类来说更容易阅读。也就是说汇编语言语句只是为了人类方便。CPU 从不会执行文本格式的指令它只处理二进制格式的指令。如果程序员用汇编语言编写程序那么在计算机执行该程序之前汇编指令仍然必须转换成机器码。这要用 “汇编器” 来完成汇编器是一种把汇编语言语句转换成机器码的程序。汇编语言文本文件被送入汇编器汇编器输出的就是包含机器码的二进制目标文件如图 8-2 所示。图 8-2 汇编器把汇编语言转换成机器码8.3 用机器码计算阶乘现在我们已经查看了单条 ARM 指令接下来我们看看如何把多条指令组合在一起来执行有用的任务。我们来看一个计算整数阶乘的 ARM 机器码。你可能还记得在数学课上学过n 的阶乘写作 n!是小于或等于 n 的正整数的乘积。例如4 的阶乘为4!4×3×2×124现在我们已经有了阶乘的定义让我们来看看用 ARM 机器码如何实现阶乘算法。为了简单起见我们不查看完整的程序代码只看执行阶乘算法的部分。我们假设 n 的初始值保存在寄存器 r0 中并且当代码完成时计算结果也保存在 r0 中。如同计算机处理的任何其他数据一样在 CPU 访问机器码之前必须把它加载到内存中。下面的是机器码的 32 位4 字节十六进制表示以及每个值的内存地址。当我们的代码加载到内存时阶乘逻辑从地址 0001007c 开始。来看看从这个地址开始的内存内容。请注意0001007c 不是一个神奇的地址它只是恰好是本例中代码加载的地方。还要注意内存地址值增幅为 4因为每个数据值都需要 4 个字节来存放。每条 ARM 指令长度都为 4 字节所以这里的数据表示 5 条 ARM 指令。把这些指令看作十六进制的值并不能让我们深入理解它们的含义所以让我们对这些指令进行译码以便理解这个程序。在下面的清单中我已经把十六进制的数值转换成相应的汇编语言助记符。如果你好奇的话把机器语言手动翻译成汇编语言不是你需要了解的我们有完成这项功能的软件称为 “反汇编器”​。现在这本书就充当了你的反汇编器。下面列出了每条指令以及与之配对的汇编语句CPU 按顺序执行这些指令直到遇到分支指令比如 ble 或 bne​分支指令会让它跳转到程序的另一个部分。地址 00010090 标记着阶乘逻辑的结束。一旦到达这个地址阶乘运算结果就已经保存到 r0 了。此时CPU 执行位于地址 00010090 处的指令。你可能好奇这些指令是如何表示阶乘的计算的。对大多数人来说粗略地看一下这些指令不足以理解其所含的意思。采取循序渐进的方式在每条指令执行时跟踪寄存器的值能帮助你理解这个程序。我将给你提供一些必需的背景资料然后你可以尝试评估这个程序是如何工作的。为了理解这个程序你首先需要对每条指令的说明。在表 8-1 中我已经给出了这个程序中每条指令的解释。在这个表中我使用了寄存器的占位符名称比如 Rd 和 Rn。当你查看汇编代码时你将看到实际使用的寄存器名称比如 r0 和 r3。代码中列出的操作数顺序对应于表 8-1 中的操作数顺序。例如subs r3r0#1 表示从存储在 r0 中的值中减去 1并把结果存放到 r3 中。表 8-1 一些 ARM 指令的解释分支和状态寄存器分支指令实际并不查看前一条指令的数值结果。和大多数 CPU 一样ARM 处理器也有一个寄存器专门跟踪状态。这个状态寄存器有 32 位每个位对应一个特定的状态标志。例如位 31 是 N 标志当指令结果为负数时该标志置 1。只有某些指令会影响这些标志状态。例如subs 指令会改变标志的状态。如果某个减法运算结果是负的那么 N 标志会置 1否则它会清零。其他指令包括分支指令则查看状态标志位来决定该做什么。这看上去是一种迂回的方式但实际上它简化了像 bne 这样的指令——处理器可以根据单个位的值进行分支或不进行分支​。8.4 总结本章讨论了机器码即特定于 CPU 的一系列指令它们在内存中以字节表示。你学习了如何对示例 ARM 处理器指令进行编码以及如何用汇编语言表示该指令。你了解到汇编语言是一种源代码尤其是人类可读形式的机器码。我们还了解了怎样组合多条汇编语言语句来执行有用的操作。第 9 章将讨论高级编程语言。这种语言提供了CPU 指令集的抽象允许开发人员编写更容易理解且可以在不同计算机硬件平台之间移植的源代码。

相关新闻

游戏化编程学习:CodeCombat如何用即时反馈重塑编程入门体验

游戏化编程学习:CodeCombat如何用即时反馈重塑编程入门体验

编程这个事儿,一开始最吓人的不是语法,而是那种“写完代码却不知道自己到底在干嘛”的虚无感。刷题平台把知识点切成碎片,刷完几十道题,感觉自己是熟练工,但真要写一个活着的东西,立刻抓瞎。后来我接触了 C…

2026/10/11 4:31:15 阅读更多 →
黏菌算法优化PNN光滑因子:分类预测精度提升实战

黏菌算法优化PNN光滑因子:分类预测精度提升实战

做分类预测的同行应该都有过这种体验:模型结构和数据清洗都做得差不多了,但精度就是卡在某个阈值上不去。排查到最后,问题往往出在一个不起眼的超参数上。对于概率神经网络(PNN)来说,这个参数十有八九就是光…

2026/10/11 4:31:15 阅读更多 →
iPaaS选型评测:四个维度拆解集成平台真实能力

iPaaS选型评测:四个维度拆解集成平台真实能力

做系统集成的人,应该都对“定制胶水”不陌生:A系统调B系统,B系统再调C系统,接口文档靠微信群传。系统一多,胶水代码越拆越乱,改一个字段要联动三个服务。iPaaS(集成平台即服务)之所以…

2026/10/11 4:31:15 阅读更多 →

最新新闻

毕业论文答辩PPT模板工程化实践指南

毕业论文答辩PPT模板工程化实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:46:56 阅读更多 →
38款树莓派周末项目实战:从GPIO点灯到智能家居与AI推理

38款树莓派周末项目实战:从GPIO点灯到智能家居与AI推理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:46:56 阅读更多 →
EAF企业智能体平台:统一接入、能力编排与知识沉淀实战指南

EAF企业智能体平台:统一接入、能力编排与知识沉淀实战指南

先说我最近常常见到的一幕。一家企业兴致勃勃地上了好几套 AI 助手,结果 IT 那边同时维护着三四个 Agent 系统,每个系统的接入方式都不一样,各自对接不同的内部应用,知识库也是各建各的。同一个问题,问三个助手能收到三…

2026/10/12 6:46:56 阅读更多 →
智能驾驶行为安全评价:从TTC到ODD的过程化安全度量

智能驾驶行为安全评价:从TTC到ODD的过程化安全度量

简介:这份白皮书聚焦智能驾驶行为安全评价,面向自动驾驶安全研究人员、测试工程师与行业决策者,系统阐述以“合理可预见且可避免”为核心的安全评价方法。内容涵盖功能安全、预期功能安全、行为安全、交规符合性、ODD/ODC合理性、人机交互安全…

2026/10/12 6:46:56 阅读更多 →
品牌命名实战:从商标排雷到跨语言筛查的完整流程

品牌命名实战:从商标排雷到跨语言筛查的完整流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:46:56 阅读更多 →
Python语音识别实战:从MFCC特征提取到CTC训练与避坑指南

Python语音识别实战:从MFCC特征提取到CTC训练与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 6:45:56 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →