gpt4 book ai didi

C预处理器变量常量?

转载 作者:行者123 更新时间:2023-12-01 19:42:55 25 4
gpt4 key购买 nike

我正在编写一个程序,其中需要一个常量,但常量的值将在运行时确定。我有一组操作码,我想从中随机选择一个并将其发送到程序代码中。这是一个例子:

unsigned char opcodes[] = { 
0x60, // pushad
0x61, // popad
0x90 // nop
}

int random_byte = rand() % sizeof(opcodes);
__asm _emit opcodes[random_byte]; // optimal goal, but invalid

不过,_emit好像只能取一个常数值。例如,这是有效的:

switch(random_byte) {
case 2:
__asm _emit 0x90
break;
}

但如果操作码数组增长到任何相当大的长度,这就会变得笨拙,并且基本上消除了数组的值(value),因为它必须以不太吸引人的方式表达。

有什么方法可以巧妙地编写代码以促进操作码数组的增长?我尝试过其他方法,例如:

#define OP_0 0x60
#define OP_1 0x61
#define OP_2 0x90

#define DO_EMIT(n) __asm _emit OP_##n

// ...

unsigned char abyte = opcodes[random_byte];
DO_EMIT(abyte)

在这种情况下,转换结果为 OP_abyte,因此它需要像 DO_EMIT(2) 这样的调用,这迫使我返回到 switch 语句并枚举数组中的每个元素。

也很有可能我在这里采用了完全无效的方法。感谢有用的反馈。

最佳答案

我不确定您使用的是什么编译器/汇编器,但您可以使用标签在 GCC 中完成您想要的操作。在 asm 站点,您可以将其编写为:

asm (
"target_opcode: \n"
".byte 0x90\n" ); /* Placeholder byte */

...在您要修改该代码的地方,您将使用:

extern volatile unsigned char target_opcode[];
int random_byte = rand() % sizeof(opcodes);
target_opcode[0] = random_byte;

也许您可以将其翻译成编译器的 asm 方言。

请注意,有关自修改代码的所有常见注意事项均适用:代码段可能不可写,并且您可能必须在执行修改后的代码之前刷新 I-cache。

关于C预处理器变量常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com