ICS 与 8086 复习 01:计算机系统与程序执行
为什么一段看起来正确的 C 程序,换一个编译选项、机器或输入就可能出现不同表现?复习 ICS 的第一步,是把程序放回完整的系统中:语言规定含义,编译器生成指令,操作系统组织运行环境,处理器执行指令,内存保存指令与数据。
本篇建立后续十五篇共用的框架。重点是系统层次、存储程序、指令执行和程序转换。
系统层次与各自负责的问题
设程序计算 z = x + y。在 C 层,我们关心变量类型以及加法是否有定义;在机器层,需要确定数据在哪里、加法多宽、结果写回哪里;在硬件层,才落实为寄存器、加法器和控制信号的变化。
| 层次 | 需要回答的问题 | 复习时的例子 |
|---|---|---|
| 高级语言与语言处理系统 | 表达式是什么意思,怎样转换成目标代码 | int 与 unsigned int 的混合比较 |
| 操作系统与运行时环境 | 程序怎样启动,怎样获得内存和输入输出服务 | 可执行文件装载、进程地址空间 |
| 指令集体系结构 ISA | 软件可使用哪些指令、寄存器、数据格式与寻址方式 | IA-32 的 ADD、寄存器和条件码 |
| 微体系结构 | 用什么内部结构实现这些指令 | 流水线、缓存、执行单元 |
| 数字逻辑与物理实现 | 怎样实现存储、运算和信号变化 | 加法器、触发器与逻辑门 |
ISA 是软件可见的机器约定。 微体系结构负责实现这一约定。同一 ISA 可以有多种内部实现,所以“都能运行相同机器代码”不代表“执行速度相同”。操作系统也不是每做一次加法都要介入;普通算术指令由处理器执行,系统调用等机制才会请求内核服务。
存储程序如何使计算机自动执行
存储程序的核心是把指令与数据以二进制形式保存在存储器中,并由控制器按执行流程取出指令。相同的位串可以表示整数、字符、地址,或者机器指令。解释取决于上下文。
复习五大部件时,应把名称与作用联系起来:运算器完成算术逻辑运算,控制器组织执行次序,存储器保存信息,输入与输出设备负责和外界交换信息。现代机器的具体组织更复杂,这个模型用于建立职责划分。
课件模型机中常见的寄存器也应按职责记忆:
- PC 保存接下来要取的指令地址;发生跳转时,执行流程会改变它。
- IR 保存当前取出的指令,供译码使用。
- MAR 保存本次访问的存储器地址,MDR 保存传输的数据。
- GPRs 保存操作数、地址或中间结果,ALU 完成所选运算。
MAR、MDR 是教学数据通路中的抽象部件,不能据此认定每一种现代处理器都以同名的软件可见寄存器实现它们。
一道完整的指令跟踪题
下面使用自定义教学模型机,不是 8086 或 IA-32 汇编。假定指令地址按一条指令加一,每条操作执行完才取下一条;R0 为通用寄存器。初始时 PC=0,M[100]=7,M[101]=5。
地址 指令
0 LOAD R0, [100]
1 ADD R0, [101]
2 STORE [102], R0
3 HALT
取地址 0 的指令后,控制器译码为取数,访问地址 100,将 7 写入 R0。随后执行地址 1 的加法,取出地址 101 的 5,得到 R0=12;地址 2 的指令把 12 写入 M[102]。最后执行停止指令。题目若在取指阶段更新 PC,取完地址 2 的指令后 PC 已为 3,而当前执行指令仍是地址 2 的指令。
指令跟踪最稳妥的答法是逐条列出“取指地址、操作数来源、写回结果、下一地址”。不要把“当前指令地址”和“下一条指令地址”混成一个量。对于 x86,指令长度可变,顺序地址的增量不能固定写成 1。
C 源文件怎样成为正在运行的程序
可将典型处理过程写成一条有明确产物的链:
源文件 .c → 预处理结果 .i → 汇编文本 .s → 可重定位目标文件 .o
→ 链接后的可执行文件 → 装载建立运行环境 → 从入口开始执行
预处理处理宏与头文件等;编译将高级语言转换成目标机器的代码表示;汇编形成机器代码及目标文件信息;链接合并目标文件并处理符号引用;装载建立进程中的代码、数据等映射并转入程序入口。真实工具可能合并内部步骤,但这些概念仍需分清。
“汇编程序”在中文中有时指汇编语言源程序,有时指 assembler 这个工具。答题时写清“汇编源文件”和“汇编器”,可以避免把 .s 当成可直接执行的机器代码。
面对异常现象先定位哪一层
unsigned len=0 时,len-1 会形成很大的无符号值;这首先是数据表示与语言转换问题。按行与按列遍历二维数组速度不同,通常要分析数据布局和缓存访问;这属于执行效率问题。两个文件都定义同名全局对象导致链接失败,则要分析符号与链接规则。
“系统思维”在题目中可以具体化为三步:先确定语言层面的行为是否有定义,再确定题设平台的机器行为,最后讨论实现带来的性能与运行环境差异。缺少前提时,不应直接预测一个唯一输出。
自测与简答
- 相同 ISA 的两台处理器执行同一程序,时间一定相同吗?
- 存储器中的
01000001天然是字符A吗? - 链接和装载分别解决什么问题?
简答: ① 不一定,内部实现和运行条件会影响性能。② 不是;按 ASCII 字符解释时才是 A,也可表示整数 65。③ 链接组织目标文件并处理符号与地址引用;装载把可执行内容映射到进程并建立执行环境。
来源定位
参考《1.前言&第一章计算机系统概述-V1.0.pptx》,第17—30页的系统层次与课程主线、第39—61页的存储程序和模型机、第69—86页的程序转换与 ISA、第94—96页的系统层关联。上面的四条指令例子为据此重写的教学算例。
讨论这篇文章
关于《ICS 与 8086 复习 01:计算机系统与程序执行》的补充、不同意见或延伸话题,都可以留在这里。
滚动到这里时自动载入留言。