微机原理实验报告:8086 汇编语言程序设计与运算 最近这周在实验室搞微机原理倒是忙得紧,主要是盯着 8086 的汇编代码跑。

那会儿总认定寄存器那一套名词堆砌得让人头大,结局一上手才发现每个寄存器都有它特定的流程,像打仗一样得按部就班。

这次实验核心就是写个 8086 的循环加法程序,把一堆枯燥的指令填进去,然后看它能干嘛。 一启动写代码时脑子有点懵,CPU 是顺序执行的,指令流水线别看快,但写汇编时得记住顺序。寄存器名记混了挺费工夫,特别是 AX、BX、CX、DX 这四位寄存器,每次用都得对号入座。

比如我们要算个累加和,AX 是累加器,BX 是源数据寄存器,CX 是计数器。刚启动写循环结构时,习惯用 `MOV AX, BX` 和 `ADD AX, CX` 这种硬编码的方式,结局跑出来的结局和预期差了一点点。

后来看到别人代码里用 `MOV AX, BX` 把源数据放进 AX,然后再用 `ADD AX, CX` 加计数器,再立马把 AX 数据存回 BX,把 CX 减一,整个循环就自然跑起来了。

这就好比开车,先把油箱装满,加个油,然后踩油门,最终把油枪收起来。

这种思维转换挺关键,赶明儿写程序得多琢磨这种数据流转的路径。 实验过程中最费脑子的局部是中断服务程序的逻辑判断。有一次实验要求写个键盘中断处理程序,要是按下了某个键,就得把数值填入某个寄存器。刚启动写时,直接写死条件判断代码,结局编译出来有个小毛病,出于中断向量表的位置不对。

后来想起书上提到的“从键盘中断到 CPU 中断程序,CPU 中断服务程序,还有用户程序”的层级关系,才恍然大悟。中断服务程序实际上是个相对独立的小环境,它得保留原来的寄存器状态,不然下次复位回来数据就乱了。

比如保存 AX、BX、CX、DX 这四个寄存器,把它们分别拷到同一个内存位置,这样坏了能够瞬间恢复。恢复的时候再把寄存器内容拷回去,这个顺序绝对不能反。 在调试阶段,ECN 指令里的内容忒关键了。

那会儿总认定 ECN 只是好办的计数器,直到这次实验才真正意识到 ECN 寄存器里的操作数才隐含在机器语言指令里。

比如 `MOV [ECN], AX` 这条指令,ECN 寄存器里的操作数才是存放 AX 数据的地方。

要是这里填错了,程序逻辑就崩了。

后来把 ECN 改成 7FF 这个特殊值,系留寄存器里的内容直接显示出来,正好是我们要找的 255 值,这下确认了 ECN 确实是个系留寄存器,后续操作能够直接读回,不用重新取指。 另外,实验里还涉及了一些比较特殊的情况。

比如当寄存器内容不一致时,CPU 是如何判断源操作数是否有效的。通过观察寄存器中置零后的内容,发现只要源操作数非零,CPU 就不管它,直接执行;要是是零,CPU 可能会根据指令类型做不同的处理。

这让我对指令集架构的底层逻辑有了更深的理解,原来不是所有指令都按顺序执行,而是 CPU 内部有个状态机在自动判断。 总的来说,这次实验最大的收获就是明白了寄存器管理的关键性,还有汇编语言中数据流向的逻辑。

那会儿认定写代码就是按语法写,目前才知道得理解数据在 CPU 内部如何跑。赶明儿做实验多把自己当成一个调试员,多想想数据该往哪个寄存器跑,该执行哪条指令,而不是死记硬背指令表。 实验终止的时候看着屏幕上跳动的数据,心里挺踏实。别看有些小报错,但思路理顺了,程序能跑通就快乐。微机原理这东西,光听老师讲好办晕,亲手敲代码、看寄存器变化,那种感觉比看书强多了。下次还想再试试别的硬件结构,肯定得先把这些基础搞稳了。