Couldn't exactly think up the right title for this, but this problem always seems to occur when I'm setting up const data for my program to use. My program here is basically a lightweight assembler as a small part of my custom code compiler.
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))
),
};
Obviouslly my aim is to have an array of sInstructionDefinition and fill their object array members, etc.
Unfortunately, the 2nd sOpcodeDefinition of each sInstructionDefinition is absent in the compiled code. I assume the same may start to happen with the sOperand members too. Any ideas why and what the proper way to initialize this large nested structure?