☰
微型计算机原理核心概念解析:进制转换、补码与寻址方式
2026/11/2 4:14:59 网站建设 项目流程

简介:本资源是《微型计算机原理与接口技术》(尹建华编著)配套习题的完整参考答案,面向高校计算机、电子、自动化等专业本科生及考研复习者,精准解决课后习题无解析、核心概念难落地、数制转换与寻址方式易混淆等学习痛点。文件为单个PDF文档(23KB),内容覆盖全书六章重点:第一章含二进制/十六进制/BCD码转换、原反补码计算、溢出判断;第二章聚焦8086存储器组织与总线周期(等待周期/空闲周期);第三章详解寄存器寻址、相对基址变址等八类寻址方式辨析;第四至六章涵盖指令系统应用、存储器扩展译码设计、I/O端口编程等典型题型。已有673人下载学习,答案步骤清晰、推导严谨,每道题均标注对应知识点,便于对照教材查漏补缺、强化对数字表示、CPU组织、存储管理及接口编程的系统性理解。

1. 《微型计算机原理与接口技术》习题答案:不是“抄作业”的速查手册,而是帮你把“黑匣子”拆开看懂的思维扳手

你有没有过这种体验:翻开《微型计算机原理与接口技术》,看到“段基地址+偏移地址=物理地址”这句话,点头说“哦,对”,可一合上书,再面对一道“CS=2000H,IP=1234H,求物理地址”的题,脑子却像卡住的8086总线——明明每个字都认识,连起来却读不懂它在说什么?这不是你笨,是这门课天生就带着一层“硬壳”:它不讲“为什么非得这样设计”,只给“结果怎么算”;不解释“补码为什么能统一加减”,只列“-36的补码是11011100”。就像第一次拧开老式收音机后盖,满眼是电阻、电容、跳线,却没人告诉你哪根线通声音、哪根线管调台——你缺的不是螺丝刀,而是一张带标注的内部电路图。

这份由尹建华老师教材配套的《习题答案.pdf》,恰恰就是那张图。它不是让你照着抄的“标准答案集”,而是一套逐行反向推演的思维脚手架:每道题的答案背后,都藏着一个被拆解过的认知节点——比如“156D = 10011100B = 9CH”这串等号,实际在告诉你:十进制转二进制时,156 ÷ 2 的余数序列(0,0,1,1,1,0,0,1)倒过来写才是正确二进制;而二进制转十六进制时,必须从右往左每4位一组(1001|1100),再分别对应9和C。它把教材里“一笔带过”的隐含逻辑,全摊开在你眼前。当你不再纠结“答案对不对”,而是追问“这个等号是怎么一步步成立的”,那些曾让你头皮发麻的“寻址方式”“总线周期”“ICW初始化”,就从玄学变成了可触摸的零件。

提示:这份答案的价值,不在于帮你交作业,而在于帮你建立“看到指令就能脑内模拟CPU动作”的直觉。它解决的不是“会不会算”,而是“为什么非得这么算”。


2. 数字表示:为什么计算机非要“用0和1说话”?——从进制转换到补码设计的底层逻辑

2.1 进制转换不是数学题,而是理解存储空间的钥匙

教材第一章的习题,表面是“把156D转成二进制”,实则在训练你一种底层视角:计算机所有数据,最终都必须塞进固定宽度的“格子”里。比如8位寄存器,最多只能存8个0或1。所以156D(十进制)转二进制,不是简单除2取余,而是要确认:它能不能被塞进8位格子?

我们来拆解题中这道典型题:

