假设我在masm中定义了数据段中的变量:
.data
AppName db "PE tutorial ",0
现在在代码部分我定义了几个堆:
invoke GetProcessHeap
mov hmyHeap,eax
invoke HeapAlloc,hmyHeap,HEAP_ZERO_MEMORY,Memsize
mov heap1,eax
现在我们在堆中有一个内存位置,我想将数据段中AppName的内存位置更改为此heap1位置。我不想复制内容!我想更改内存位置
答案 0 :(得分:3)
这是不可能的。当您汇编源文件时,名称AppData
将被转换为相对于.data
的固定偏移量(可能略微简化,但为了明确这一点,AppData
的所有实例都将是例如,由.data+0x0000001c
替换。
因此,在运行时不再有名称AppData
,以便您可以更改其内存位置。
与C比较:你想要做的基本上是
int AppData;
int b;
&AppData = &b;
在C中也不起作用,但会给error: lvalue required as left operand of assignment
。 C解决方案是使用指针:
int *AppData;
int b;
AppData = &b;
同样,你可以在汇编中这样做。
AppName db "PE tutorial ",0
AppNamePtr dd ?
;in code, initialize the pointer to AppName's address
;then, when you allocate your heapmemory, change AppNamePtr.