M68000编程模型实战解析:从寄存器寻址到系统设计精髓

发布时间:2026/6/23 9:47:09
M68000编程模型实战解析:从寄存器寻址到系统设计精髓 1. 从手册目录到实战蓝图如何真正读懂M68000编程模型手头有一本《M68000家族程序员参考手册》厚厚几百页目录列得密密麻麻从整数单元、浮点单元到各种寻址模式和指令详解。很多朋友拿到这种官方文档容易陷入两个极端要么被浩如烟海的细节吓退觉得这是只有芯片设计者才需要关心的东西要么就只把它当成指令查询字典写汇编时翻一下操作码却从未真正理解这套架构的设计哲学和实战价值。我干了十多年嵌入式底层开发从8位机到32位机都摸过M68000系列是我认为在CISC架构中设计得相当优雅的一套。它不像x86那样有沉重的历史包袱也不像一些RISC架构在初期为了精简而牺牲了编程的灵活性。它的编程模型特别是清晰划分的用户/监督模式、规整的寄存器集合以及强大的寻址能力是理解那个时代系统软件比如经典的Amiga、早期的Macintosh乃至不少工业控制器如何工作的钥匙。今天我不打算照着手册目录给你念一遍而是结合我调试实际硬件、编写引导程序、甚至逆向分析老系统固件的经验带你拆解M68000编程模型的精髓让你知道这些寄存器、标志位在真实的代码中是如何“活”起来的。2. 核心架构拆解为什么是“家族”而不仅是“一个CPU”2.1 统一的编程模型与家族兼容性M68000家族手册涵盖了从MC68000到MC68040以及各类嵌入式变种和协处理器。手册开篇就强调所有对MC68000、MC68020、MC68030的引用都默认包含其对应的嵌入式控制器型号如MC68EC020。这种“家族”概念不是营销噱头而是实实在在的二进制兼容性和编程模型的一致性承诺。这意味着你为MC68000写的用户态程序在MC68040上几乎可以不加修改地运行。这种向前兼容性在嵌入式领域至关重要项目生命周期可能长达十几年硬件可能会升级但软件资产必须得到保护。这种兼容性的基石就是一套稳定且可扩展的编程模型。它允许新处理器增加新功能如浮点单元、MMU、更复杂的缓存同时确保老代码看到的“视图”不变。在实际项目中这让你能为一个产品系列开发通用固件框架只需针对特定型号启用或禁用某些高级特性即可。2.2 用户与监督模式硬件级别的权限隔离这是M68000架构最核心的设计之一。手册将编程模型明确分为用户组和监督组。用户程序你的应用程序只能访问用户模型下的寄存器8个数据寄存器D0-D7、7个地址寄存器A0-A6、用户栈指针A7/USP、程序计数器PC和条件码寄存器CCR。而系统软件操作系统内核、驱动运行在监督模式下可以访问所有寄存器包括监督栈指针SSP/ISP/MSP、状态寄存器SR全字、向量基址寄存器VBR、交替功能码寄存器SFC/DFC等。为什么这么设计这提供了硬件级别的内存保护和系统稳定性。想象一下一个用户程序崩溃了如果它能随意修改中断向量表VBR或监督栈指针整个系统会立刻垮掉。通过模式隔离用户程序的错误被限制在它的“沙箱”里。从监督模式切换到用户模式通常是通过修改状态寄存器SR的S位并执行一条RTE从异常返回指令来实现的。这个过程伴随着硬件自动的上下文保存与恢复是操作系统实现多任务的基础。实操心得模式切换的坑在编写引导程序或监控程序时一个常见的错误是过早或错误地切换到用户模式。一旦切换再想执行特权指令如操作VBR或修改SR就会触发权限异常。我的调试经验是在系统初始化完全完成内存控制器、中断控制器、关键外设就绪并且准备好了第一个用户任务的上下文即正确设置了USP和PC之后再进行切换。切换前务必确保监督栈是有效的因为任何异常都会立刻切回监督模式并使用监督栈。3. 整数单元用户模型寄存器不只是存储单元3.1 数据寄存器D0-D7通用性的代价与智慧这8个32位寄存器是数据操作的绝对主力。手册说它们用于位、字节、字、长字操作这没错但实战中你会发现它们的“通用”设计带来了巨大的灵活性也隐含了一些性能考量。灵活的数据操作你可以用MOVE.B D0, D1移动一个字节用ADD.W D2, D3做字加法用CMP.L D4, D5比较长字。数据寄存器的高位部分在字节和字操作时不会被无关操作影响除了符号扩展指令这简化了代码。例如你可以用D0的低16位作为一个循环计数器同时用其高16位存储一个临时标志而不会相互干扰。作为变址寄存器在复杂寻址模式中数据寄存器可以作为变址寄存器使用例如MOVE.W (A0, D0.W*2), D1。这非常利于访问结构体数组。假设A0指向一个Point结构体数组的基址每个Point包含x字和y字那么要访问第i个点的y坐标可以设置D0 i然后使用MOVE.W (4, A0, D0.W*4), D2。这里4是Point结构体内y相对于基址的偏移D0.W*4是因为每个结构体占4个字节。注意事项符号扩展的陷阱当数据寄存器作为变址寄存器时其有效位宽由指令中的尺寸指定.W或.L。使用.W时处理器会将寄存器的低16位进行符号扩展到32位再参与地址计算。这意味着如果你用D0值为0xFFFF作为.W变址它会被当作-10xFFFFFFFF参与计算而不是65535。这常常是数组访问越界或定位错误的根源。在计算数组索引时如果索引值可能超过32767务必使用.L尺寸或者确保对16位值进行正确的零扩展使用ANDI.W #0xFFFF, D0或MOVE.W src, D0后高16位会自动清零。3.2 地址寄存器A0-A7不仅仅是指针地址寄存器也是32位的但它们的用途更侧重于地址计算和作为栈指针。A0-A6通用的基址与指针这些寄存器最常用于基址指针指向数据结构的起始地址如LEA buffer, A0。遍历指针在循环中递增或递减用于访问连续内存如MOVE.B (A0), D0。子程序局部变量存储在进入子程序时常用MOVEM.L A0-A6/D0-D7, -(SP)保存寄存器然后将A6或A5设置为帧指针Frame Pointer用于访问栈上的局部变量和参数。这是经典M68K调用约定的一部分。A7特殊的栈指针A7在用户模式下是用户栈指针USP在监督模式下可能是中断栈指针ISP或主栈指针MSP。它的特殊性在于许多指令隐含使用它JSR/BSR跳转到子程序将返回地址压入(A7)。RTS从子程序返回从(A7)弹出地址并跳转。PEA压入有效地址计算一个地址并将其长字压入(A7)。MOVEM寄存器到内存且使用-(SP)模式将多个寄存器压栈。硬件会自动保证A7的更新是原子性的并且在字或长字访问时对齐到偶地址边界对于MC68000非对齐访问会引发地址错误异常。这是栈安全的基础。3.3 程序计数器PC与条件码寄存器CCRPC的相对寻址PC不仅仅是下一条指令的地址。M68K丰富的寻址模式允许PC本身作为基址寄存器实现位置无关代码PIC。例如LEA (PC), A0可以获取当前指令的地址MOVE.W (label, PC), D0可以从相对于当前PC偏移label的位置读取数据。这在编写不需要重定位的代码如ROM中的固件时极其有用因为无论代码被加载到内存的哪个位置这些相对偏移都是正确的。CCR五个比特决定程序流向条件码寄存器CCR是状态寄存器SR的低8位用户程序可以完全访问。这5个标志位X, N, Z, V, C是控制流的核心。X扩展位在多精度运算如64位加法中扮演关键角色。它类似于C位但不会被单次算术操作清除除非指令明确说明。通常用ADDX,SUBX指令配合使用。N负号位反映结果的最高位符号位。对于有符号数比较至关重要。Z零位结果为零时置位。用于判断相等或循环结束。V溢出位反映有符号数运算的溢出。CMP指令会根据(src - dst)的结果设置此位用于有符号数的大小比较。C进位位反映无符号数运算的进位或借位。用于无符号数比较和移位操作。手册强调了一致性原则所有指令对条件码的影响是统一和可预测的。例如CMP.B,CMP.W,CMP.L都以相同的方式设置标志位。这使得条件分支指令BCC,BLS,BGT等的行为非常清晰。实操心得理解“C”和“X”的分离初学者常困惑为何有了C位还要X位。一个经典用例是双字64位加法。假设我们要计算(D1:D0) (D3:D2)结果存回(D1:D0)。代码如下ADD.L D2, D0 ; 低32位相加设置C和X位C位反映本次进位 ADDX.L D3, D1 ; 高32位相加并加上X位即低位的进位这里ADDX使用的是X位而不是C位。如果使用C位那么在ADD.L之后C位可能被后续的其他指令如条件判断意外改变导致高位加法出错。X位的设计就是为了保存这个进位信息使其在多步运算中更稳定。在编写数学库或加密算法时这个细节至关重要。4. 浮点单元用户模型IEEE 754的硬件实现对于MC68881/68882浮点协处理器和MC68040集成的FPU手册描述了另一套并行的用户编程模型。理解这个模型是编写高效数值计算代码的关键。4.1 浮点数据寄存器FP0-FP780位的精度容器这8个80位寄存器是FPU的核心工作区。关键一点是无论输入的数据格式是单精度32位、双精度64位还是扩展精度80位在加载到FP寄存器时都会被统一转换为80位的扩展精度格式进行计算。存储时再根据指令要求舍入到目标格式。这保证了中间计算具有更高的精度和更小的舍入误差。例如计算a * b c如果a,b,c都是单精度流程是FMOVE.S a, FP0(a转换为80位存入FP0)FMUL.S b, FP0(b转换为80位与FP0中的80位值相乘结果80位存于FP0)FADD.S c, FP0(c转换为80位与FP0相加)FMOVE.S FP0, result(将FP0中的80位结果舍入为单精度存入内存)4.2 浮点控制寄存器FPCR精度与异常的处理策略FPCR分为异常使能字节和模式控制字节。异常使能字节允许你为每一类浮点异常无效操作、除零、上溢、下溢、不精确单独启用陷阱。在科学计算中你可能希望捕获所有异常进行严格分析而在图形处理中可能更倾向于禁用下溢陷阱将下溢结果刷新为零以提升性能。模式控制字节包含舍入模式RND和舍入精度PREC字段。舍入模式IEEE 754定义了四种向最近偶数默认、向零、向正无穷、向负无穷。后两种在区间运算和保证数值边界时特别有用。舍入精度可以强制所有结果舍入到单精度或双精度即使寄存器内部是80位。这可以用来模拟其他硬件如早期只有单精度的GPU的浮点行为。4.3 浮点状态寄存器FPSR运算结果的“体检报告”FPSR是了解一次浮点运算发生了什么事的窗口。条件码字节FPCC类似于整数CCR但用于浮点比较。它有N负、Z零、I无穷大、NaN非数/无序四个标志。特别注意“无序”状态它发生在至少一个操作数是NaN的比较中。条件分支指令如FBGT,FBNGE会根据这些标志决定跳转。异常状态字节EXC记录最近一次浮点操作触发了哪些异常。异常处理程序就是靠这个字节来判断具体原因的。累积异常字节AEXC这是“粘性”位。一旦某种异常发生对应的AEXC位就会被置位并且只能通过软件写FPSR来清除。这允许你在禁用异常陷阱的情况下运行一大段浮点代码最后只需检查一次AEXC就能知道这段计算过程中是否出现过任何问题如下溢、不精确而无需每条指令后都检查。这是实现高性能数值库的常用技巧。4.4 浮点指令地址寄存器FPIAR由于整数单元和浮点单元可以并行工作在MC68040上甚至两个浮点指令可以并发当浮点异常发生时PC指向的可能是异常处理时的指令而非触发异常的浮点指令。FPIAR就是用来保存那条“肇事”指令的地址的极大方便了调试。但要注意像FMOVE到控制寄存器的指令不会修改FPIAR。5. 监督模式模型操作系统的基石监督模式下的寄存器是系统软件内核、驱动、调试器的专属工具。手册里列出了长长的一串我们挑几个最核心的来谈。5.1 状态寄存器SR处理器的总控制台SR的高8位系统字节在用户模式下是不可见的。T1/T0跟踪模式用于实现单步调试。设置T0位处理器会在每条指令后引发跟踪异常调试器借此接管控制权。MC68020及更高版本支持T1位用于更精细的“仅分支跟踪”。S监督/用户状态位这就是模式切换的开关。0用户态1监督态。M主/中断状态位仅MC68010及更高版本支持。当S1且M1时使用主栈指针MSP当S1且M0时使用中断栈指针ISP。这允许在处理低级中断时使用独立的栈避免破坏高级别任务的栈提升了系统的健壮性。I2/I1/I0中断优先级掩码这是一个0-7的数字。只有当中断请求的级别高于此掩码时处理器才会响应该中断。这实现了可嵌套的中断系统。例如设置掩码为3则级别为1、2的中断被屏蔽级别为4-7的中断可以被响应。5.2 向量基址寄存器VBR在MC68000上异常向量表固定位于内存地址0。从MC68010开始VBR允许你将这个向量表重定位到任何4KB对齐的地址。这带来了巨大的灵活性多任务系统每个任务可以有自己的私有向量表实现定制化的异常处理。虚拟化监控程序可以截获客户操作系统的异常模拟硬件行为。调试在不修改ROM中原始向量表的情况下通过临时修改VBR来安装调试钩子。5.3 交替功能码寄存器SFC/DFC功能码是地址线上的附加信号与32位地址共同构成一个“地址空间”。M68K有8个功能码用于区分如用户数据、用户程序、监督数据、监督程序、CPU空间等。MOVES指令可以使用SFC源功能码和DFC目标功能码来显式指定一次数据传输发生在哪个地址空间。这在操作系统中非常有用例如内核监督态需要访问用户态用户数据空间的数据时就可以通过MOVES指令安全地进行。5.4 透明翻译/访问控制寄存器TT/AC这是MC68030/040和其嵌入式版本中用于内存管理的高级功能。简单来说它们允许你将一大块连续的逻辑地址空间例如整个I/O区域0x80000000 - 0xFFFFFFFF定义为“透明”的即绕过复杂的页表查找直接映射到相同的物理地址同时可以设置这块区域的属性是否可缓存CI、只读/读写R/W、以及适用于哪个功能码空间FC BASE/MASK。实战意义在嵌入式系统中外设寄存器通常映射到固定的高地址区域。你肯定不希望对这些区域的访问引发页错误异常也不希望它们被缓存因为外设寄存器的值可能被设备改变。通过设置TT/AC寄存器你可以告诉MMU“这块地址别管它直接过去而且不要缓存”。这极大地简化了驱动程序的编写并保证了I/O操作的实时性和正确性。6. 数据格式与内存组织对齐与效率手册详细定义了整数字节、字、长字和浮点数单、双、扩展精度、压缩十进制的格式。这些格式是IEEE标准或行业惯例这里不赘述。我想强调的是内存组织和对齐对性能的影响。6.1 整数数据对齐对于MC68000字16位和长字32位操作数必须位于偶地址边界。非对齐访问会引发地址错误异常。从MC68020开始硬件支持非对齐访问但性能会严重下降因为处理器内部需要执行多次内存周期。因此编写高效M68K代码的第一条军规就是确保数据结构的成员、尤其是频繁访问的成员是自然对齐的。例如定义一个C结构体时// 低效因为int b的地址可能是奇数 struct Bad { char a; int b; short c; }; // 高效编译器通常会插入填充字节 struct Good { int b; short c; char a; // 编译器可能在这里填充一个字节使整个结构体大小为8的倍数如果数组化 };在汇编层面如果你需要从一个可能未对齐的地址读取一个字安全的做法是分两次读取字节然后组合或者使用MOVE.L指令如果地址是长字对齐的。6.2 浮点数据格式转换如前所述FPU内部统一使用80位扩展精度。这带来一个潜在问题精度损失和双重舍入。考虑以下场景将一个双精度数从内存加载到FP寄存器转换为80位。进行一系列计算都在80位下。将结果以单精度存回内存从80位舍入到32位。如果第1步的双精度数本身就是一个由更低精度计算舍入而来的结果那么“内存-80位-计算-32位”这个过程可能不同于“直接在32位精度下计算”的结果。虽然IEEE标准努力减少这种差异但在对数值结果有严格一致性要求的场合如分布式仿真、确定性游戏需要特别注意。有时需要强制使用FMOVE指令配合特定的舍入精度PREC来控制中间精度。7. 寻址模式深度解析CISC灵活性的体现M68000的寻址模式是其强大生产力的源泉。手册列出了十几种我们可以将其归纳为几个核心类别并理解其编译器和手写汇编中的应用。7.1 寄存器直接与间接基础中的基础数据寄存器直接 (Dn)操作数就在寄存器里最快。地址寄存器直接 (An)通常用于存放地址值本身而不是该地址的数据。但有些指令如MOVE.L A0, D0可以操作地址值。地址寄存器间接 (An)经典指针。MOVE.W (A0), D0将A0指向的内存字加载到D0。后增/前减间接 ((An), -(An))这是M68K的精华用于实现栈操作和遍历数组/字符串。MOVE.B (A0), D0读取A0指向的字节到D0然后A0加1。完美用于复制字符串。MOVE.L D0, -(A1)A1先减4然后将D0的长字存入A1指向的位置。这就是压栈操作的本质。7.2 带偏移的寻址访问结构体和局部变量带位移的地址寄存器间接 (d16, An)MOVE.W (8, A6), D0。假设A6是帧指针Frame Pointer那么8(A6)可能就是访问子程序的第一个参数。编译器在生成访问栈帧或全局/静态数据的代码时大量使用这种模式。带变址的地址寄存器间接 (d8, An, Xn.SIZE*SCALE)这是最强大的寻址模式之一。MOVE.W (0, A0, D1.W*2), D2。假设A0是数组基址D1是索引每个元素占2字节字。该指令计算地址 A0 0 D1*2然后读取。SCALE因子1,2,4,8让访问各种尺寸的元素变得异常高效无需额外的移位指令。7.3 与PC相关的寻址位置无关代码PIC的生命线所有以地址寄存器为基址的寻址模式都可以把基址寄存器换成PC。这使得代码可以在内存中任意位置加载并运行无需重定位。例如要跳转到一个相对当前指令偏移label的子程序可以使用BSR label它是JSR (label, PC)的简写。要读取一个嵌入在代码段中的常量表可以使用LEA (data_table, PC), A0。7.4 绝对寻址与立即数绝对短地址/长地址直接指定一个32位地址。这会产生非位置无关的代码但有时是必要的例如访问内存映射的固定硬件寄存器MOVE.B #0x55, 0xFF0000。立即数操作数直接编码在指令流中。MOVE.L #0x12345678, D0。注意立即数的大小可以是字节、字或长字这会影响指令长度。避坑指南寻址模式的选择与性能并非所有寻址模式生而平等。在MC68000上一个复杂的寻址模式如带变址和位移可能需要额外的时钟周期来计算有效地址EA。经验法则是寄存器直接最快其次是带小位移的地址寄存器间接。复杂的带变址模式在循环中如果索引不变应尽量在循环外计算好基地址。PC相对寻址虽然方便但计算EA也可能有微小开销。对于性能极度敏感的循环内部考虑将PC相对地址预先加载到一个地址寄存器中。从MC68020开始由于更强大的地址计算单元许多复杂寻址模式的额外开销变得很小可以更自由地使用。8. 指令集概览与编码初探手册的指令集摘要部分是一张宝藏地图。它按功能分类数据传送、整数运算、逻辑、移位、程序控制等并给出了指令格式的概览。理解指令编码格式对于阅读反汇编代码、编写代码生成器或进行极致的优化非常有帮助。8.1 指令字格式一条M68K指令通常由一个或多个字16位组成。第一个字是操作字它决定了基本操作如MOVE、ADD和操作数寻址模式。操作字的高4位通常是操作码低12位用于编码源和目标操作数的寻址模式和寄存器编号。例如在MOVE指令中操作字会指定源操作数的寻址模式是寄存器是立即数是内存地址和目标操作数的寻址模式。如果源或目标操作数需要使用更复杂的寻址模式如带长位移或全扩展字模式那么操作字后面会跟着一个或多个扩展字。扩展字提供了位移值、立即数数据或更复杂的变址信息。8.2 从指令表到实际编码手册后面的操作码映射表Opcode Map是给工具链开发者和逆向工程师看的。对于普通程序员更重要的是理解常见指令的“模式”。例如几乎所有双操作数指令如ADD,CMP,AND都遵循类似的编码格局操作码指定动作后面跟着两个6位的字段分别描述源和目标。当你用汇编器写ADD.L D0, D1时汇编器会生成类似0xD280这样的操作字。拆开看0xD是ADD.L操作码的一部分2表示源是数据寄存器D08表示某种寻址模式这里是数据寄存器直接0表示目标是数据寄存器D1。理解这个你就能在调试器中看到一串十六进制数时大致猜出它是什么指令。8.3 条件码计算的一致性手册中有一张非常重要的表整数单元条件码计算。它列出了每条指令如何影响X, N, Z, V, C位。这种一致性是编写稳健汇编代码的基础。例如你知道CMP.B D0, D1执行的是D1 - D0并根据结果设置标志位。那么BGT大于则分支指令就会检查N, Z, V位的组合以实现有符号数比较后的分支。这种确定性让你可以精确预测程序流向。9. 常见问题与调试技巧实录9.1 问题程序在访问某个内存地址时崩溃提示“地址错误”。排查思路检查对齐这是MC68000上最常见的原因。你是否试图在奇地址进行字或长字访问使用调试器检查崩溃时PC附近的指令看它访问的地址。检查权限你是否在用户模式下试图访问监督态空间如地址0附近的向量表检查SR的S位。检查MMU/AC在MC68030/040上是否该地址区域被MMU映射为不可访问或被AC寄存器设置为只读而你尝试写入检查指针值地址寄存器A0-A6中的值是否已损坏可能是数组越界、栈溢出破坏了保存的地址。9.2 问题浮点计算结果与预期有微小差异或触发了不希望的异常如下溢。排查思路检查FPCR的舍入模式和精度默认是“向最近偶数舍入”和扩展精度。你的算法是否假设了其他舍入方式如截断检查FPSR的AEXC字节在计算结束后读取AEXC。如果INEX不精确位被置位说明结果经过了舍入。如果UNFL下溢位置位说明结果小于最小可表示的正规数被刷新为零或反规格化数。这是正常现象还是算法问题检查输入数据使用调试器查看加载到FP寄存器前的内存值以及加载后的80位内部表示。确认转换过程无误。考虑非数NaN和无穷大Inf你的计算中是否产生了这些特殊值它们会通过FPCC的NaN位体现。条件分支指令如FBUN无序则分支可以检测到它们。9.3 问题中断服务程序ISR破坏了主程序的寄存器状态导致返回后主程序出错。解决方案这是编写ISR的经典问题。必须在ISR入口保存所有你会用到的寄存器并在退出前恢复。my_isr: MOVEM.L D0-D7/A0-A6, -(SP) ; 保存所有数据/地址寄存器到监督栈 ; ... ISR处理代码 ... MOVEM.L (SP), D0-D7/A0-A6 ; 恢复所有寄存器 RTE ; 从异常返回恢复SR和PC更高级的技巧如果ISR非常短且只使用少数寄存器可以只保存必要的寄存器以提升速度。但务必小心。另外如果ISR中调用了其他子程序要确保栈平衡。9.4 问题使用(An)或-(An)模式时地址寄存器的增减量不对。牢记规则增减量取决于操作的大小.B, .W, .L而不是地址寄存器本身。MOVE.B (A0), D0- A0 增加1。MOVE.W (A0), D0- A0 增加2。MOVE.L (A0), D0- A0 增加4。对于前减模式-(An)同理。这是为了与栈操作总是以长字为单位保持一致而设计的精妙之处。9.5 工具使用心得模拟器是好朋友在接触真实硬件前使用像EASy68K或MusashiMAME的一部分这样的模拟器来学习指令和调试程序可以避免很多硬件损坏风险。善用反汇编器当你拿到一段机器码或ROM镜像时一个好的反汇编器如binutils里的m68k-elf-objdump能帮你快速理清程序结构。结合手册的指令格式你可以验证反汇编结果是否正确。阅读经典代码研究一些开源的老式M68K系统代码如NetBSD/amiga或一些经典游戏的逆向工程是学习最佳实践和奇技淫巧的绝佳途径。你会看到有经验的程序员如何巧妙地运用寻址模式和条件码。理解M68000家族的编程模型不仅仅是记住一堆寄存器名和指令。它是理解一个时代系统设计思想的窗口。从清晰的权限分离到丰富而一致的寻址模式再到对IEEE浮点标准的硬件支持这套架构在复杂性和实用性之间取得了很好的平衡。即使今天在嵌入式教育、复古计算和特定工业领域它依然散发着活力。当你下次看到一段M68K汇编时希望你能透过那些十六进制数字看到数据在寄存器间流动地址在总线上生成条件码在决定下一个分支而整个系统就在这一条条简洁而强大的指令驱动下有序地运行着。