我正在做一个个人项目,一个模拟器。假设有两个寄存器H和L,每个寄存器长1个字节。因此我们可以用一个字节写入H或L。但是,某些指令要求您将两个字节写入H和L或HL。第一个字节到H,第二个字节到L。根据我的实现方式,有些事情很难实现。
所以我的想法是让HL是一个两个字节的单词。但是,仍然存在H和L变量,它们分别与HL的第一个字节和HL的第二个字节共享相同的地址。
我可以做指针,但是我真的不想将我所有的寄存器都声明为指针。
我当时想的是工会,像这样:
union {
BYTE H;
WORD HL;
}
但是后来我不知道如何将L作为第二个字节放入其中。
有什么想法吗?
答案 0 :(得分:5)
您可以这样:
union
{
struct
{
BYTE L, H;
} b;
WORD HL;
} u;
一些编译器将允许您执行此操作,尽管它是非标准的:
union
{
struct
{
BYTE L, H;
};
WORD HL;
} u;
答案 1 :(得分:1)
这样的工会怎么样?
union {
BYTE asBytes[2];
WORD asWord;
}
然后,您可以通过asBytes[0]
访问H,通过asBytes[1]
访问L或以asWord
访问HL。
答案 2 :(得分:0)
有没有办法让两个大小不同的变量共享一个内存 地址而不声明它们为指针?
我相信您可以在没有指针,没有共享内存且不需要类型绑定的情况下实现所需的“行为”。
请考虑以下课程。注意,在函数中定义了用户定义类型的行为。
class ML // msByte and lsByte
{
private:
BYTE m_bytes[2]; // this data will be 2 * sizeof(BYTE)
public:
ML() = default; // does nothing. ?or do you need to initialize these?
~ML() = default; // does nothing unless you want it to
// extract one or the other byte - consider
BYTE lsByte() { return m_bytes[0]; } // index 0/1
BYTE msByte() { return m_bytes[1]; } // fix based on endianess
// extract the two bytes by summing,
// I prefer bit shifting and or'ing
WORD ML() { return ( add m_bytes[0] and (256*m_bytes[1]) into WORD }
// or maybe ( m_bytes[0] | (m_bytes[1] << 8)); )// fix based on endianess
void ML( BYTE ls, BYTE ms)
{ // fix index based on endianess
m_bytes[0] = ls;
m_bytes[1] = ms;
}
void ML( WORD w)
{ // fix shifting based on endianess
ML ( (w & 0xff), ((w >> 8) & 0xff) ) // invoke ML (BYTE, BYTE)
// lsbyte msbyte
}
};