156D = 10011100B = 9CH

  • 第一步:确认位宽需求
    156 ÷ 2 = 78 余 0
    78 ÷ 2 = 39 余 0
    39 ÷ 2 = 19 余 1
    19 ÷ 2 = 9 余 1
    9 ÷ 2 = 4 余 1
    4 ÷ 2 = 2 余 0
    2 ÷ 2 = 1 余 0
    1 ÷ 2 = 0 余 1
    余数倒序:10011100→ 共8位,刚好填满一个字节(Byte)。如果结果是9位(如256D=100000000B),就说明它超出了8位寄存器容量,必须用16位(Word)来存——这就是为什么习题里反复出现“无符号数:151”“符号数:-105”这种对比:位宽决定了数据的表达范围,而进制转换是看清这个范围的第一步。

  • 第二步:十六进制是二进制的“速记法”
    答案里写“= 9CH”,这里C不是字母,而是十六进制的12。为什么非要多此一举?因为人眼识别“1001 1100”太费劲,但一眼扫过“9C”就能反应:“哦,高4位是9(1001),低4位是C(1100)”。就像快递单号用“SF123456789CN”比写一长串数字更易校验。习题中所有“XH”结尾的答案,都在暗示你:在调试硬件时,你看到的永远是十六进制地址(如0FFFF0H),而不是二进制。

2.2 补码:让CPU不用区分“加”和“减”的天才设计

再看这组题:

+1 原码 = 00000001 反码= 00000001 补码= 00000001
-1 原码 = 10000001 反码= 11111110 补码 = 11111111

初学者常问:“为什么-1的补码是11111111,而不是10000001?”——这问题问到了点子上。答案不在数学规则里,而在硬件成本里。

想象一下,如果CPU要支持“减法”,就得专门造一套减法电路。但工程师发现:把负数用补码表示后,减法可以变成加法。比如计算 5 - 1:

  • 5的二进制(8位):00000101
  • -1的补码:11111111
  • 相加:00000101 + 11111111 = 1 00000100(最高位溢出,丢弃)→ 结果是00000100 = 4

你看,没用任何减法器,只靠加法器就完成了!这就是补码存在的根本原因:省硬件、提速度、统一线路。习题里反复让你算“-36”“-128”的补码,不是为了考你记忆力,而是逼你习惯这种思维——当你看到SUB AX, BX指令时,脑中自动浮现的不再是“减法”,而是“AX加上BX的补码”。

2.3 小数转换:为什么0.675D = 0.1011B?浮点数精度陷阱的伏笔

题中这道小数转换常被忽略,但它埋着一个重大隐患:

0.675D = 0.1011B = 0.BH

验证一下:
0.1011B = 1×2⁻¹ + 0×2⁻² + 1×2⁻³ + 1×2⁻⁴ = 0.5 + 0 + 0.125 + 0.0625 =0.6875
而原数是0.675,差了0.0125!

这说明:很多十进制小数,在二进制下是无限循环小数(如0.1D = 0.0001100110011...B)。计算机只能截断存储,于是产生精度误差。这也是为什么习题特意列出“0.468D = 0.0111B”——它在提醒你:当你的程序涉及温度传感器读数、ADC采样值(如第10章的0BFH、66H)时,这些看似精确的十六进制数,背后可能已是四舍五入过的近似值。

注意:所有涉及ADC/DAC转换的接口编程(如第10章用8255A读取ADC0809),其输入/输出值本质都是离散的量化结果。理解小数转换的截断误差,是避免“为什么实测值总差0.1V”的第一道防线。


3. 计算机组织:CPU不是“万能大脑”,而是按剧本走位的精密演员

3.1 寄存器:CPU的“工作台”,不是“仓库”

习题第二章提到:

复位状态:CS = FFFFH, IP = 0000H, DS = 0000H...

初学者容易把CS(代码段寄存器)、DS(数据段寄存器)当成普通内存地址。错!它们是CPU的“工作台标签”。打个比方:你有4张工作台(CS/DS/SS/ES),每张台面都铺着同一块巨大画布(1MB内存),但每张台只允许你使用其中一段(64KB)。CS告诉CPU:“接下来执行的指令,都在我这张台面的某个位置”;DS则说:“你要读写的数据,在我这张台面的某处”。

