Как обратиться к апмяти если известен указатель на указатель ?

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 3 ноя 2008.

  1. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Извините за ламерский вопрос..

    есть такая вот структура
    Код (Text):
    1. struct Command
    2.     id           dd ?
    3.     argument     dd ?  ; Pointer to null-terminated string
    4. ends
    Я передаю указатель на неё в процедуру и там хочу обратиться к строке argument.
    т.е. как бы обратиться по указателю через его указатель

    Код (Text):
    1. proc performCommand command_:dword
    2.   ; разумеется это не работает, т.к. компилятор считает что в стэке структура а не указатель
    3.   mov ebx, [command_ + Command.argument]
    4. endp
    Как быть ? можно ли напрямую обратиться к структуре ну например через dword ptr[command]

    Мне приходиться пока делать так :
    Код (Text):
    1. mov eax, [command_]
    2. mov ebx, [eax + Command.argument] ; В ebx указатель на argument
    но это не удобно, поскольку значение в регистрах
    может поменяться скажем после вызова какой-либо проц-ы

    Заранее спасибо
     
  2. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    gershkovich
    Код (Text):
    1. mov ebx,[command_]
    2. mov ebx, [ebx + Command.argument]
    одной командой загрузить в ebx то что нужно не получится, т.к. надо дважды разыменовывать:
    Код (Text):
    1. *(*commad_ + Command.argument) /* на Си */
    т.е. на асм-псевдокоде [[command_] + Command.argument], а за 1 раз не получится так.
     
  3. only

    only New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2008
    Сообщения:
    147
    Это как? Код пожалуйста в пример.
    Если бы это было правдой, регистры бы вообще не использовались.
    А так, с каждым потоком связан свой контекст.
     
  4. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    only
    он наверное имел ввиду под "проц-ы" процедуры, которые изменяют регистры. Хотя согласен - если пишешь на асме, то с эти надо мерится, перед вызовом функции сохранять нужные регистры, которые могут изменится. Пытаться обходится без регистров - не очень умная идея, потому что с регистрами работает проц быстрее, чем с памятью.
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    gershkovich
    Как раз ebx не меняется при вызове ф-ии, по крайней мере WinAPI. Кроме того не меняются esi, edi, ebp. А если это собственная ф-ия, то нужно либо использовать регистр, который она не меняет, либо сохранять значение указателя в стеке или переменной.
     
  6. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    Спасибо за разъяснение.
    Да. Действительно надо использовать регистры.
    По другому никак.
    Я посмотрел какой код генерит Delphi (через его дебагер) - он так и поступает.

    ЗЫ под "проц-ы" я понимал "процедуры"