当前尝试从方法中发出随机指令,但始终收到错误“操作数类型不正确”。
#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)
时,程序运行正常。我不确定为什么当它们都返回相同的值时,它为什么不起作用。
答案 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,您需要像其他两个一样提供恒定的字节值。
我认为您真的对运行时调用,编译时计算和宏的概念感到困惑。