所以“CS=FFFFH, IP=0000H”意味着:CPU复位后,会去地址FFFFH × 16 + 0000H = FFFF0H处取第一条指令。这个地址不是随机选的,而是BIOS固化程序的入口——就像工厂开机,机械臂默认移动到“启动按钮”位置。习题里反复出现的“1230H:0045H”这类段:偏移格式,就是在训练你:任何时候,都要先看段寄存器指哪张台,再看偏移量在台上找哪个点。

3.2 指令队列:CPU的“预读缓存”,不是“指令池”

题中描述:

指令队列:BIU(总线接口单元)预先从内存取指令,存入6字节队列,EU(执行单元)从中取指令执行

这解释了为什么8086能“边取指边执行”。但关键点在于:指令队列是FIFO(先进先出)的流水线,不是随意读写的RAM。比如你写了一段代码:

MOV AX, 1234H ADD AX, 5678H JMP NEXT

BIU会提前把这三条指令的机器码(如B8 34 12 05 78 56 EB 02)灌进队列。当EU执行到JMP NEXT时,队列里可能已存好NEXT处的指令——这就是“取指”和“执行”并行的基础。

但陷阱来了:如果你在程序中动态修改代码(自修改代码),比如用MOV [BX], AX改写了正在队列里的指令,CPU可能仍在执行旧指令!因为队列里的内容不会因内存修改而自动刷新。习题虽未直接考这点,但它解释了为什么早期病毒(如CIH)能通过覆盖中断向量表实现驻留——指令队列的存在,让“修改内存”和“影响执行”之间存在时间差。

3.3 寻址方式:不是语法糖,而是CPU的“寻宝地图”

第三章习题大量考察寻址方式,如:

⑶ 相对基址变址寻址,寄存器寻址

这名字很长,但本质就一句话:CPU如何根据一条指令,算出真正要操作的内存地址?

以MOV AX, [BX+SI+10H]为例:

  • BX是基址寄存器(比如存数组首地址)
  • SI是变址寄存器(比如存索引号)
  • 10H是位移量(比如结构体中某个字段的偏移)
  • CPU计算:物理地址 = (DS × 16) + BX + SI + 10H

为什么需要这么复杂?因为程序要处理不同场景:

  • MOV AX, [1234H](直接寻址)→ 固定地址,适合全局变量
  • MOV AX, [BX](寄存器间接寻址)→ 动态地址,适合遍历数组
  • MOV AX, [BX+SI+10H](相对基址变址)→ 结构体数组,如student[i].score

习题答案里标出每种寻址方式的名称,是在帮你建立“看到指令就条件反射出地址计算公式”的肌肉记忆。当你写ADD AL, [DI]时,脑中应立刻浮现:“AL += 内存中地址为(DS×16+DI)处的字节值”。

提示:所有寻址方式的终极目标,都是解决同一个问题——如何用有限的指令长度(8086指令最长6字节),表达无限的内存地址空间(1MB)?位移量、寄存器组合、段超越前缀(如ES:),全是为此设计的压缩编码。


4. 存储器与I/O系统:地址线不是“电线”,而是CPU的“门禁卡”

4.1 全译码 vs 部分译码:为什么你的内存会“一址多用”?

第五章习题直击要害:

全译码法:将除片内寻址外的全部高位地址线都作为译码器输入…地址范围唯一确定
部分译码:只用高位地址的一部分译码…会出现地址重叠

这关系到一个致命问题:你写的MOV AX, [2000H],到底访问的是哪块芯片?

假设系统有2片8KB RAM(6116),地址线A0-A12用于片内寻址(2¹³=8192),剩余A13-A19共7根高位线需译码。

  • 全译码:用A13-A19全部7根线接译码器(如74LS138),输出4个片选信号。结果:每片RAM有唯一地址段(如00000H-01FFFH),绝不重叠。
  • 部分译码:只用A15、A16两根线译码,其余A13、A14、A17-A19悬空。结果:A13/A14/A17等位无论0或1,只要A15A16=01,就选中同一片RAM!于是00000H、00001H、04000H、08000H……所有A15A16=01的地址,都映射到同一物理芯片——这就是“地址重叠”。

