unionの使い方

解決


anubi  2006-07-28 07:27:19  No: 62581

またまた、お世話になります。
先日、アセンブラのレジスタ動作を模倣する件で
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 09:30:11  No: 62582

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


anubi  2006-07-28 16:01:11  No: 62583

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


旧通りすがり  2006-07-28 19:31:01  No: 62584

>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 23:06:56  No: 62585

もしくはこう
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-29 00:24:56  No: 62586

旧通りすがりさま

出来ました。

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加