Есть ли способ, чтобы две переменные разных размеров разделяли адрес памяти, не объявляя их как указатели? - PullRequest
0 голосов
/ 02 декабря 2018

Я работаю над личным проектом, эмулятором.Допустим, есть два регистра H и L, каждый длиной в один байт.Таким образом, мы можем написать в H или L одним байтом.Однако некоторые инструкции требуют, чтобы вы записали два байта в H и L или HL.Первый байт идет к H, второй идет к L. Есть некоторые вещи, которые трудно реализовать на основе того, как реализован мой.

Так что моя идея состояла в том, чтобы HL было одним двухбайтовым словом.Однако все еще будут существовать переменные H и L, которые имеют тот же адрес, что и первый байт HL и второй байт HL соответственно.

Я мог бы делать указатели, , но Я действительно не хочу объявлять все свои регистры как указатели.

Одна вещь, о которой я думал, это объединение, например:

union {
    BYTE H;
    WORD HL;
}

Но тогда я не знаю, как поместить туда L в качестве второго байта.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Вы можете сделать это так:

union
{
    struct
    {
        BYTE L, H;
    } b;

    WORD HL;
} u;

Некоторые компиляторы позволят вам сделать это, хотя это нестандартно:

union
{
    struct
    {
        BYTE L, H;
    };

    WORD HL;
} u;
0 голосов
/ 02 декабря 2018

Есть ли способ, чтобы две переменные разных размеров совместно использовали адрес памяти, не объявляя их как указатели?

Я считаю, что вы можете достичь желаемого «поведения» без указателейбез разделяемой памяти и без подсчета символов.

Рассмотрим следующий класс.Обратите внимание, что поведение пользовательских типов определяется в функциях.

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     
    } 
};
0 голосов
/ 02 декабря 2018

Как насчет союза, подобного этому?

union {
 BYTE asBytes[2];
 WORD asWord; 
}

Тогда вы можете получить доступ к H через asBytes[0], L через asBytes[1] или HL как asWord.

...