我目前正在开发一个GameBoy模拟器。在编写代码时,我开始怀疑添加到寄存器是如何影响它的。
cpu上有8个8位寄存器和4个16位寄存器。8位寄存器可以组合成16位寄存器。下面是我在代码中表示它们的方法。
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;
};问题:
发布于 2019-12-17 13:21:11
首先,我不认为您组织寄存器的方式是好的,因为您有重复的信息(存储a、f和af)。一种选择是使用联合;联合确保两个变量共享相同的内存位置。所以,你可以:
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;
ADD SP, 0x1 #Now SP does contain 0x0100 because you used 16 bit arithmetic.然而:
假设HL = 0x00FF;
ADD L, 1 # L Overflows to 0x00, however HL = 0x0000 because you used 8 bit arithmetichttps://stackoverflow.com/questions/59130304
复制相似问题