习题中“第1组芯片地址范围:00000H~007FFH”明确给出全译码结果,就是在告诉你:在真实硬件调试中,如果你发现往00000H写数据,04000H也变了,别急着换芯片,先查译码电路是否用了部分译码!

4.2 总线周期:CPU的“呼吸节奏”,不是“瞬间完成”

题中定义:

等待周期:CPU与慢速设备交换信息时,插入必要等待状态…总线信息保持不变
空闲周期:两个总线周期之间,BIU不执行任何操作的时钟周期

这揭示了CPU工作的真相:它不是永动机,而是严格按“节拍”运行的精密仪器。一个典型的读内存总线周期包含:

  1. T1:CPU发出地址+地址锁存信号(ALE)
  2. T2:发出读信号(RD),存储器开始准备数据
  3. T3:存储器把数据放到数据总线上
  4. T4:CPU采样数据,周期结束

但如果存储器响应慢(如ROM速度<250ns),T3来不及准备好数据,CPU就在T3后插入等待周期(TW),重复T3状态,直到存储器发出“READY”信号。此时,地址、数据、控制信号全部冻结——就像乐队指挥暂停挥棒,所有乐手保持姿势不动。

习题里“76H-0FEH无溢出”这类判断,表面是算术题,实则在训练你:CPU执行每条指令消耗的时钟周期数,取决于它触发了多少次总线操作。MOV AX, [1234H]要读内存,耗时远大于MOV AX, BX(纯寄存器操作)。

4.3 I/O端口:不是内存,而是CPU的“专用信箱”

第六章习题:

WAIT: MOV DX, 101H / IN AL, DX / TEST AL, 80H / JZ WAIT

这段代码在轮询一个I/O端口(DX=101H),检查状态寄存器的D7位(80H=10000000B)是否为1。注意:这里用的是IN AL, DX,不是MOV AL, [101H]!

关键区别:

  • 内存地址空间:00000H-FFFFFH(1MB),用MOV指令访问
  • I/O端口地址空间:0000H-FFFFH(64KB),用IN/OUT指令访问

为什么分两套空间?因为I/O设备(如键盘控制器、ADC芯片)响应速度远慢于内存,且操作逻辑完全不同(如“向端口写1启动ADC,读端口获转换结果”)。如果混用内存地址,CPU会误把设备当RAM操作,导致硬件损坏。

所以IN AL, DX的本质是:CPU向地址总线发DX值,同时置IOR(I/O读)信号有效,告诉译码电路:“这不是读内存,是读I/O设备!”——习题中所有IN/OUT指令,都在强化这个认知:I/O操作是受控的、有协议的通信,不是简单的数据搬运。

注意:第10章用8255A控制ADC0809的程序中,OUT PORTC, AL向控制端口写命令,IN PORTB, AL从状态端口读就绪信号,IN PORTA, AL从数据端口读转换值——三者地址不同、功能不同、时序不同。混淆它们,轻则读不到数据,重则烧毁芯片。


5. 常见误区与易混概念:你以为懂了,其实还在门外

5.1 “原码/反码/补码”不是三种编码,而是同一套硬件的三种视角

易混点:认为“原码是正数形式,反码是负数中间态,补码是最终形态”,所以-1的原码=10000001,反码=11111110,补码=11111111,三者独立存在。
为什么混:教材常分开讲解,让人误以为它们是并列的编码标准。
怎么区分:

  • 原码:人类约定的“符号+绝对值”表示法(最高位0正1负),仅用于教学解释,硬件不使用。
  • 反码:原码按位取反(符号位不变),是补码的中间步骤,硬件不存储反码。
  • 补码:反码+1,是CPU内部唯一使用的整数表示法。所谓“-1的补码是11111111”,意思是:CPU把11111111这个二进制模式,解释为-1。它不是“由原码变来”,而是直接定义。

