如何在C ++中自行修改汇编代码?

时间:2011-10-22 06:34:18

标签: c++ assembly x86 inline-assembly self-modifying

我如何在C ++函数中内联它。

0041F84E   . 7B 02          JPO SHORT Unmodifi.0041F852
0041F850     B8             DB B8
0041F851     00             DB 00
0041F852   . 8B46 38        MOV EAX,DWORD PTR DS:[ESI+38]
0041F855   . 8B56 24        MOV EDX,DWORD PTR DS:[ESI+24]
0041F858   . 8B4E 10        MOV ECX,DWORD PTR DS:[ESI+10]
0041F85B   . 81EA 8B4B8636  SUB EDX,36864B8B

我怎么说 DB B8 DB 00

void test() {
    __asm {
        ...
        JPO label_0041F852
        __emit 0xB8
        __emit 00
label_0041F852:
        MOV EAX,DWORD PTR DS:[ESI+0x38]
        MOV EDX,DWORD PTR DS:[ESI+0x24]
        MOV ECX,DWORD PTR DS:[ESI+0x10]
        SUB EDX,0x36864B8B
        ...
    }
}

错误C2400:'操作码'中的内联汇编语法错误;发现'恒定' 执行cl.exe时出错。

我认为我不能把它放在.data部分,我已经阅读了所有我可以做的事情来包含这样的字节。

1 个答案:

答案 0 :(得分:2)

这是回答SSpoke的一个例子请求的答案长度评论。很久以前,当模仿图灵机是一件很酷的事情时,我写了一个图灵机模拟器程序来搜索DEC Vax小型机上的busy beavers。当程序决定接下来尝试哪个图灵机时,它将图灵机的机器代码编译成一个数组,并将该数组称为一个函数。 (所有这些都是用C写的。)

这是自修改代码。要运行它,您需要一个可以同时写入和执行的内存区域。

您的代码不是自我修改的 - 您根本不会写入代码。因此,您可以在只读程序段中运行它。