1

これに適切なタイトルを正確に考えることができませんでしたが、プログラムで使用する 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 メンバーでも同じことが起こり始める可能性があると思います。この大きなネストされた構造を初期化する適切な方法と理由は何ですか?

4

2 に答える 2

1

あなたのMNEMONICマクロは 2 つの引数を取りますが、9 つを提供しています。おそらく次のように書くつもりでした:

   MNEMONIC(INC,
        {
        OPCODE(INC_AX, 0, {OPERAND(REGISTER_AX, 4)}),
        OPCODE(INC_CX, 0, {OPERAND(REGISTER_CX, 4)}),
        // etc..
        }
     ) // etc

オペコード マクロの中括弧は構造体を初期化するのに対し、上記のコードの余分な中括弧は配列の初期化に使用されることに注意してください。

編集: プリプロセッサは引き続きコンマを引数区切り文字として認識するため、上記のコードはまだ機能しないことに注意してください。

于 2013-07-28T10:00:54.420 に答える
1

可変個引数マクロを使用して適切な解決策を見つけました...ただし、OPCODE の使用法を { } で手動でラップしてもうまくいきませんでした。しかし今では、2 番目、3 番目、4 番目などの sOpcodeDefinition 定義が適切にコンパイルされるようになりました。

#define MNEMONIC(a,...) {a,{__VA_ARGS__}}
#define OPCODE(a,b,...) {true,OPCODE_##a,b,{__VA_ARGS__}}
#define OPERAND(a,b) {true,(eOperandType)OPERAND_##a,b}
#define NULL_OPERAND {false,BAD_OPERAND,0}

sInstructionDefinition OpcodeDefinitionTable[NUM_MNEMONICS] = {
    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))
    ),
};
于 2013-07-28T11:17:06.663 に答える