实操验证:在调试器中查看内存,你永远看不到“原码”或“反码”,只看到补码值。MOV AL, -1汇编后,机器码就是B0 FFH(FFH=11111111B)。

5.2 “段地址×16+偏移地址”不是数学公式,而是物理地址生成器

易混点:把CS×16+IP当成纯数学计算,认为CS=1000H, IP=2345H,物理地址=1000H×10H+2345H=12345H,就完事了。
为什么混:忽略了“×16”本质是左移4位(二进制),而地址总线是20位,段寄存器只有16位。
怎么区分:

  • 段寄存器(CS/DS等)本身不存物理地址,只存“段基址”(Segment Base Address)。
  • CPU内部有地址加法器,将段寄存器值左移4位(等效×16),再与偏移量相加,生成20位物理地址。
  • 关键约束:段基址必须是16的倍数(即低4位为0),所以CS=1234H是非法的(1234H×10H=12340H,但1234H本身低4位不为0)。习题中所有段地址(如A000H、FFFFH)都满足此条件。

5.3 “指令队列”不是缓存,而是取指/执行解耦的流水线

易混点:认为指令队列像CPU缓存(Cache),可以随机读写、自动更新。
为什么混:都叫“队列”,且都存指令。
怎么区分:

特性指令队列(8086)现代CPU缓存(L1 Cache)
大小固定6字节数KB~MB
访问方式FIFO(先进先出)随机读写,LRU替换
更新机制BIU填充,EU取走,不响应内存修改自动监听总线,同步内存
作用解决BIU/EU速度差减少内存访问延迟

习题中“复位后CS=FFFFH, IP=0000H”之所以重要,是因为指令队列初始为空,CPU必须从FFFF0H取第一条指令填入——这是硬件强制的启动流程,与缓存无关。

5.4 “I/O端口”和“内存映射I/O”不是同类概念,而是两种架构

易混点:看到IN AL, 200H和MOV AL, [200H]都访问地址200H,以为只是指令不同。
为什么混:地址数值相同,易产生“都是读地址200H”的错觉。
怎么区分:

  • 独立I/O空间(8086采用):CPU有专用IN/OUT指令,地址线经IOR/ IOW信号区分,I/O端口与内存地址完全隔离。IN AL, 200H访问的是I/O芯片的寄存器,MOV AL, [200H]访问的是内存单元,二者物理线路不同。
  • 内存映射I/O(ARM/MIPS常用):I/O设备寄存器被映射到内存地址空间某段(如0xFF000000-0xFF0000FF),用普通MOV指令读写。此时MOV AL, [200H]若指向该段,实际在读I/O寄存器。

习题中所有I/O操作均基于8086独立空间模型,OUT 2FBH, AL中的2FBH是端口地址,绝非内存地址。混淆二者,会导致硬件无法响应。

5.5 “等待周期”不是CPU“偷懒”,而是硬件协同的生死线

易混点:认为插入TW是CPU性能不足,想方设法避免。
为什么混:现代CPU主频高,很少见TW,误以为它是“缺陷”。
怎么区分:

  • TW是硬件握手协议的核心环节。例如ADC0809转换需100μs,而8086一个总线周期约500ns,CPU必须插入数百个TW等待EOC(转换结束)信号。
  • 若强行取消TW(如用快速存储器替代ADC),CPU会读到未完成的乱码,程序崩溃。
  • 习题第七章8259A中断初始化、第八章8255A控制,所有涉及外设的程序,其健壮性都依赖正确插入TW(通过IN指令轮询或INT中断)。

提示:在调试接口电路时,示波器抓到的RD信号上出现多个TW脉冲,是正常现象;若完全没有TW,反而说明外设未响应,需查硬件连线。


6. 什么时候该用这份答案?什么时候该合上它?——一个血泪经验的边界判断

