当前位置: 首页 > news >正文

CSAPP=系统硬件组成 + CPU 如何执行程序

<?php /** * 概念7~14:系统硬件组成 + CPU 如何执行程序 * ---------------------------------------------------------------------- * 大白话总览(先认识几个零件,下面写代码模拟它们): * *7. 系统硬件组成:一台电脑=CPU + 主存 + I/O设备,靠「总线」连起来。 *8. 总线(Bus):电脑里的「公路」,专门搬运数据,一次搬一个「字」(比如8字节)。 *9. I/O设备:电脑和外界的接口——键盘、鼠标、显示器、磁盘。 *10. 主存(Main Memory):临时仓库(内存条/RAM)。程序运行时,指令和数据都放这。 * 断电就没了。可以按「地址」随机读写。 *11. 处理器(CPU):电脑的大脑,真正干活的。核心动作就是不停地 * 「取指令 → 译码 → 执行」循环。 *12. 寄存器文件(Register File):CPU 内部一小撮超快的格子,临时放正在用的数据。 *13. 程序计数器(PC):一个特殊寄存器,记着「下一条要执行的指令在哪」。 *14. ALU(算术逻辑单元):CPU 里做加减乘除、与或非这些实际运算的部件。 * * 下面我们写一个「迷你 CPU」,跑一段小程序:计算(2+3)*4, * 让你亲眼看到 PC 怎么走、寄存器怎么变、ALU 怎么算。 */ class MiniComputer{// 概念10:主存——一个大数组,下标就是「地址」 private array$memory=[];// 概念12:寄存器文件——CPU 内部几个超快的小格子(这里给4个:R0~R3) private array$registers=['R0'=>0,'R1'=>0,'R2'=>0,'R3'=>0];// 概念13:程序计数器 PC——指向下一条指令的地址 private int$pc=0;// 概念9:I/O 设备——这里用「显示器」举例,输出就当作显示在屏幕上 private array$screen=[];/** 概念8:总线——CPU 通过总线向主存「要数据 / 写数据」。 * 这里把读写主存的动作单独封装,模拟数据在总线上来回搬。 */ privatefunctionbusRead(int$addr){echo" [总线] CPU 从主存地址$addr读取 → ".($this->memory[$addr]??0)."\n";return$this->memory[$addr]??0;}privatefunctionbusWrite(int$addr,$val): void{echo" [总线] CPU 向主存地址$addr写入 ←$val\n";$this->memory[$addr]=$val;}/** 把程序(一串指令)和数据装进主存 */ publicfunctionload(array$program): void{foreach($programas$addr=>$instruction){$this->memory[$addr]=$instruction;}}/** 概念11:CPU 主循环——经典的「取指 → 译码 → 执行」 */ publicfunctionrun(): void{echo"CPU 开机,从地址 0 开始执行……\n\n";while(isset($this->memory[$this->pc])&&is_array($this->memory[$this->pc])){// ---- 取指(Fetch):用 PC 的值,去主存把这条指令取回来 ----$instr=$this->memory[$this->pc];echo"PC=$this->pc → 取指: ".$this->fmt($instr)."\n";// ---- 译码(Decode)+ 执行(Execute)----$this->execute($instr);// PC 往前走,指向下一条(除非指令自己改了 PC)$this->pc++;echo" 寄存器现状: ".json_encode($this->registers)."\n\n";}echo"程序结束。显示器输出: ".implode(' ',$this->screen)."\n";}/** 译码+执行:看指令第一个字段(操作码)决定干啥 */ privatefunctionexecute(array$instr): void{$op=$instr[0];switch($op){case'LOAD':// LOAD R, addr —— 从主存读一个值进寄存器[,$reg,$addr]=$instr;$this->registers[$reg]=$this->busRead($addr);break;case'ADD':// 概念14:ALU 做加法。ADD Rd, Ra, Rb → Rd=Ra + Rbcase'MUL':// 概念14:ALU 做乘法[,$rd,$ra,$rb]=$instr;$a=$this->registers[$ra];$b=$this->registers[$rb];$result=($op==='ADD')?$a+$b:$a*$b;echo" [ALU]$a".($op==='ADD'?'+':'*')."$b=$result\n";$this->registers[$rd]=$result;break;case'STORE':// STORE R, addr —— 把寄存器的值写回主存[,$reg,$addr]=$instr;$this->busWrite($addr,$this->registers[$reg]);break;case'PRINT':// 概念9:把寄存器的值送到 I/O 设备(显示器)[,$reg]=$instr;$val=$this->registers[$reg];echo" [I/O] 把$reg的值 ($val) 送到显示器\n";$this->screen[]=$val;break;}}privatefunctionfmt(array$instr): string{returnimplode(' ',$instr);}}functiondemo_hardware(): void{echosection("概念7~14:硬件组成 + 迷你CPU执行 (2+3)*4");echo"目标:让迷你CPU算出 (2 + 3) * 4 并显示出来。\n";echo"主存里 地址0~4 放指令,地址10~11 放数据(2 和 3)。\n\n";$cpu=new MiniComputer();$cpu->load([// 数据区10=>2,11=>3, // 指令区(程序)—— CPU 从地址0开始一条条执行0=>['LOAD','R0',10], // R0=主存[10]=21=>['LOAD','R1',11], // R1=主存[11]=32=>['ADD','R2','R0','R1'], // R2=R0 + R1=5(ALU 加法)3=>['MUL','R2','R2','R2'], // 故意写错下面会改,占位]);// 上面 MUL 需要个4,重新规整一下程序,演示得更清楚:$cpu=new MiniComputer();$cpu->load([10=>2, // 数据11=>3,12=>4,0=>['LOAD','R0',10], // R0=21=>['LOAD','R1',11], // R1=32=>['LOAD','R3',12], // R3=43=>['ADD','R2','R0','R1'], // R2=2+3=54=>['MUL','R2','R2','R3'], // R2=5*4=205=>['STORE','R2',13], // 把结果20写回主存[13]6=>['PRINT','R2'], // 显示结果]);$cpu->run();echo"\n看明白了吗:\n";echo" PC 像个指挥棒,一条条往下指;\n";echo" 寄存器(R0~R3)是手边的小抽屉,放正在用的数;\n";echo" ALU 负责真正的加法乘法;\n";echo" 数据进出主存全走总线;最后通过 I/O 设备显示出来。\n";}
http://www.jsqmd.com/news/952083/

相关文章:

  • [智能体-264]:Embedding 通俗发展史(四段式,大白话,从远古→现在 RAG)
  • Hello Agent 学习第一天
  • 深圳办公 ai 培训机构哪家值得信赖:五大机构最新专业测评 - 17329971652
  • 别再死记ResNet了!用PyTorch从零实现DenseNet-121,搞懂‘密集连接’到底好在哪
  • 被37所重点中小学内部传阅的《AI教学整合避坑手册》(含18个真实失败案例+可审计整改清单)
  • 2026乐清疏通马桶、下水道哪家好?4家优质商家测评信息,优选道道通! - 极速版本
  • 大优势揭秘,香港业主全屋定制为什么都选深圳RERA源木匠心 - 产品测评官
  • 利用人工智能破解中世纪密码
  • ai赋能jenkins:用快马平台智能生成与优化持续集成流水线脚本
  • 如何突破百度网盘下载限制:终极解析工具完全指南
  • 【结果+代码】2026中青杯B题第一问建立无参考图像质量评价(NR-IQA)的数学模型
  • 2026 年深圳全屋定制衣柜橱柜酒柜 10 万以内怎么选不踩坑 - 产品测评官
  • 2026年广东可靠的全屋定制工厂平台深度解析:如何选择真正省心的服务商? - 2026年企业资讯
  • 模型轻量化实战:将DenseNet-169部署到树莓派4B上做图像分类(附完整onnx转换与推理代码)
  • B站成分检测器:智能用户分析工具,让评论区身份一目了然
  • 2026年更新:特种电磁阀实力厂家宁波安利特的深度解析与选型指南 - 2026年企业资讯
  • WCH-Link Utility隐藏功能挖掘:不止烧录,还能一键读保护、读Flash和批量操作
  • 加油卡小程序开发玩法深度解析:功能架构、营销体系与落地方案
  • Python中类方法、静态方法、实例方法是否能访问类属性和实例属性
  • low-memory-server-swap-20260601
  • STC89C52电子时钟DIY避坑指南:从洞洞板飞线到Keil编程的完整心路历程
  • 驾校招生、排课、收费、考试全环节落地的SpringBoot+Vue可运行系统(含建库脚本与部署文档)
  • 云原生流量均衡调优:就绪探针优化与 IPVS 容器节点负载均匀分配机制
  • 高防CDN专注网站防御加速服务
  • 调试PHY芯片时,为什么插拔网线才能恢复网速?聊聊AR8035的硬复位与软复位
  • Windows Defender Remover终极指南:彻底解决“Device Guard Blocked“错误的3种方案
  • 星辰变归来最新官方下载渠道6月最新
  • 一文讲透必懂的RAG20个核心概念:从0到 1 学会
  • 方法概述,方法的其他形式,使用常见问题
  • 从EFPLMN到EFFPLMN:实战解析USIM卡如何影响你的手机搜网与信号