может глупость спрашиваю, то что-то не догоняю: вполне корректна такая операция: MOV EAX, offset Buffer можно ли присвоить в противоположную сторону, вроде MOV offset Buffer, EAX ?
Шутишь ?! MOV может записывать только в регистры или в память, а offset Buffer - это константа, равная адресу переменной или метки Buffer Если тебе нужно записать содержимое EAX в Buffer, то синтаксис зависит от асма и от типа объявления Buffer: fasm: mov [Buffer],eax или mov dword [Buffer],eax masm: mov dword ptr [Buffer],eax или mov Buffer,eax если Buffer объявлен как dd
вот оно как, значит... т.е. если я правильно все понял, переменная (глобальная) с момента создания привязывается к одному адресу и переместиться в другое место ее не уговоришь никакими пряниками?
Ес-но, т.к. глобальная переменная это по сути и есть фиксированный адрес памяти по которому ты можешь что-то записать и прочитать. Другое дело - когда ты саму переменную используешь для хранения указателя на другую переменную, тогда чтение\запись идут по двойной ссылке, например: Код (Text): pMem dd 0 invoke HeapAlloc,... mov [pMem],eax ;eax - указатель на блок памяти .. ;теперь в переменной pMem хранится указатель на выделенный блок ;правильная запись в память mov eax,[pMem] ;грузим в eax указатель на блок памяти mov dword [eax],0 ;записываем 0 в первый dword блока памяти ;неправильная запись ;mov dword [pMem],0 - затираем указатель на блок, не освободив его HeapFree
спасибо, проянилось! еще такой момент: вызвал я допустим GetCommandLine, функция для меня выделила память и записала туда строку. Эту строку я скопировал в свой буфер вызвав lstrcpy. вопрос: нужно ли мне освобождать память, которую выделила GetCommandLine ?
Как в MessageBox вывести текст 'Hello!'? (Т.е. присвоить MsgBoxText=Set, но присваивается адрес Set) Set db 'Hello!',0 MsgBoxText db ? mov edx,offset Set mov dword ptr [MsgBoxText],edx invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK