unionの使い方

解決


anubi  2006-07-27 22:27:19  No: 62581  IP: 192.*.*.*

またまた、お世話になります。
先日、アセンブラのレジスタ動作を模倣する件で
32ビットレジスタは
union REG{
  WORD x;
  struct{
    BYTE l,h;;
  };
};
で、一括扱えることを教えていただきました。

コードを進めていくうちに、EAXなどの64ビットレジスタが、どしても必要になりました。
そこで、試しに
union REG{
  DWORD e;
  struct{
              WORD x;
                   sturct{  
                 BYTE l,h;
                   };
              WORD xh;
                   struct{
                        BYTE lh,hh;
                   }; 
  };
};
と書いて見たんですが、lh、hhにしか値が入りませんでした。

union REGS{
  WORD x;
  struct{
    BYTE l,h;;
  };
};
union REG{
  DWORD e;
  struct{
    REGS l,h;;
  };
};
のように宣言してやれば
  REG rega;
  rega.l.l = 0X01;
といった使い方はできるんですが、.を打つのがとても面倒です。

DWORD  E
       |- WORD XH
       |- WORD X
               |- BYTE H
               |- BYTE L
このような共用体を、簡単に作る方法はないでしょうか?
XHはBYTE単位になる必要は無いと思っています。

よろしく、お願いいたします。

編集 削除
michi  2006-07-28 00:30:11  No: 62582  IP: 192.*.*.*

64bitレジスタは64bit、つまり8byteである必要がありますよね。
まず、構造体のサイズを確かめてみるといいと思いますよ。

編集 削除
anubi  2006-07-28 07:01:11  No: 62583  IP: 192.*.*.*

すいません、32ビットレジスタでした。

編集 削除
旧通りすがり  2006-07-28 10:31:01  No: 62584  IP: 192.*.*.*

>DWORD  E
>       |- WORD XH
>       |- WORD X
>               |- BYTE H
>               |- BYTE L
ならばこう
union REG{
  DWORD E;
  struct {
    WORD X,XH;
  };
  struct {
    BYTE L,H;
  };
};

編集 削除
旧通りすがり  2006-07-28 14:06:56  No: 62585  IP: 192.*.*.*

もしくはこう
union REG{
  DWORD e; // 32bit
  struct {
    union {
      WORD x; // eの下位16bit
      struct {
        BYTE l,h; // xの下位8bit,上位8bit
      };
    };
    WORD xh; // eの上位16bit
  };
};

編集 削除
anubi  2006-07-28 15:24:56  No: 62586  IP: 192.*.*.*

旧通りすがりさま

出来ました。

ただ、どうして、こう言う構文になるのか?
改めて、勉強しなおします。

どうも、ありがとうございました。

編集 削除