【发布时间】: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++