FASM-Как записать адрес локал. переменной как параметр к invoke ?

Тема в разделе "WASM.BEGINNERS", создана пользователем gershkovich, 10 авг 2006.

  1. gershkovich

    gershkovich New Member

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

    Если надо передать адрес глобальной переменной в вызов
    invoke я просто пишу (переменная RecvBuff)

    Код (Text):
    1. invoke      recv,  [hSock], RecvBuff, 512, 0
    А если RecvBuff локальная ?
    Приходится писать
    Код (Text):
    1. lea  eax, [RecvBuff]
    2. invoke      recv,  [hSock], eax, 512, 0
    Можно ли записать покороче ?
    Иногда бывает параметров больше трех, и регистры не всегда можно использовать

    Наверняка в FASMе есть макрос какой что ли....

    Заранее спасибо.
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    1.я иногда делаю так:
    Код (Text):
    1. local _str: rb 260
    2. local p_str: dd?
    3. ...
    4. lea eax,[_str]
    5. mov [p_str],eax
    6. ...
    7. invoke func,[p_str]...
    2.если много параметров строку можно разбивать на части:
    Код (Text):
    1.     invoke SendMessage,[lParam],\
    2.                                  BM_GETCHECK,0,0
    3.если много регистров нельзя использовать, можно и одним через пуш:
    Код (Text):
    1. lea ecx,[str_1]
    2. push ecx
    3. lea ecx,[str_2]
    4. invoke lstrcpy,ecx
     
  3. gershkovich

    gershkovich New Member

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

    Вариант 1 мне больше понравился.
    В начале проц-ы проинициализировал все ссылки и вперед!
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    gershkovich
    а разве addr не для этого?

    по крайне мере для win32ax хедеров, должно работать.
    там через edx, всё идет.
     
  5. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    dead_body
    Похоже, что так
    Но мне показалось, что EAX при этом не сохраняется
    (щас нет возможности проверить)
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    gershkovich
    в фасме edx не сохраняется:
    invoke func,edx,addr something ;<-- edx затрётся
     
  7. gershkovich

    gershkovich New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2006
    Сообщения:
    97
    IceStudent
    А EAX ?

    Я смотрел текст макроса - там фигурирует EAX
    Я не понимаю записи макросов, но мне кажется, что EAX тоже затрется

    Да?
     
  8. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    а откомпилировать и посмотреть трудно?
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    если адрес нужен часто, а в процедуре не используется один из регистров edi,esi,ebx, то есть смысл сохранить регистр в стеке, а адрес поместить в него - и красиво, и быстро.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    gershkovich
    Если не понимаешь, попробуй это:
    Код (Text):
    1. proc func3,a1,a2,a3
    2.  
    3.   ret
    4. endp
    5. ...
    6. xor  edx,edx
    7. xor  eax,eax
    8. invoke func3,eax,edx,addr var
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    stdcall
     
  12. gershkovich

    gershkovich New Member

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