【问题标题】:Modeling microcomputer registers in memory?在内存中建模微型计算机寄存器?
【发布时间】:2014-03-05 16:52:02
【问题描述】:

作为一个小项目,我一直在创建一个较旧的微型计算机 CPU 仿真器,主要基于 8080 的架构。它的 8 位通用寄存器 (according to wikipedia) 可以用作“三个 16 位寄存器对”以及正常的 8 位模式。这是我的问题。

我第一次尝试建模是单独命名的字节和短裤,在我重新阅读规范页面并发现 16 位寄存器实际上不是他们自己的东西之前,它工作得很好。哎呀。

我现在尝试的是一个字节数组,每个 8 位寄存器有一个位置,两个位置为堆栈/指令指针保留。这对 8 位寄存器非常有效,而且管理起来也少了很多麻烦,但我实际上并不知道如何将两个字节转换为内存短。这甚至可能吗?如果没有,您对其他方法有什么建议吗?

【问题讨论】:

  • 考虑使用联合。或者,如果您想直接使用内存表示,则可以使用指针。
  • 呃,我将如何创建一个指向不同类型的两个变量的指针?我还在学习 C++ 魔法。
  • 基本上你会有两个不同类型的指针具有相同的内存地址。我不确定 C++ 是否有很多值得推荐的地方。然而,在 C 中这将是微不足道的,这在很大程度上是因为在 C 中裸露的编程模型与您尝试模拟的那种硬件架构之间的相似性。诚然,指针方法在某种程度上要求您的模拟架构和主机架构具有相同的字节序……这在当前时刻很有可能。

标签: c++ emulation intel-8080


【解决方案1】:

您可以通过以下操作创建两个uint8_ts 中的struct,该uint16_t 也可以作为uint16_t 访问:

union Register
{
    uint16_t word;
    struct
    {
        uint8_t lo, hi;
    } byte;
};

这样,如果您在Register r 范围内有一个值,那么r.word 将作为单个16 位值访问内容,r.byte.lor.byte.hi 将访问第一个和第二个 8-位字节。 (第一个是lo,因为Intel 8080 是little-endian architecture。)

【讨论】:

  • 致反对者:我的回答是基于对 OP 问题的误解吗?
【解决方案2】:

通过将 16 位寄存器中第一个字节的地址转换为 void 指针,然后再转换为 short 来解决。不是很安全,但是,嘿,它有效。显然我只是在谷歌上搜索错误的东西。

【讨论】:

  • 一个传统的类型安全概念在这里开始对你不利,就像在构建一个模拟器时,你需要重现这样一个事实,即机器将根据不同的方式以各种方式解释相同的位在正在执行的指令上。您已经知道宽度差异。但也要注意签名/未签名的。并不是所有的 ALU 操作都会有直接的 C/C++ 对应物——例如,你有旋转和移位。然后是进位位 - 可能包含也可能不包含在这些位中。
  • 这不是类型安全的,在 C++ 中是合法的,抱歉。如果你试图在大端机器上运行程序,它会崩溃。
  • 感谢您的回复。我不得不说我对工会没有任何经验,但是一旦原型启动并运行并稍微完善它,我可能会重新审视这一点。我已经确保一切都是无符号的,具体来说,使用无符号字符和 uint16_t 来处理 8/16 位的东西。而且我知道这是一种糟糕的编程实践,但“合法”还是“有效”?
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2011-03-25
  • 2015-04-01
  • 2013-06-17
  • 2016-06-15
  • 2017-08-20
相关资源
最近更新 更多