首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加减如何影响GameBoy中的寄存器状态?

加减如何影响GameBoy中的寄存器状态?
EN

Stack Overflow用户
提问于 2019-12-01 21:48:58
回答 1查看 255关注 0票数 2

我目前正在开发一个GameBoy模拟器。在编写代码时,我开始怀疑添加到寄存器是如何影响它的。

cpu上有8个8位寄存器和4个16位寄存器。8位寄存器可以组合成16位寄存器。下面是我在代码中表示它们的方法。

代码语言:javascript
复制
struct Registers{
    //8 bit registers
    uint8_t a;
    uint8_t b;
    uint8_t c;
    uint8_t d;
    uint8_t e;
    uint8_t f;
    uint8_t h;
    uint8_t l;
    //16 bit registers
    uint16_t af;
    uint16_t bc;
    uint16_t de;
    uint16_t hl;
};

问题:

  1. 如果较低的寄存器的值为0b11111111,并将1添加到其中。该位会继续到较高的寄存器,还是绕到较低的8位寄存器的开头。
  2. 如果一个低寄存器的值为0b00000000,而I从它中减去1,那么它是保持为零,还是将该位换到寄存器的顶部。
  3. 如果一个较高的寄存器的值为0b00000000,而I从它中减去1,它是否会影响较低的寄存器。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 13:21:11

首先,我不认为您组织寄存器的方式是好的,因为您有重复的信息(存储a、f和af)。一种选择是使用联合;联合确保两个变量共享相同的内存位置。所以,你可以:

代码语言:javascript
复制
struct Registers{
    union{
        struct{
            uint_8t f;
            uint_8t a;
        };
        uint_16t af;
    };
    // And so on for the rest...
};

通过这种方式,您可以单独操作每个8位寄存器(registers.a),或者同时操作(registers.af)。请注意,如果您是在大型endian机器中开发的,则应该交换f和a,以确保正确的endianness。

如果您的编译器不支持匿名结构和联合,我认为更好的选择是创建一个函数来操作这两个8位寄存器并将它们转换成一个16位寄存器。这样,您不必每次修改a和af时都同时访问它们。

现在谈谈你的实际问题。我的信息来自这张桌子 (其中包含一些错误,所以最好查看其他来源以确认错误)和本手册

问题1:不,它不携带到更高的寄存器,它会溢出。

问题2:同样的事情,它封装到0xFF。

问题3:假设您使用的是8位ALU操作,那么不,它也不会影响它。

注意,如果您使用16位ALU操作,那么它们将影响另一个寄存器。例如:

假设SP = 0x00FF;

代码语言:javascript
复制
ADD SP, 0x1 #Now SP does contain 0x0100 because you used 16 bit arithmetic.

然而:

假设HL = 0x00FF;

代码语言:javascript
复制
ADD L, 1 # L Overflows to 0x00, however HL = 0x0000 because you used 8 bit arithmetic
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59130304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档