首页 > 解决方案 > 不正确的操作数类型 MSVC

问题描述

当前尝试从方法发出随机指令,但不断收到错误“操作数类型不正确”。

#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),程序运行良好。我不确定为什么当它们都返回相同的值时它不起作用。

标签: c++assemblyvisual-c++

解决方案


不确定您要做什么。

JUNK扩展为JUNK_INSTRUCTION(generate_instruction),这将扩展为:

__asm _emit PUSH
__asm _emit generate_instruction
__asm _emit POP

generate_instruction只是一个函数的名称。编译器不会仅仅因为您命名它就运行该函数并替换它。

根据文档,您需要提供一个常量字节值,就像您对其他两个一样。

我认为您真的对运行时调用、编译时计算和宏的概念感到困惑。


推荐阅读