计算机组成原理考点解析:存储器扩展、按字编址与补码计算 📅 发布时间:2026/9/19 16:14:45 👁 浏览次数: 简介大连理工大学《计算机组成与结构》考试原题PDF面向正在复习机组课程、备战期末的高校计算机相关专业学生。试卷为软件学院2007年1月闭卷A卷包含填空、单选两类经典题型涉及冯·诺依曼硬件五大部件、半导体磁表面光存储器分类、堆栈指针指示机制、DMA传送三阶段、RAM芯片并联串联扩展、原码补码反码差异、CPU运算器与控制器构成等核心考点并涵盖字长16位存储器地址线数据线推算、8位操作码指令条数、8位定点补码整数范围等典型计算题可帮助读者对照教材逐项巩固基础也能用于考前限时模拟自测。资源为单份PDF文档压缩包仅25KB下载后可直接打开浏览或打印作答。目前已有75人学习这份试题虽然题目年份较早但其中的基础题型与计算思路至今仍是课程重点适合考前快速查漏补缺、检验复习效果。1. 大连理工计算机组成与结构A卷2007年的填空选择今天的考点还是这些2007年1月18日软件学院这门课用A卷闭卷考满分100填空15分、单选10分后面75分全是设计题和综合题。真正让人丢分的往往不是后面的综合题而是填空里那道“512KB按字编址需要几条地址线”的计算——答案为什么是19而不是18很多人考完都没想明白。这套卷子考点密度很高冯·诺依曼结构、存储器分类、堆栈指针、DMA三阶段、补码表示范围、CPU组成覆盖了计算机组成与结构这门课最核心的基础计算和概念判断。把它吃透比盲目刷十套新题更省时间适合正在期末复习的本科生也适合工作后想快速重建硬件基础概念的开发者。2. 存储器扩展的串并联计算4K×8位芯片数与按字编址的地址线宽度2.1 位扩展与字扩展的本质区别填空第2题先考存储介质分类半导体存储器、磁表面存储器、光存储器。这个分类标准是按存储介质来的半导体存储器速度快但断电丢数据磁表面存储器容量大但速度慢光存储器则介于两者之间。分类题背住三个词就行真正需要动手算的是后面那道芯片扩展题要组成4K×8位的存储器需要8片4K×1位静态RAM并联或者4片1K×8位静态RAM串联。第一问是位扩展第二问是字扩展。判断扩展方式的标准很简单看变化的是数据位数还是存储单元数。扩展方式变化量地址线处理数据线处理典型场景位扩展数据位数变多所有芯片共用地址线每片只输出一部分数据位4K×1位拼成4K×8位字扩展存储单元数变多高位地址做片选译码数据线直接并联1K×8位拼成4K×8位位扩展中每片4K×1位芯片都有12根地址线2^124096这12根地址线同时接到8片芯片上片选信号CS也接在一起每次访问同时选中8片数据输出分别接到数据总线的D0-D7拼成一个完整的8位字。字扩展则反过来4片1K×8位芯片各有10根地址线2^101024低10位地址线全部并联再拿2根高位地址线经过译码器产生4个片选信号每次只选中其中一片。这样总地址线是10212根容量正好是4K。如果题目改成“用1K×1位芯片组成4K×8位”先把容量都换算成总位数(4K×8)/(1K×1)32片再按字扩展和位扩展的组合方式组织这种变式在模拟卷里很常见。2.2 按字编址和按字节编址的地址线陷阱填空第7题原卷问字长16位存储器容量512KB按字编址需要多少条地址线和数据线。数据线没有争议字长16位就是16根。地址线的问题出在“按字编址”四个字上。按字节编址时512KB512×1024524288字节2^19524288所以地址线要19根但按字编址时每个字占2字节可寻址的字数是524288÷22621442^18地址线只需要18根。原卷答案写19条实际上只有按字节编址才是19条如果严格按题目说的“按字编址”正确答案应该填18。提示原卷答案写的是19条这是按字节编址的结果题目明确写“按字编址”时应填18。期末复习时先和任课老师的口径确认避免明明算对了却吃哑巴亏。我一般写一段小代码来校验这类计算省得心算出错。import math capacity_byte 512 * 1024 # 512KB单位是字节 word_bits 16 # 字长16位 word_bytes word_bits // 8 # 每字占2字节 # 按字节编址 addr_byte math.ceil(math.log2(capacity_byte)) # 按字编址 words capacity_byte // word_bytes addr_word math.ceil(math.log2(words)) print(f按字节编址: {addr_byte} 条地址线) print(f按字编址: {addr_word} 条地址线) print(f字数量: {words})计算逻辑是先把512KB换算成字节数再按“一个字占word_bytes字节”算出总字数最后对字数取以2为底的对数向上取整。向上取整是因为地址线根数必须是整数如果容量不是2的整数次幂多出来的线就是冗余地址。运行结果是按字节编址19条、按字编址18条和手动推的结论一致。2.3 片内地址线与片选地址的分配动手设计存储器的时候地址线要分成“片内地址”和“片选地址”两部分。4K×8位的目标容量对应总地址线12根即A11-A0。用4片1K×8位芯片时A9-A0这10根作为片内地址线直接进芯片A11-A10这2根进译码器产生片选信号CS0-CS3。用8片4K×1位芯片时A11-A0共12根全部进芯片CS统一接片选使能信号。前者多译码电路后者多数据引脚成本和接线方式不同但最终都能得到4K×8位。做题时只要抓住一条片内地址决定每片容量高位地址决定用了几片芯片数怎么变都算得出来。3. 补码的原点与边界8位定点的编码唯一性和-128~127范围推导3.1 为什么只有补码的0和-0是同一个编码填空第6题问的是三种机器数里哪一种的0和-0表示相同。8位原码里0写作00000000-0写作10000000符号位不同8位反码里-0是把0按位取反得到的11111111补码的-0是反码加111111111加1后8位溢出丢掉进位结果又变回00000000。所以原码和反码都有两个0只有补码的0是唯一编码。十进制原码反码补码0000000000000000000000000-0100000001111111100000000-1100000011111111011111111-127111111111000000010000001-128无法表示无法表示100000000的唯一化带来一个直接收益补码能多表示一个负数。原码和反码的8位范围是-127到127补码的范围变成-128到127。表格里要特别注意最后一行-128在补码中用10000000表示它既不是-0也不是符号位的简单取反而是整个编码体系里专门留给最小负数的一个特殊码值。3.2 8位补码范围的计算逻辑补码的本质是模256运算。x-y变成x加上y的补码符号位自然参与进位减法电路就省掉了。正数范围好理解符号位为0数值位全1就是最大值01111111即127。负数范围里最容易被误解的是10000000它代表-128不是-0。从编码上看-1的补码是11111111-128的补码是10000000两者之间没有空档边界非常紧凑。def to_8bit_twos(value: int) - str: 把[-128, 127]范围内的整数转成8位补码形式 if value 0: value 1 8 # 负数加256等价于模256运算 return f{value:08b} for v in [-128, -127, -1, 0, 1, 127]: print(f{v:4} - {to_8bit_twos(v)})关键代码是value 1 8。8位补码可以看成模256的编码负数加256之后再格式化成8位二进制得到的就是对应补码。-1加256得255格式化输出11111111-128加256得128格式化输出10000000。整个循环跑完0只有一个编码00000000边界处-128和127互不重叠说明编码空间利用完整。这套思路换成16位、32位位宽同样成立只是模数从256变成2^16、2^32。3.3 单选第一题的干扰项设计单选题第1题四个选项几乎把常见错误全列出来了。A的-128~128错在把上限写成128符号位占一位数值位只有7位最大值只能是2^7-1127B的-127~127是原码和反码的范围补码因为0唯一多得到一个-128C的-127~128上下界同时出错。只有D的-128~127正确。注意题目如果专门问“原码或反码的表示范围”答案是-127~127。只有补码的范围才包含-128。从数据表示的角度看补码是数据在机器里的一种编码结构。搞懂它会发现平时写位运算处理、读写嵌入式寄存器或者排查整数溢出用的都是同一套逻辑。408统考经常换个方式考这个点比如给一个补码10000000问它是什么数或者给两个补码加法问怎么判断溢出本质都是这里的内容。4. CPU组成、堆栈指针与DMA三阶段从填空看数据通路的控制时序4.1 冯·诺依曼五部件与CPU的组成填空第1题是典型的默写题运算器、存储器、控制器、输入设备、输出设备。这一题不能丢分但也不要只当默写看五个部件的分工其实构成了整门课的主干。运算器做算术逻辑运算存储器放指令和数据控制器负责取指译码和发出控制信号输入输出设备完成外部信息交换。单选第2题接着问CPU由哪两部分组成答案是运算器和控制器。这里有个容易踩坑的地方现代CPU里有寄存器堆、Cache、乱序执行引擎但在计算机组成原理的基础课程里CPU的核心定义就是运算器加控制器寄存器组通常被看成这两个部件的内部组成部分实际归属以授课教材为准。控制器的工作过程可以概括成取指令、译码、执行指令、计算下一条指令地址这样不断循环的步骤运算器在这些步骤里执行具体的加法、逻辑、移位操作。CPU对外通过地址总线、数据总线和控制总线与存储器及I/O设备通信地址线数量决定寻址空间数据线数量决定一次能读写多少位这正好呼应了第2章算地址线和数据线宽度的题目。4.2 堆栈指针SP栈顶的定义由压栈方向决定填空第3题问存储器堆栈里需要什么专用寄存器来指示栈顶答案是堆栈指针。堆栈在数据结构里是后进先出硬件实现时压栈和弹栈的具体动作由堆栈生长方向决定。向下生长的堆栈PUSH先SP减1再写入数据向上生长的堆栈PUSH先写入数据再SP加1。如果考试里给的是“栈顶地址减小是入栈”还是“栈顶地址增大是入栈”先判断方向再写答案。堆栈方向压栈动作弹栈动作向下生长SP←SP-1再写内存先读内存SP←SP1向上生长先写内存SP←SP1SP←SP-1再读内存堆栈本身是一种数据结构但它被硬件直接支持后就变成函数调用、中断现场保护和子程序返回地址保存的底层机制。填空题的空只要填“堆栈指针”四个字但理解了上面的时序就算改成简答题问SP如何变化也能答上来。实际读汇编代码时PUSH和POP指令的SP变化方向就是这套逻辑的直接体现。4.3 DMA三阶段为什么能绕过CPU搬运数据填空第4题的原卷表述是“传送预前处理、数据块传送、传送后处理”三个阶段。DMA和程序中断方式最大的区别在于CPU参与程度。程序中断方式每传送一个数据CPU都要保存现场、执行中断服务程序、恢复现场效率很低DMA由DMA控制器接管总线在CPU不访存的周期里完成整块数据搬运CPU只在预处理和后处理阶段参与。第一阶段CPU对DMA控制器初始化填入源地址、目的地址、传送字节数第二阶段DMA控制器独占总线按字或按字节连续搬运第三阶段传送结束DMA控制器向CPU发中断CPU做结果处理。阶段主要动作CPU状态总线控制权预处理CPU初始化DMAC寄存器参与CPU掌握数据块传送DMAC逐字搬运数据块不参与DMAC掌握后处理DMAC发中断CPU收尾参与CPU掌握用状态机来理解这三个阶段最直观。下面是一段简化的DMA控制器模拟代码。class DMA: def __init__(self, src, dst, length): self.src src # 源地址 self.dst dst # 目的地址 self.remain length # 剩余传送单元 self.state PRETREAT def step(self): if self.state PRETREAT: self.remain min(self.remain, 512) # 设置本次块长度 self.state BLOCK print(预处理: 初始化源/目的地址与长度) elif self.state BLOCK: print(f块传送: 搬移一个单元 {self.src:#x} - {self.dst:#x}) self.src 1 self.dst 1 self.remain - 1 if self.remain 0: self.state POST elif self.state POST: print(后处理: 发中断通知CPU回收总线) self.state DONE dma DMA(0x1000, 0x2000, 4) while dma.state ! DONE: dma.step()这三个分支对应DMA的三个执行阶段。PRETREAT阶段设置块长和地址BLOCK阶段每次步进搬移一个单元并递减剩余计数POST阶段发中断并回到终止状态。跑一遍输出就能看出DMA控制器自己维护地址和长度计数器CPU只需要在开始时写控制寄存器、结束时响应一次中断中间全程不参与。这也是简答题常问的“DMA为什么比程序中断方式效率高”的答案来源。5. 机组备考校验三条规则重做这套A卷的填空与单选5.1 答题前先做的三步校验复习这套卷子时把计算类题目抽象成三条规则做题前先在草稿纸上过一遍再落答案。芯片数等于目标容量除以单片容量单位必须对齐成“总位数”位扩展管数据线字扩展管地址线。地址线根数等于log2(可寻址单元数)按字编址先算字数按字节编址直接用字节数。补码范围最小值是-2^(n-1)最大值是2^(n-1)-1操作码指令数等于2^操作码位数。这三条可以写成几行自检代码每次做完填空用它验证def storage_check(total_k, total_bits, chip_k, chip_bits): total_bits_count total_k * 1024 * total_bits chip_bits_count chip_k * 1024 * chip_bits return total_bits_count // chip_bits_count print(storage_check(4, 8, 4, 1)) # 目标4K×8芯片4K×1 - 8 print(storage_check(4, 8, 1, 8)) # 目标4K×8芯片1K×8 - 4 print(storage_check(4, 8, 1, 1)) # 目标4K×8芯片1K×1 - 32计算逻辑是把“K×位”统一换成总位数再相除。第一个输出8第二个输出4对应填空第5题第三个输出32对应1K×1位芯片组成4K×8位的变式。指令数那题也一样8位操作码对应2^8256种指令用的都是对数思维。5.2 概念题的易混点对照剩下的概念题失分点集中在几组易混内容上。DMA三阶段记成“预处理、块传送、后处理”时注意原卷把预处理写成“传送预前处理”答题时尽量和教材术语统一。堆栈指针指向栈顶还是栈底看教材规定的栈生长方向。CPU组成是运算器和控制器答题时不要写寄存器。考前把这几组对照列出来比反复翻书效率高。易混点区分依据按字编址与按字节编址先算单元数再取对数原码/反码/补码0是否唯一、范围是否包含-128程序中断与DMACPU是否参与每个数据单元传送堆栈指针指向向上/向下生长的压栈时序这套2007年的A卷填空和选择覆盖的考点密度很高后面大题主要围绕运算器数据通路和指令执行流程展开但前面这些基础计算是综合题的前提。把三条校验规则变成肌肉记忆再回来重做第1到第8道填空每道题的出错点就都看得见了。本文还有配套的精品资源点击获取