ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CP226实验:自建汇编指令系统,中文助记符与微程序三表详解

2026/9/19 8:33:11 拓冰建站 浏览量
CP226实验:自建汇编指令系统,中文助记符与微程序三表详解 简介适合计算机组成原理课程学习者参考的上海大学实验报告围绕“建立汇编指令系统”研究性实验完整讲解如何编制含中文助记符的指令集。报告从实验目的、原理、内容、步骤到结论层层展开重点覆盖AW A,#、OUTA、跳到、LD A,#*四条指令的汇编表、微程序和机器码定义并通过CP226环境完成源程序编写实现OUT寄存器交替显示22、55及2255的值且交替频率满足清晰辨识要求。与此同时详细说明了DAT、MIC、MAC三种文件的格式配置与操作流程包括指令助记符宽度、微地址映射、机器码细节解释等帮助读者深入理解汇编助记符翻译为机器指令的完整机制。资源为1个PDF文档大小55KB内容精炼、步骤清晰既可作为上海大学计算机组成原理实验的配套参考也适合其他高校同类课程学习、实验报告撰写与考前复习使用。目前已有90人学习下载。1. 指令系统不是出厂定死的在 CP226 上自建汇编指令集“指令系统由芯片出厂定死”是学计算机组成原理时最常见的误会。但在 CP226 教学实验箱上指令集完全可以自己设计助记符、机器码、微操作都由使用者定义硬件照表执行程序能真正跑起来。上海大学计算机学院的《计算机组成原理二实验》里就有这道“建立汇编指令系统”的研究实验。这份实验报告 pdf 按三条线索展开建立含中文助记符的指令系统AW A,#、OUTA、跳到、LD A,#*用这套指令写出交替显示 22、55、77 的程序以及分析为什么助记符可以用中文。实验把指令系统拆成 DAT、MIC、MAC 三个文件覆盖了查表汇编、微程序装载、机器码生成三个层次下面逐层拆开。2. 先把三张表的分工理清DAT 汇编表、MIC 微程序、MAC 机器码2.1 一条汇编指令在 CP226 上要过三关CP226 实验箱的指令系统不是固化的 ROM而是由三个文本文件共同定义。第一关是汇编阶段源程序里的助记符要翻译成机器指令汇编器逐行扫描源程序查到助记符就替换成对应编码这张“助记符→编码”的二维表就是汇编表文件后缀 .DAT。第二关是运行前装载编码本身不包含硬件的动作细节CPU 执行指令时要产生一组微操作比如把内存值送入寄存器、把 ALU 切到加法、把结果锁存到累加器这些微操作按节拍排列成微指令存放在微程序存储器 μEM 里负责装载 μEM 的文件后缀是 .MIC。第三关是机器码拼接多字节指令要携带立即数或存储地址寄存器号要占位这些细节由机器码文件 .MAC 描述供汇编器拼出完整的机器指令。2.2 汇编表 .DAT汇编器查表的依据DAT 文件每一行对应一条指令共三列。第一列是助记符宽度 20 个半角字符第二列是这条指令的 16 进制编码宽度 8第三列是指令字节数宽度 1。在实验箱的体系里第二列的值其实就是这条指令微程序在 μEM 中的起始地址所以它必须和 MIC 文件第三列一致。AW A,#* 10 2 OUTA 14 1 跳到* 18 2 LD A,#* 1c 2以 AW A,#* 为例助记符列是 20 个半角宽第二列 10 表示微程序从 μEM 地址 0x10 开始第三列 2 表示这条指令占两个存储单元因为后面还跟一个立即数汇编器就是靠这个字节数往下计算下一条指令地址的。OUTA 没有操作数所以字节数是 1。如果字节数填错汇编器生成的地址表会整体错位后面所有指令的跳转目标都会跟着偏。报告里 NOP 也单独占了一条指令地址 0x20字节数 1这在延时程序里会被大量使用。2.3 微程序文件 .MIC把控制字写进 μEMMIC 文件每一行对应一条微指令共 11 列每一列都有固定属性和宽度。第一列是助记符或微地址标记第二列是节拍第三列是微地址第四列是微程序内容也就是实验箱真正写入 μEM 的 16 进制控制字第五到第十一列是说明文字供人阅读装载时忽略。整个文件以FATCH取指段开头占用 000F 共 16 个微地址单元。复位后所有寄存器清 0实验箱首先执行FATCH把内存中的指令取到指令寄存器 IR。随后那条指令的微程序从 DAT 第二列给出的地址开始执行。AW 的微程序段跨 1013 四个地址OUTA 是 1417跳到* 是 181BLD A,#* 是 1C1FNOP 是 2023每段四条微指令。导入 MIC 的操作时机在运行前也就是进入“汇编下载”之前。如果不先导入μEM 里是空数据全速运行后取指段就会跑到全 0 的微地址现象通常是 OUT 寄存器没有反应或者状态灯乱跳。这个文件与 DAT 的对应关系是DAT 第二列的值等于 MIC 第三列某一段的起始地址。2.4 机器码文件 .MAC寄存器选择位与操作数类型MAC 文件是汇编表在机器码层面的展开每一行对应一条指令共五列助记符、机器码 1、机器码 2、机器码 3、注释。机器码 1 是指令微程序起始地址的二进制表示宽度 15最后两位用来选择 R0R3 中的寄存器所以报告里写成 000100xx 这样的形式xx 就是留给寄存器号的。机器码 2 是指令携带的立即数或存储器地址机器码 3 是第二个存储器地址宽度 2注释宽度 100。到这里能看出一个有用的规律机器码 1 最低两位被寄存器选择占用微程序地址只能在较高位存放。0x10 的二进制低两位正好是 00所以 AW 写成 000100xx0x1C 写成 000111xx0x14 写成 000101xx。排错时如果发现某条指令执行到错误的微地址先把机器码 1 右移两位和 DAT 第二列对一遍大多数对不上的问题都出在这里。2.5 三个文件的字段对应关系三张表在编辑时必须保持同一套数据用一张表可以直接对照检查。数据项DAT 位置MIC 位置MAC 位置助记符第 1 列第 1 列第 1 列微程序起始地址第 2 列16 进制第 3 列微地址段首机器码 1二进制低 2 位寄存器号指令字节数第 3 列微程序段长度注释区标明的占用单元操作数类型由字节数间接体现微指令决定取数通路机器码 2 的 II / MM编译一段源程序时汇编器查 DAT 完成助记符替换遇到多字节指令再查 MAC决定操作数怎么拼运行前导入 MIC把每条指令的微程序段装载进 μEM。三个文件服务于不同阶段但任何一处不一致最终都会表现为“汇编通过、运行不正常”。3. 在 CP226 里手搓指令集star.dat、star.mic、star.mac3.1 操作流程从模板复制改造CP226 环境下建指令系统不推荐从空文件开始。菜单里的“文件 → 打开指令系统/微程序”可以先打开实验箱自带的 insfile1 模板它包含 .mic、.dat、.mac 三种后缀的定义。打开后“源程序”窗口会显示模板内容按同样格式逐行打入自己的符号删除多余部分再用新文件名 star 和正确的后缀存到 D 盘。具体步骤是打开对话框后进入 c:\program files\CP226计算机组成原理\data\选 insfile1.mic 或 .dat 或 .mac确认在源程序窗口把模板替换成目标指令以 D:\star.dat、D:\star.mic、D:\star.mac 分别保存。要注意对话框一次只打开一种后缀三份文件要分开操作三次相当于把同一套指令定义成三种视图。提示存到 D 盘而不是原目录是为了保留实验箱默认指令集 insfile1 不被改动也方便后面“导入指令系统/微程序”时快速定位。3.2 star.dat16 行以内的汇编表模板里的助记符不需要全部保留只需定义本次实验要用到的四条指令再加上 NOP 占位。完整的 star.dat 如下AW A,#* 10 2 OUTA 14 1 跳到* 18 2 LD A,#* 1c 2 NOP 20 1第一列助记符宽度 20 半角字符第二列 16 进制编码宽度 8第三列字节数宽度 1。这里 AW A,#* 的“#”表示紧跟一个立即数所以字节数是 2跳到同样占 2 字节因为跳转目标是一个存储地址OUTA 和 NOP 无操作数字节数是 1。汇编器在翻译源程序时按行查这张表替换助记符并且依据第三列推进地址计数器所以第三列写错汇编出来的指令码会整体错位。3.3 star.mic把微程序段逐拍写全MIC 文件是整个实验里最容易抄错的一份。它的写法是从 00 地址开始先把FATCH取指段铺满 000F再依次排入五条指令的微程序段。报告里的完整内容如下_FATCH_ T0 00 CBFFFF 指令寄存器IR A 输出写入 1 T0 01 FFFFFF A 输出 1 T0 02 FFFFFF A 输出 1 T0 03 FFFFFF A 输出 1 T0 04 FFFFFF A 输出 1 T0 05 FFFFFF A 输出 1 T0 06 FFFFFF A 输出 1 T0 07 FFFFFF A 输出 1 T0 08 FFFFFF A 输出 1 T0 09 FFFFFF A 输出 1 T0 0A FFFFFF A 输出 1 T0 0B FFFFFF A 输出 1 T0 0C FFFFFF A 输出 1 T0 0D FFFFFF A 输出 1 T0 0E FFFFFF A 输出 1 T0 0F FFFFFF A 输出 AW A,#* T2 10 C7FFEF 存贮器值 EM 寄存器 W PC 输出 A 输出 1 1 T1 11 FFFE90 ALU直通寄存器 A 标志位 C,Z 加运算 1 T0 12 CBFFFF 指令寄存器IR PC 输出 A 输出写入 1 13 FFFFFF A 输出 OUTA T1 14 FFDF9F ALU直通用户 OUT A 输出 1 T0 15 CBFFFF 指令寄存器IR PC 输出 A 输出写入 1 16 FFFFFF A 输出 1 17 FFFFFF A 输出 跳到* T1 18 C6FFFF 存贮器值 EM 寄存器 PC PC 输出 A 输出写入 T0 19 CBFFFF 指令寄存器IR PC 输出 A 输出写入 1 1A FFFFFF A 输出 1 1B FFFFFF A 输出 LD A,#* T1 1C C7FFF7 存贮器值 EM 寄存器 A PC 输出 A 输出 1 1 T0 1D CBFFFF 指令寄存器IR PC 输出 A 输出写入 1 1E FFFFFF A 输出 1 1F FFFFFF A 输出 NOP T0 20 CBFFFF 指令寄存器IR PC 输出 A 输出写入 1 21 FFFFFF A 输出 1 22 FFFFFF A 输出 1 23 FFFFFF A 输出第 2 列 T0/T1/T2 是节拍第 3 列是微地址第 4 列是控制字。第 1 列的“1”表示微地址在上行基础上加 1这是模板里的省略写法保存时这些行必须逐行存在不能真用“1”占位符代替。AW 的微程序从 T2 开始C7FFEF 把内存值取到 W 寄存器同时 PC 输出并自增T1 拍 FFFE90 控制 ALU 直通并把 C、Z 标志位写入T0 拍回到取指。其余指令的执行入口与 DAT 第二列一一对应比如 LD A,#* 的段首 1C 和 DAT 里的 1c 是同一条指令的同一个入口。3.4 star.mac机器码文件的二进制细节MAC 文件在报告中给出如下内容_FATCH_ 000000xx 00-03 1 实验机占用不可修改 复位后所有寄存器清0 首先执行_FATCH_ 取指 000001xx 04-04 1 未使用 000010xx 08-0B 1 未使用 000011xx 0C-0F 1 未使用 AW A,#* 000100xx 10-13 II 2 OUTA 000101xx 14-17 1 跳到* 000110xx 18-1B MM 2 LD A,#* 000111xx 1C-1F II 2 NOP 001000xx 20-23 1按报告口径机器码 1 是被保留的 15 位字段最后两位对应 R0R3 选择。000100xx 里的 xx 在真正使用寄存器寻址时填入 00、01、10、11本次实验没有显式操作寄存器所以保留 xx。机器码 2 用 II 表示这条指令带立即数MM 表示带存储器地址跳到* 的 MM 和 AW 的 II 在汇编时会被替换成实际的操作数字段。10-13、14-17 这类区间写法在多数版本的 CP226 里属于注释性内容辅助人判断这条指令占几个微地址单元真正关键的是机器码 1 与 DAT/MIC 的地址保持一致。3.5 建完文件后的自查顺序三个文件写完先做一次静态检查第一助记符逐字符一致中文助记符不要混入全角空格第二DAT 第二列等于 MIC 某段起始地址且该段覆盖四个连续微地址第三MAC 机器码 1 右移两位后与 DAT 第二列相等。检查完再进入第 4 章的导入流程能省下大量单步调试时间。4. 让 OUT 寄存器交替显示 22、55、77源程序与 NOP 延时4.1 程序逻辑三条显示状态与一个循环这套指令系统里和显示直接相关的是 LD A,#、AW A,#、OUTA 三条指令。程序先让 A 等于 55h 并输出再让 A 等于 22h 并输出最后执行 AW A,#55h使 A 的当前值 22h 与立即数 55h 相加得到 77h输出。加法不是在汇编阶段算好再写进代码的而是由实验箱在运行期通过 ALU 加运算完成这正是 AW 这条指令微程序里 FFFE90 控制字那一段的作用。三组显示之间用大量 NOP 隔开最后用“跳到 L0”回到循环起点。4.2 源程序的写法源程序窗口里按行输入报告给出的程序结构如下L0: LD A,#55h OUTA NOP ; 从这里起粘贴 24 行 NOP作为显示延时 ; ...共 24 条 NOP LD A,#22h OUTA NOP ; 同样 24 行 AW A,#55h OUTA NOP ; 同样 24 行 跳到 L0 ENDCP226 的汇编器不识别“×24”这类简化写法代码块里的注释只是表达方式实际操作要逐行粘贴 NOP报告原程序里每一处延时都是 24 个 NOP 一字排开。L0 是标签给出循环入口END 是伪指令通知汇编器源程序到此结束不生成机器码。LD A,#55h 的 55h 是立即数对应 DAT 里 LD 的字节数 2跳到 L0 的 L0 会被汇编器替换成循环首地址所以跳到* 也被定义成 2 字节指令。4.3 交替频率的估算与调整实验要求“交替频率可以清晰辨识且不小于每秒一次”。CP226 的微程序时钟由实验箱统一产生软件里看不到直接改频率的菜单所以延时只能靠指令条数凑。一次 NOP 从取指到执行完需要经历FATCH的取指微程序段和 NOP 自己的执行段粗略算就是 16 拍加 4 拍。24 个 NOP 大约贡献 480 拍一轮循环里三条显示各执行一次总拍数在 600 拍上下配合实验箱的分频时钟肉眼可以清楚看到 22、55、77 依次出现。如果运行起来觉得切换太快把每处 NOP 从 24 加到 48显示停留时间近似翻倍如果太慢就减半。需要精确控制时可以数一下实验箱手册里单拍时间用公式“延迟拍数 NOP 条数 × 20”做预算再按实际观感微调。这个估算方式在处理其他实验箱时也通用先按取指加执行的周期数算总量再根据节拍频率换算时间。4.4 导入、汇编下载与全速运行程序输入前先做装载动作菜单“文件 → 导入指令系统/微程序”选择目录 D:\选中 star.mic 确定。这一步的作用是把第 3 章写的微程序内容写入实验箱的 μEM没有它运行时会因为取指段为空而无法启动报告的实验体会里特别强调了这一点运行前应事先调入 MIC 指令文件。在“汇编”菜单中点击“汇编下载”此时汇编器需要能查到 DAT 表如果此前导入的是 .mic而汇编器提示找不到助记符就再用“打开/导入指令系统”选一次 star.dat让汇编器持有查表依据。汇编下载成功后点击“全速运行”观察实验箱的 OUT 寄存器显示。正常情况下应重复出现 22、55、77 三组数。4.5 现象核对明确一点22 和 55 是直接载入的立即数77 不是程序写死的而是 22 与 55 在 ALU 中相加的结果。如果显示顺序变成 55、22、77检查代码里的 LD 顺序如果出现 22、22、55 之类的重复多半是跳到 L0 的地址有偏差回到 DAT 第三列字节数和 MAC 里 II/MM 的取值核对。5. 中文助记符与三文件一致性两个最容易忽略的细节5.1 中文助记符为什么能汇编实验思考题问的是“为什么汇编指令中可以用中文符号”。答案并不在硬件里CPU 只认微地址和控制字不认识任何助记符汇编器只是把助记符当作查表键在 DAT 表里逐字符匹配后替换成 16 进制编码。“跳到*”和“JUMP”对汇编器来说都是普通字符串匹配到哪一行就把那行的编码输出到机器指令里。中文符号可行是因为这个查表过程不区分字符来源同样道理如果自定义助记符时混入了全角空格或全角星号查表也会失败。DAT 助记符列按 20 个半角字符宽度切片一个中文占两个半角宽度所以“跳到”这类助记符后面补空格时要注意补齐到固定列宽而不是简单地按字符个数对齐。排错时先看源程序和 DAT 表里的字符是否完全一致尤其是全角与半角、空格数量这两处。5.2 三文件不一致的症状对照MIC、MAC、DAT 任意一个有错程序都无法正确运行这是报告结论里最有价值的一句。把常见不一致和症状对起来看不一致点典型症状排查位置助记符字符不一致汇编报错提示找不到指令三个文件第 1 列逐字符比对地址不一致运行后微地址灯跳到错误段显示乱串DAT 第 2 列 / MIC 第 3 列 / MAC 机器码 1字节数不一致指令间距错位循环跳转目标偏移DAT 第 3 列与源程序标签地址操作数类型写错立即数被当成地址读内存读到垃圾值MAC 机器码 2 的 II / MM汇编通过不等于指令语义正确。机器码层面的错误大多不在汇编期暴露而在全速运行后才出现所以静态自查三张表的一致性比反复改源程序更高效。5.3 调试技巧先单步再全速汇编下载后先不急着全速运行。CP226 支持单步执行每执行一拍暂停一次实验箱面板上的微地址灯会指出当前停在哪个 μEM 单元。复位后微地址应反复扫过 000F这是FATCH取指段执行第一条 LD A,#55h 时微地址进入 1C1FOUTA 会切到 1417AW 会走 1013“跳到*”会回到 1819 再做跳转随后重新进入取指段。只要微地址在该出现的位置出现指令系统就是通的。为了减少等待可以把三处 24 个 NOP 临时换成 1 个让循环边界更短确认跳转和显示逻辑正确后再恢复 NOP 数量调频率。进一步扩展时可以试着给 AW 增加一个带 R0R3 寄存器号的变体把 MAC 机器码 1 末尾的 xx 真正用起来那就是一条双操作数寄存器指令了。本文还有配套的精品资源点击获取