Неправильный тип операнда MSVC - PullRequest
0 голосов
/ 14 октября 2018

В данный момент пытаюсь выдать случайную инструкцию из метода, но постоянно получаю сообщение об ошибке «Неправильный тип операнда».

#include <iostream>
#include <time.h>

#define PUSH    0x50
#define POP     0x58
#define NOP     0x90

auto generate_instruction() -> int {
    int instruction_list[] = { NOP };
    return instruction_list[rand() % (sizeof(instruction_list) / sizeof(*instruction_list))];
}

#define JUNK_INSTRUCTION(x)     \
__asm _emit PUSH                \
__asm _emit x                   \
__asm _emit POP                 \

#define JUNK JUNK_INSTRUCTION(generate_instruction)

int main() {
    srand(static_cast<int>(time(NULL)));
    JUNK;
    std::cout << "Hello World!" << std::endl;
}

Однако, когда я заменяю #define JUNK JUNK_INSTRUCTION(generate_instruction) на #define JUNK JUNK_INSTRUCTION(NOP), программа работает нормально.Я не уверен, почему это не работает, когда они оба возвращают одно и то же значение.

1 Ответ

0 голосов
/ 14 октября 2018

Не уверен, что вы пытаетесь сделать.

JUNK расширяется до JUNK_INSTRUCTION(generate_instruction), который расширится до:

__asm _emit PUSH
__asm _emit generate_instruction
__asm _emit POP

generate_instruction - это просто имяфункция.Компилятор не собирается запускать функцию и заменять ее только потому, что вы ее называете.

В соответствии с документами , вам необходимо предоставить постоянное значение байта, как вы это делаете с двумя другими.

Я думаю, вы действительно запутались в понятиях вызовов во время выполнения, вычислений во время компиляции и макросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...