Я пишу программу, в которой нужна константа, но значение для константы будет определено во время выполнения. У меня есть массив кодов операций, из которых я хочу случайным образом выбрать один и _emit его в код программы. Вот пример:
unsigned char opcodes[] = {
0x60, // pushad
0x61, // popad
0x90 // nop
}
int random_byte = rand() % sizeof(opcodes);
__asm _emit opcodes[random_byte]; // optimal goal, but invalid
Однако, похоже, _emit может принимать только постоянное значение. Например, это действительно:
switch(random_byte) {
case 2:
__asm _emit 0x90
break;
}
Но это становится громоздким, если массив кодов операций увеличивается до какой-либо значительной длины, а также, по существу, исключает ценность массива, поскольку это должно быть выражено в менее привлекательной форме.
Есть ли способ аккуратно закодировать это, чтобы облегчить рост массива опкодов? Я пробовал другие подходы, такие как:
#define OP_0 0x60
#define OP_1 0x61
#define OP_2 0x90
#define DO_EMIT(n) __asm _emit OP_##n
// ...
unsigned char abyte = opcodes[random_byte];
DO_EMIT(abyte)
В этом случае перевод получается как OP_abyte, поэтому для него потребуется вызов, подобный DO_EMIT (2), который возвращает меня к выражению switch и перечисляет каждый элемент в массиве.
Также вполне возможно, что у меня здесь совершенно неверный подход. Полезные отзывы приветствуются.