MSVC操作数类型不正确

时间:2018-10-14 20:11:50

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

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

#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 :(得分:2)

不确定您要做什么。

[pid: 3552|app: 0|req: 7/25] 172.68.245.224 () {58 vars in 1129 bytes} [Sun Oct 14 23:20:30 2018] GET /accounts/login/ => generated 3551 bytes in 5 msecs (HTTP/1.1 200) 5 headers in 292 bytes (1 switches on core 0) Traceback (most recent call last): File "/home/django/venv/lib/python3.6/site-packages/django/core/handlers/wsgi.py", line 150, in __call__ start_response(status, response_headers) TypeError: http header must be encodable in latin1 [pid: 3551|app: 0|req: 5/26] 172.68.245.224 () {66 vars in 1309 bytes} [Sun Oct 14 23:22:49 2018] POST /accounts/login/ => generated 0 bytes in 21 msecs (HTTP/1.1 200) 4 headers in 124 bytes (0 switches on core 0) 扩展为JUNK,它将扩展为:

JUNK_INSTRUCTION(generate_instruction)

__asm _emit PUSH __asm _emit generate_instruction __asm _emit POP 只是函数的名称。编译器不会仅仅因为您将其命名而运行该函数并进行替换。

根据the docs,您需要像其他两个一样提供恒定的字节值。

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