MOV offset Buffer, EAX - можно ли так?

Тема в разделе "WASM.BEGINNERS", создана пользователем held1r, 1 дек 2005.

  1. held1r

    held1r New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    29
    Адрес:
    Zaporozhye
    может глупость спрашиваю, то что-то не догоняю:



    вполне корректна такая операция: MOV EAX, offset Buffer



    можно ли присвоить в противоположную сторону, вроде MOV offset Buffer, EAX ?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Шутишь ?!

    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
     
  3. held1r

    held1r New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    29
    Адрес:
    Zaporozhye
    вот оно как, значит...



    т.е. если я правильно все понял, переменная (глобальная) с момента создания привязывается к одному адресу и переместиться в другое место ее не уговоришь никакими пряниками?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ес-но, т.к. глобальная переменная это по сути и есть фиксированный адрес памяти по которому ты можешь что-то записать и прочитать.

    Другое дело - когда ты саму переменную используешь для хранения указателя на другую переменную, тогда чтение\запись идут по двойной ссылке, например:
    Код (Text):
    1. pMem dd 0
    2.   invoke HeapAlloc,...
    3.   mov [pMem],eax ;eax - указатель на блок памяти
    4.   ..             ;теперь в переменной pMem хранится указатель на выделенный блок
    5.   ;правильная запись в память
    6.   mov eax,[pMem] ;грузим в eax указатель на блок памяти
    7.   mov dword [eax],0 ;записываем 0 в первый dword блока памяти
    8.   ;неправильная запись
    9.   ;mov dword [pMem],0 - затираем указатель на блок, не освободив его HeapFree
     
  5. held1r

    held1r New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2005
    Сообщения:
    29
    Адрес:
    Zaporozhye
    спасибо, проянилось!



    еще такой момент: вызвал я допустим GetCommandLine, функция для меня выделила память и записала туда строку. Эту строку я скопировал в свой буфер вызвав lstrcpy.

    вопрос: нужно ли мне освобождать память, которую выделила GetCommandLine ?
     
  6. khaoohs

    khaoohs New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2006
    Сообщения:
    3
    Как в 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
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Продолжаем шутить ?
    Код (Text):
    1. invoke MessageBox,..,addr Set,...