6.1 该用它的时候:当你在“卡点”上反复撞墙

我带过一批学生做课程设计——用8086+8255A+ADC0809搭建温度采集系统。几乎所有人卡在同一个地方:程序运行后,IN AL, PORTB读到的始终是00H,死活等不到EOC(转换结束)信号。

他们翻教材、查百度、问同学,折腾三天无果。最后我让他们打开这份习题答案,翻到第十章第6题:

MOV AL, 92H / OUT PORTC, AL / MOV AL, 01H / OUT PORTC, AL / ... / IN AL, PORTB / RCR AL, 00H / JNC WW

重点不是代码,而是注释:

PC0接ADC0809的START,PC1接ADC0809的OE,PB0接ADC0809的EOC

学生恍然大悟:原来OUT PORTC, AL写的是控制字,而AL=92H(10010010B)的bit1=1,正是让PC1=1(OE有效),bit0=0让PC0=0(START无效)——但他们的硬件连线,把PC0接到了EOC!

这就是这份答案的真正价值:它把教材里分散在“8255A控制字格式”“ADC0809时序图”“端口地址分配”三个章节的知识点,浓缩在一行OUT PORTC, AL的上下文中。当你在硬件联调中遇到“信号没反应”,不要盲目改代码,而是对照答案中同类型题目的端口配置、信号极性、时序顺序,逐项核对。

6.2 该合上它的时候:当你开始“背答案”而非“建模型”

有位同学曾自豪地告诉我:“我把第一章所有进制转换题全背下来了,考试肯定满分!”结果期中考试一道新题:将十进制小数0.3125D转为二进制,他愣住了。

为什么?因为他把“0.675D=0.1011B”当成了固定答案,没记住背后的算法:

  • 小数转二进制:乘2取整,顺序排列。
  • 0.3125 × 2 = 0.625 → 整数0
  • 0.625 × 2 = 1.25 → 整数1
  • 0.25 × 2 = 0.5 → 整数0
  • 0.5 × 2 = 1.0 → 整数1
  • 结果:0.0101B

这份答案的正确用法,是把它当作验证自己推演过程的镜子,而不是替代思考的拐杖。每做一道题,强迫自己:

  1. 先不看答案,手写完整推演(如补码计算:先写原码,再取反,再+1);
  2. 对照答案,看哪一步出错(是取反漏了符号位?还是+1时进位错了?);
  3. 把错误类型归档(如“负数补码+1进位错误”),下次同类题优先检查此处。

6.3 一份答案的终极检验:能否独立写出“初始化程序”

翻到第七章第12题:8259A初始化程序

MOV AL,13H / OUT 80H,AL / MOV AL,80H / OUT 81H,AL / MOV AL,01H / OUT 81H,AL

这短短6行,凝聚了中断控制器最核心的配置逻辑:

  • AL=13H(00010011B)→ ICW1:边沿触发、单片、需要ICW4
  • AL=80H→ ICW2:中断向量基址80H(对应INT 80H-87H)
  • AL=01H→ ICW4:8086模式、非缓冲、自动EIO

如果你能不看答案,默写出8255A方式字(如第八章MOV AL, 83H)、8253计数器控制字(第九章MOV AL, 14H),并解释每个bit的含义,说明你已把答案内化为自己的知识模块。

反之,如果离开答案就写不出OUT 23H, AL该送什么值,证明你还在“记忆碎片”,没形成“芯片配置模型”。这时,请合上答案,回到教材对应章节,亲手画一张8255A控制字格式图,标出D7-D0每位的功能,再对照真值表推演一遍。

从那以后我每次教学生调试接口电路,都强制他们:

  1. 先手绘硬件连接图(标清芯片引脚、CPU地址线、控制信号);
  2. 再根据芯片手册,手写初始化程序(不查答案);
  3. 最后才打开这份答案,逐行比对差异,把差异点写进实验报告“问题分析”栏。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询