assembly - 在 MARIE 汇编中,为什么 MAR 有时包含 PC-1(如 PC 减 1 的内容),但不是一直?
问题描述
我在这里有点新,所以我想先弄清楚基础知识,所以我正在研究 MARIE 组装,我注意到 MAR 有时只是 PC 的值,但为负 1,这背后有什么原因吗?这只是巧合吗?
现在查看它,我还注意到 IR 和 MBR 有时具有相同的值;为什么呢?
解决方案
这不是巧合。您所看到的是(a)不同指令类型和(b)模拟器暂停显示这些寄存器的值的组合,可能在指令之间。
MAR(内存地址寄存器)是该处理器与内存就读取/加载或写入/存储位置进行通信的唯一方式。
MBR — 内存缓冲寄存器 — 用于保存在内存传输操作期间正在读取或写入的数据。
MAR 既用于指令提取,也用于任何数据加载或数据存储操作。
取指令序列涉及
- 三月 := 电脑
- MBR := 内存[MAR]
- 红外:= MBR
处理器通过将 PC 值复制到 MAR 并发出读取信号来获取指令——存储器通过读取该内存位置并将其内容放入 MBR 来响应。然后,处理器将 MBR 中的指令复制到 IR 中以进行指令解码。
在指令执行过程中,PC 前进,通常指向下一条指令。
如果一条指令不执行数据加载或数据存储操作(例如 SkipCond、Input、Output 的情况),那么在指令完成后,您将看到 MAR 保留了该指令的 PC,而 PC已经提前了,通常是 1。此外,IR 和 MBR 将保持相同的值 - 这是机器代码指令。MAR 和 MBR 反映指令取指。
但是,如果指令确实执行了数据加载或数据存储操作,那么在指令完成后,您将看到 MAR 保存数据存储器的地址,而 MBR 保存传输的数据值。这些指令仍然执行指令获取——如果您在执行这些指令期间在正确的时间点观察寄存器,您将看到 IR=MBR 和 MAR=PC,但作为完成这些指令的一部分,MAR 和 MBR被重用于数据存储器访问。
所有指令都是从内存中获取的,但有些指令还会进行数据加载/存储。
底线是 MAR 和 MBR 保持在最近的内存操作(无论是指令提取还是数据加载/存储)中使用的值,即使在该内存操作完成之后(直到它们被重新用于下一个指令提取)。
在其他一些处理器上,有一个单独的指令存储器和单独的数据存储器,因此实际上有两个 MAR 和两个 MBR,而 PC是指令存储器的 MAR。这些可能是缓存,然后统一到共享主内存。
(单独的存储器称为哈佛架构;像MARIE这样没有指令预取缓冲区或指令缓存的简单架构可以直接将PC用作MAR。如果PC在获取后更新到下一条指令,则它可以在执行时获取下一条指令当前使用 PC 作为 MAR。)
推荐阅读
- excel - 使用 VBA 摆脱带有文本的单元格的科学记数法
- visual-studio-code - 无法在 Platform IO VS-Code 插件中创建新项目
- java - 我应该为我的 Android 应用程序使用哪种保存用户数据的方式?
- .net - Chrome 在通过 http 从 Windows 服务下载 exe 文件时引发混合内容错误
- jquery - 日期选择器默认日期
- laravel - Sendgrid 不在服务器上发送邮件
- python - 如何在 matplotlib 中将 3D 轨迹动画更改为分散版本?
- pandas - 在多列上对熊猫数据框行进行排名
- amazon-web-services - 在 DynamoDB 中设计基于 Dynamo db 数据模型角色的访问控制
- c++ - 即使分配了内存,Memcpy 分段错误