またまた、お世話になります。
先日、アセンブラのレジスタ動作を模倣する件で
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単位になる必要は無いと思っています。
よろしく、お願いいたします。
64bitレジスタは64bit、つまり8byteである必要がありますよね。
まず、構造体のサイズを確かめてみるといいと思いますよ。
すいません、32ビットレジスタでした。
>DWORD E
> |- WORD XH
> |- WORD X
> |- BYTE H
> |- BYTE L
ならばこう
union REG{
DWORD E;
struct {
WORD X,XH;
};
struct {
BYTE L,H;
};
};
もしくはこう
union REG{
DWORD e; // 32bit
struct {
union {
WORD x; // eの下位16bit
struct {
BYTE l,h; // xの下位8bit,上位8bit
};
};
WORD xh; // eの上位16bit
};
};
旧通りすがりさま
出来ました。
ただ、どうして、こう言う構文になるのか?
改めて、勉強しなおします。
どうも、ありがとうございました。
ツイート | ![]() |