当前位置: 首页 > 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.gsyq.cn/news/1463700.html

相关文章:

  • [智能体-264]:Embedding 通俗发展史(四段式,大白话,从远古→现在 RAG)
  • 深圳办公 ai 培训机构哪家值得信赖:五大机构最新专业测评 - 17329971652
  • 别再死记ResNet了!用PyTorch从零实现DenseNet-121,搞懂‘密集连接’到底好在哪
  • 被37所重点中小学内部传阅的《AI教学整合避坑手册》(含18个真实失败案例+可审计整改清单)
  • 【结果+代码】2026中青杯B题第一问建立无参考图像质量评价(NR-IQA)的数学模型
  • B站成分检测器:智能用户分析工具,让评论区身份一目了然
  • WCH-Link Utility隐藏功能挖掘:不止烧录,还能一键读保护、读Flash和批量操作
  • low-memory-server-swap-20260601
  • 从EFPLMN到EFFPLMN:实战解析USIM卡如何影响你的手机搜网与信号
  • 保姆级教程:用Altium Designer导出Gerber文件,一次搞定PCB打样(附常见错误排查)
  • STM32CubeMX实战:用按键和RTC闹钟唤醒你的低功耗设备(附完整代码)
  • 【字节跳动】巨量引擎第二层内核 纯工业级机密参数201-500
  • 直接用 CTP 做期货自动交易太乱:天勤式状态管理思路
  • AI工具如何72小时内重构对账流程?揭秘头部金融机构已验证的4层智能校验架构
  • 避坑指南:STM32低功耗停止模式唤醒后时钟配置的那些事儿
  • 泰坦尼克号生存预测三模型实战包:逻辑回归+ID3决策树+随机森林Python完整实现
  • Transformer QKV 计算瓶颈?一次关于长上下文显存爆炸的硬核排查与优化
  • 别再死记硬背!一张图+一个故事帮你理清正交、酉、正规矩阵的关系与区别
  • AI简历不是“加个ChatGPT”,而是重构求职链路——12个企业级落地案例拆解
  • CentOS 7生产环境PHP 8.1安装避坑实录:Remi源、扩展冲突与SELinux策略
  • ov5647摄像头模块、MIPI的MCLK主时钟
  • 2026运城市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 2026年硅胶密封圈供应商排名,哪家口碑好 - mypinpai
  • YOLOv11城市道路路面病害目标检测数据集-2722张-Pothole-detection-1
  • IPO材料智能生成系统崩溃事件复盘(附证监会反馈原文+AI修正日志),仅限本周开放下载
  • YOLO26 数据清洗自动化:基于聚类的噪声样本过滤——从特征提取到综合流水线的完整工程实践
  • AI赋能转正决策:从数据采集、能力建模到自动评估(2024最新Gartner验证框架)
  • 图片:数字化时代的视觉语言
  • 如何遗忘比如何记忆更重要——AI Agent框架的一些总结
  • 高级实时动漫视频超分辨率技术深度解析:Anime4K开源项目架构设计与性能优化实战指南