これに適切なタイトルを正確に考えることができませんでしたが、プログラムで使用する const データを設定しているときに、この問題が常に発生するようです。ここでの私のプログラムは基本的に、カスタム コード コンパイラの小さな部分としての軽量アセンブラです。
CAssembler.h
struct sOperand
{
bool used;
eOperandType type;
int size;
};
struct sOpcodeDefinition
{
bool used;
BYTE opcode;
BYTE extended_opcode;
sOperand operands[5];
};
struct sInstructionDefinition
{
eMnemonicInstruction instruction;
sOpcodeDefinition opcodes[16];
};
CAssembler.cpp
#define MNEMONIC(a,b) {a,b}
#define OPCODE(a,b,c) {true,OPCODE_##a,b,c}
#define OPERAND(a,b) {true,(eOperandType)OPERAND_##a,b}
sInstructionDefinition OpcodeDefinitionTable[NUM_X86_OPCODES] = {
MNEMONIC(INC,
OPCODE(INC_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(INC_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(INC_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(INC_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(INC_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(INC_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(INC_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(INC_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(DEC,
OPCODE(DEC_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(DEC_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(DEC_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(DEC_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(DEC_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(DEC_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(DEC_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(DEC_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(PUSH,
OPCODE(PUSH_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(PUSH_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(PUSH_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(PUSH_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(PUSH_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(PUSH_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(PUSH_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(PUSH_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(POP,
OPCODE(POP_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(POP_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(POP_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(POP_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(POP_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(POP_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(POP_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(POP_DI, 0, OPERAND(REGISTER_DI, 4))
),
};
明らかに私の目的は、sInstructionDefinition の配列を持ち、それらのオブジェクト配列メンバーなどを埋めることです。
残念ながら、コンパイルされたコードには、各 sInstructionDefinition の 2 番目の sOpcodeDefinition がありません。sOperand メンバーでも同じことが起こり始める可能性があると思います。この大きなネストされた構造を初期化する適切な方法と理由は何ですか?