
简介这份PDF面向学习《微型计算机原理与接口技术》尹建华编著的本科生与备考读者针对教材课后习题缺少对照答案、复习时难以自查的问题提供逐章参考答案。内容覆盖数制转换与机器数表示、8086寄存器与总线周期、各类寻址方式辨析、存储器全译码与部分译码及芯片扩展地址范围计算、I/O端口查询与中断控制以及MOV、XOR、SAL、条件转移等常用指令的程序分析并附有排序、除法、数组处理等汇编片段。资源包共1个文件为PDF格式大小约23KB轻量便于打印或移动端翻阅。目前已有675人学习下载适合课堂同步练习、期末复习与考研自测时对照使用帮助读者定位错题、理清解题思路并巩固接口电路设计方法。1. 补码、段地址与片选一份习题答案里藏着的三层抽象很多人翻《微型计算机原理与接口技术》的习题答案只把它当成对答案的工具156D 等于 9CH-1 的补码是 FFH看一眼就翻过去。但真正值得琢磨的是这些数字背后其实是三层彼此咬合的抽象——第一层是数在寄存器里怎么表示第二层是地址怎么从段基址和偏移拼出来第三层是芯片怎么被地址线选中。三层任何一层理解偏了答案就会以“看起来对、实际跑不通”的方式翻车。这份答案覆盖了数制转换、原反补码、8086 寄存器复位状态、寻址方式、存储器全译码与部分译码、8259A 与 8253 初始化等关键节点正好可以顺着它把底层机制捋一遍。搞懂这三层你再看任何一段汇编或初始化代码都能在脑子里还原出电信号层面的动作。2. 数的表示为什么 -128 的补码是 80H 而不是 81H2.1 原码、反码、补码的递推关系答案里给出了一组对照1 的原码、反码、补码都是 00000001-1 的原码是 10000001、反码是 11111110、补码是 11111111-36 的原码是 10100100、反码是 11011011、补码是 11011100。这组数字不是背出来的而是从一条规则推出来的正数三码相同负数反码是原码除符号位外按位取反补码是反码加一。为什么要有补码因为计算机里只有加法器没有“减法器”。把减法变成加负数就必须让负数在模 2^n 的意义下和它的绝对值互补。以 8 位为例-1 的补码是 11111111它加上 00000001 正好溢出成 00000000这就是模 256 下的“零”。反码的问题在于存在 0 和 -0 两个零00000000 和 11111111补码加一之后把 -0 归并成了 00000000顺带多出一个编码 10000000。2.2 -128 的特殊性为什么它没有原码和反码答案里 -128 的原码写成 1000000010000000、反码写成 111111101111111这其实是 16 位写法下的示意8 位下 -128 根本没有合法的原码和反码。原因很直接8 位原码能表示的负数范围是 -127 到 -1-128 需要 9 位才能写出“符号位 1 绝对值 10000000”。补码把这个缺口补上了10000000 按“取反加一”的逆运算还原得到的是 10000000 本身它被约定为 -128。这就是补码表示范围是 -128 到 127、而不是对称的 -127 到 127 的根源。答案第 8 题给出 8 位无符号 0~255、8 位有符号 -127~127、16 位有符号 -32767~32768这里的边界写法需要留意严格说 8 位有符号是 -128~12716 位是 -32768~32767。习题答案里出现的这种边界表述恰恰是很多人踩坑的地方——范围端点写错一位后面的溢出判断就全错。2.3 溢出判断为什么 34H 89H 被判为无溢出答案第 11 题给出 34H 89H 无溢出、0AFH 45H 无溢出、76H - 0FEH 无溢出。判断溢出的经典规则是两个同号数相加结果符号变了就是溢出异号数相加永不溢出。34H52和 89H-119异号结果自然不溢出。0AFH 作为有符号数是 -8145H 是 69异号相加也不溢出。76H - 0FEH 等价于 76H 02H同号相加结果 78H 符号未变不溢出。这里有个血泪经验很多人用“最高位进位”判断溢出这只对无符号数成立。有符号溢出看的是次高位向最高位的进位与最高位进位是否异或为 1。答案里没展开这条但它是理解 OF 标志位的关键。; 判断有符号加法的溢出OF C6 XOR C7 ; 以 8 位加法为例硬件内部逻辑等价于 ; OF (进位进入符号位) XOR (进位流出符号位) MOV AL, 7FH ; 127 ADD AL, 01H ; 加 1 ; 结果 80H符号位由 0 变 1OF1溢出 JO OVERFLOW ; 溢出则跳转代码里的JO就是读 OF 标志。参数含义7FH 是 8 位有符号最大正数加 1 后越过上界硬件把 OF 置 1。这段逻辑说明溢出不是“结果超出位宽”这么模糊而是符号位语义被破坏的精确信号。3. 地址的形成段基址左移四位之后到底发生了什么3.1 物理地址 段基址 × 16 偏移地址答案第 6 题给出 1230H:0045H 和 1000H:2345H 两组段地址与偏移第 7 题给出 90000H~9FFFFH 的地址范围。8086 的物理地址计算是段基址左移 4 位再加偏移1230H 左移四位是 12300H加 0045H 得 12345H1000H 左移四位是 10000H加 2345H 也是 12345H。同一个物理地址可以由多组段:偏移表示这就是“地址重叠”的根源。为什么这么设计8086 内部寄存器只有 16 位最大能寻址 64KB但地址总线有 20 位能寻址 1MB。段寄存器左移四位相当于给 16 位偏移“垫”了一个 20 位的基座用两个 16 位寄存器拼出 20 位地址硬件代价极小。代价是段只能从 16 字节边界开始且同一物理地址有多种写法。3.2 复位状态为什么 CS 是 FFFFH 而 IP 是 0000H答案第 5 题列出复位后 FR、IP、CS、DS、SS、ES 的状态IP0000H、CSFFFFH、DS0000H、SS0000H、ES0000H指令队列清空。CSFFFFH、IP0000H 算出的物理地址是 FFFF0H这正是答案第 5 题里出现的 0FFFF0H。复位后 CPU 从 FFFF0H 取第一条指令这个位置通常放一条跳转指令跳到 BIOS 初始化代码。为什么是 FFFF0H 而不是 00000H因为高地址端留给 ROM复位向量放在顶部可以保证 ROM 芯片的片选逻辑简单同时让低地址端完整留给 RAM。这个设计动机在答案里没写但从“复位后 CS 固定为 FFFFH”这一条能反推出整个存储器布局的意图。3.3 寻址方式相对基址变址到底在算什么答案第 3 章第 1 题列出多种寻址方式其中“相对基址变址寻址”对应[BXSIdisp]这类形式。它的有效地址是 BX SI 位移量三者相加。为什么需要这种复合寻址因为它同时支持“基址”和“变址”两个维度基址指向一个结构体或数组的起点变址指向数组内元素位移量指向结构体内字段。一条指令就能表达“二维表里某个单元格”的地址不用先算再取。; 相对基址变址[BXSIDISP] ; BX 数组基址, SI 元素索引, DISP 结构体内偏移 MOV AX, [BXSI4] ; 取基址索引4 处的字 ; 有效地址 EA BX SI 4 ; 若 BX1000H, SI0006H, 则 EA100AH参数说明BX 和 SI 都是 16 位寄存器DISP 是 8 位或 16 位立即数。代码后的机制是CPU 在地址生成阶段完成三次加法不占用额外的指令周期。这种寻址方式在编译器生成数组和结构体访问代码时极其常见理解它等于理解了高级语言里arr[i].field的汇编投影。4. 存储器与接口芯片片选信号为什么决定了地址范围4.1 全译码与部分译码的取舍答案第 5 章第 8 题把全译码和部分译码讲得很清楚全译码把所有高位地址线都接入译码器每片芯片的地址范围唯一且连续不会重叠但译码电路复杂部分译码只用一部分高位地址线会出现地址重叠和地址不连续浪费地址空间但电路简单。这个取舍的本质是“地址空间换电路成本”。全译码下6116 芯片 4 片、每 2 片一组地址范围 00000H~007FFH 和 00800H~00FFFH边界干净。部分译码下同一块物理存储会响应多个地址程序里写错地址也能“碰巧”访问到调试时极难发现。我一般会这么理解全译码是“每个房间一把唯一钥匙”部分译码是“一把钥匙开一排房间”后者省锁但容易走错门。4.2 6116 与 2716 的地址范围是怎么算出来的答案第 11 题给出 6116 芯片 4 片、每 2 片构成 1 组第 1 组地址 00000H~007FFH第 2 组 00800H~00FFFH。6116 是 2K×8 的 RAM2K 对应 11 根地址线A0~A10片内寻址范围是 000H~7FFH。两组之间的分界在 A11 位A110 选第 1 组A111 选第 2 组。所以第 1 组范围是 00000H~007FFH第 2 组是 00800H~00FFFH。答案第 12 题里 2716 是 2K×8 的 EPROM4 片地址范围 00000H~007FFH、00800H~00FFFH、01000H~017FFH、01800H~01FFFH每片间隔 800H正好是 2K 的步长。2114 是 1K×4 的 RAM每 2 片拼成 1K×88 组地址范围从 00000H~003FFH 到 01C00H~01FFFH每组间隔 400H对应 1K 步长。这些数字不是背的是“片容量决定片内地址线根数、片数决定片选译码位数”推出来的。4.3 8259A 初始化ICW 序列为什么不能乱序答案第 7 章第 12 题给出初始化程序先MOV AL,13H写 80H再MOV AL,80H写 81H再MOV AL,01H写 81H。13H 是 ICW1二进制 00010011D41 表示需要 ICW1D01 表示需要 ICW4D10 表示单片。80H 是 ICW2设定中断向量基址。01H 是 ICW4表示 8086 模式。ICW 必须按 ICW1→ICW2→ICW3→ICW4 的顺序写入因为 8259A 内部有一个状态机靠写入顺序和 ICW1 里的标志位决定后续接收几个字节。顺序错了芯片会把 ICW2 当成 ICW3 解析中断向量基址就跑到别处去了。这种“靠写入顺序隐式编码状态”的设计在早期接口芯片里很常见调试时如果中断不响应第一件事就是检查 ICW 序列有没有写全。; 8259A 初始化单片、8086 模式、向量基址 80H MOV AL, 13H ; ICW1: 边沿触发, 单片, 需要 ICW4 OUT 80H, AL MOV AL, 80H ; ICW2: 中断向量基址 80H OUT 81H, AL MOV AL, 01H ; ICW4: 8086/8088 模式, 非缓冲, 正常 EOI OUT 81H, AL参数说明80H 是 8259A 的偶地址端口A0081H 是奇地址端口A01。ICW1 写偶地址ICW2~ICW4 写奇地址这个地址分配由芯片引脚 A0 决定。代码后的机制是8259A 通过 A0 和写入顺序两个维度区分四个初始化命令字硬件上没有独立的命令寄存器。5. 避坑习题答案里最容易看走眼的几个地方5.1 现象-128 的原码写成 16 位误以为 8 位也有原码原因8 位原码的负数范围只到 -127-128 需要 9 位才能表示“符号位 绝对值 10000000”。答案里用 16 位写法是为了展示取反加一的过程不代表 8 位下 -128 有合法原码。解决记死“补码比原码多表示一个最小负数”8 位补码范围 -128~127原码和反码范围 -127~127。5.2 现象用最高位进位判断有符号溢出结果和答案对不上原因最高位进位是 CF属于无符号数溢出标志有符号溢出是 OF看的是次高位向符号位的进位与符号位向外进位的异或。34H89H 最高位可能产生进位但 OF0。解决有符号看 OF无符号看 CF两者不能混用。写汇编时JO和JC分别对应这两个标志。5.3 现象段地址和偏移地址算出的物理地址对不上差了一位原因段基址左移四位是“乘 16”不是“乘 10”十六进制下左移一位即可。1230H 左移四位是 12300H不是 1230H 加 4 个零之外的任何东西。解决手算时把段基址末尾补一个 0再和偏移做十六进制加法注意进位。5.4 现象8259A 初始化后中断不响应检查 ICW 内容都对原因ICW 写入顺序错了或者 ICW1 的 D4 位没置 1芯片根本没进入初始化序列。解决确认 ICW1 的 D41按 ICW1→ICW2→ICW3→ICW4 顺序写偶地址写 ICW1、奇地址写后续。用示波器或逻辑分析仪看 A0 和 WR 的时序最直接。5.5 现象存储器地址范围算出重叠程序访问越界却不报错原因用了部分译码高位地址线没全部接入译码器同一物理单元响应多个地址。解决需要唯一地址范围时用全译码已经用部分译码的板子在软件里把地址范围收窄到实际使用的那一段别依赖“越界会崩”的假设。6. 从答案到机制怎么用这份资源验证自己的理解这份习题答案的价值不在于核对数字而在于它把“数表示—地址形成—芯片选通”三层机制用具体题目串了起来。我的用法是拿到一道题先不看答案自己推一遍物理地址或补码再对照答案找差异差异出现的地方往往就是某一层抽象没打通。比如 -128 的补码题如果只记 80H 而不理解“补码多一个最小负数”换到 16 位就会把 -32768 写成 8000H 却说不清为什么。验证方法上我习惯把答案里的初始化程序段抄进模拟器跑一遍看端口写入顺序和芯片状态机的对应关系。8253 的初始化在答案第 9 章出现多次MOV AL,14H写 343H、MOV AL,N写 340H、MOV AL,9AH写 343H这三步对应控制字、计数初值低字节、计数初值高字节的顺序。跑一遍就能看到控制字里的 D5D4 决定后续写几个字节、先写低还是先写高写错顺序计数器就装不进初值。设计取舍上这份材料反映的是 8086 时代的典型思路用最少的硬件引脚和寄存器宽度靠时序和写入顺序编码状态把复杂度推给软件初始化序列。今天的接口芯片早就把这些序列固化进驱动或硬件自动完成但“状态机靠顺序驱动”这个模式没变读寄存器、写命令字的时序约束依然是嵌入式调试的核心。从那以后我每次碰初始化序列都强制先画一遍“写哪个地址、第几个字节、芯片处于哪个状态”的时序表再动手写代码。希望帮到你。本文还有配套的精品资源点击获取