2013-10-15 4 views
1

предположим в MASM я определил переменную в сегменте данных:изменение расположения переменной в памяти

.data 
AppName db "PE tutorial ",0 

сейчас в секции кода я определил несколько куч:

invoke GetProcessHeap 
mov hmyHeap,eax 
invoke HeapAlloc,hmyHeap,HEAP_ZERO_MEMORY,Memsize 
mov heap1,eax 

Теперь у нас есть место в памяти в куче, и я хочу изменить расположение памяти AppName в сегменте данных в этом месте heap1. Я не хочу копировать контент! Я хочу изменить местоположение памяти

+1

Изменение местоположения памяти означает именно это - для копирования информации из одного места в память в другое место в памяти. Или ваш вопрос недостаточно ясен? – johnfound

+0

Вы не можете изменить адрес 'AppName', поскольку он был установлен, когда ваша программа была связана. Все, что вы можете сделать, это скопировать его. – Michael

+0

@johnfound Я точно хочу изменить адрес AppName, что говорит Майкл. – RF27

ответ

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. 
+0

-1 вопрос о сборке не C – johnfound

+0

@johnfound. Вы можете свободно сбрасывать все, что захотите, но мой ответ объясняет, почему подход OP не работает * и * предложение, как это сделать работа в сборке. Аналогия с C есть просто, как хорошо, аналогия. Я не совсем уверен, как это делает мой ответ «не полезным» (который является альт-текстом кнопки downvote и обычной причиной для ответа на нижний уровень). – us2012

+0

Ну, это не полезно для меня, потому что я не знаю C. Если ответ полезен для OP, он может проголосовать или даже принять его. :) – johnfound

Смежные вопросы