【问题标题】:Improper operand type MSVC不正确的操作数类型 MSVC
【发布时间】:2018-10-15 05:11:59
【问题描述】:

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

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

【问题讨论】:

  • 0x50 是 push eax(或在 64 位模式下,push rax),而不是 push imm8。因此,在具有常量 arg 的版本中,它是 push eax / nop / pop eax,这几乎毫无意义。这样做是没有意义的。 (顺便说一句,inline-asm 不能在运行时 JIT。)

标签: c++ assembly visual-c++


【解决方案1】:

不确定您要做什么。

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

__asm _emit PUSH
__asm _emit generate_instruction
__asm _emit POP

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

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

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

【讨论】:

  • 啊,好的,谢谢你的解释,我试图从函数中返回 NOP 指令并使用它。
猜你喜欢
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多