70,023
社区成员




enum md_opcode {
OP_NA = 0,
#define DEFINST(OP,MSK,NAME,OPFORM,RES,FLAGS,O1,O2,I1,I2,I3) OP,
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) OP,
#define CONNECT(OP)
#include "machine.def"
OP_MAX
};
DEFINST(LDA, 0x08,
"lda", "a,o(b)",
IntALU, F_ICOMP,
DGPR(RA), DNA, DNA, DGPR(RB), DNA)
#define CONNECT(OP)
这种格式也可以吗?(不是传统意义上的#define A B
)
#define DEFINST(OP,MSK,NAME,OPFORM,RES,CLASS,O1,O2,I1,I2,I3) \
case OP: \
/* execute the instruction */ \
SYMCAT(OP,_IMPL); \
fprintf(stderr, "pc = %llX\n", regs.regs_PC); \
break;
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) \
case OP: \
panic("attempted to execute a linking opcode");
#define CONNECT(OP) /* nada... */
#define DECLARE_FAULT(FAULT) \
{ \
fault = (FAULT); \
break; \
}
#include "machine.def" 的时候 machine.def 中的内容将按照上面的来展开了. 比如里面的
DEFINST(LDA, 0x08,
"lda", "a,o(b)",
IntALU, F_ICOMP,
DGPR(RA), DNA, DNA, DGPR(RB), DNA)
会被展开成:
case LDA:
/* execute the instruction */
SYMCAT(LDA,_IMPL);
fprintf(stderr, "pc = %llX\n", regs.regs_PC);
break;
switch (ent->op) {
#define DEFINST(OP,MSK,NAME,OPFORM,RES,CLASS,O1,O2,I1,I2,I3) \
case OP: \
/* execute the instruction */ \
SYMCAT(OP,_IMPL); \
fprintf(stderr, "pc = %llX\n", regs.regs_PC); \
break;
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) \
case OP: \
panic("attempted to execute a linking opcode");
#define CONNECT(OP) /* nada... */
#define DECLARE_FAULT(FAULT) \
{ \
fault = (FAULT); \
break; \
}
#include "machine.def"
default:
fault = md_fault_unimpl;
}
}
这段是跟之前的有一定关联的代码,swith的ent->op类型就是一楼的枚举类型。然后这里面的case分支我就看不懂了... 能解释一下宏展开的过程吗...?
switch (ent->op) {
#define DEFINST(OP,MSK,NAME,OPFORM,RES,CLASS,O1,O2,I1,I2,I3) \
case OP: \
/* execute the instruction */ \
SYMCAT(OP,_IMPL); \
fprintf(stderr, "pc = %llX\n", regs.regs_PC); \
break;
#define DEFLINK(OP,MSK,NAME,MASK,SHIFT) \
case OP: \
panic("attempted to execute a linking opcode");
#define CONNECT(OP) /* nada... */
#define DECLARE_FAULT(FAULT) \
{ \
fault = (FAULT); \
break; \
}
#include "machine.def"
default:
fault = md_fault_unimpl;
}
}
这段是跟之前的有一定关联的代码,swith的ent->op类型就是一楼的枚举类型。然后这里面的case分支我就看不懂了... 能解释一下宏展开的过程吗...?