我觉得,“微机原理”当然还应该学,它仍然是电专业本科最核心的几门计算机基础课之一,8086也有必要了解,但现在很多学校教的那一套“8086考古版微机原理”,确实应该退出历史舞台了。

自动化、电气、电子信息的学生今天依然非常需要理解这样一条链:

C代码 → 编译器 → 指令 → CPU → 寄存器 → 总线 → 内存 → 外设

否则学生用STM32时会出现一种很典型的状态:

GPIO_SetBits(GPIOA, GPIO_Pin_5);

代码会写,但不知道这一句到底发生了什么,怎么发生的。

实际上它背后就是:

CPU执行store指令 → 产生地址 → 总线译码 → 访问外设寄存器 → GPIO硬件改变

这恰恰就是微机原理应该讲的东西。

真正应该淘汰的,是大量“8086细枝末节”。

很多传统微机原理课程还在围绕:

  • 8086内部结构
  • AX、BX、CX、DX
  • CS、DS、SS、ES
  • 段地址 × 16 + 偏移地址
  • 8255
  • 8253
  • 8259
  • 汇编程序设计
  • 手算物理地址

这些东西有没有历史价值?当然有。

但如果一个电专业本科生一学期只有四五十个课时,却花大量时间背:

8255控制字的D7~D0分别是什么意思?

我认为性价比已经很低。

因为学生毕业以后更可能面对的是:

Cortex-M、STM32、RISC-V、ARM、DMA、NVIC、SPI、I²C、UART、ADC、定时器、Cache、MMIO……

因此,重要的是与现代衔接,而不是花大量时间在这些已经过时的器件的定义上。

于是,有一批东西反而比以前更应该讲,比如:

*(volatileuint32_t *)0x4001080C

这么短短一句,其实可以把整个“现代微机的原理”串起来。

为什么0x4001080C能控制硬件?

因为现代MCU大量使用:

Memory-Mapped I/O

CPU并不知道:

“我要操作GPIO了。”

CPU只知道:

我要向地址 0x4001080C 写一个32位数据。

然后地址进入总线,总线发现

0x40000000 ~ ···

这个范围属于外设区域,于是把这个访问送给某个外设,最后落到GPIO寄存器。

这一套:

地址空间 地址译码 总线 寄存器 内存映射I/O CPU load/store

就是现代版微机原理的核心,而且这套思想可以从STM32一路通到PC。

所以我觉得,这门课应该改造成“计算机硬件原理 + 嵌入式系统基础”,学生先理解现代计算机如何执行程序,再根据专业方向深入学习单片机、嵌入式系统或处理器架构。我们有个「重新理解编程」专栏,就是为此原理和基础而来。