Привет всем! Если надо передать адрес глобальной переменной в вызов invoke я просто пишу (переменная RecvBuff) Код (Text): invoke recv, [hSock], RecvBuff, 512, 0 А если RecvBuff локальная ? Приходится писать Код (Text): lea eax, [RecvBuff] invoke recv, [hSock], eax, 512, 0 Можно ли записать покороче ? Иногда бывает параметров больше трех, и регистры не всегда можно использовать Наверняка в FASMе есть макрос какой что ли.... Заранее спасибо.
1.я иногда делаю так: Код (Text): local _str: rb 260 local p_str: dd? ... lea eax,[_str] mov [p_str],eax ... invoke func,[p_str]... 2.если много параметров строку можно разбивать на части: Код (Text): invoke SendMessage,[lParam],\ BM_GETCHECK,0,0 3.если много регистров нельзя использовать, можно и одним через пуш: Код (Text): lea ecx,[str_1] push ecx lea ecx,[str_2] invoke lstrcpy,ecx
Спасибо, shoo Вариант 1 мне больше понравился. В начале проц-ы проинициализировал все ссылки и вперед!
gershkovich а разве addr не для этого? по крайне мере для win32ax хедеров, должно работать. там через edx, всё идет.
dead_body Похоже, что так Но мне показалось, что EAX при этом не сохраняется (щас нет возможности проверить)
IceStudent А EAX ? Я смотрел текст макроса - там фигурирует EAX Я не понимаю записи макросов, но мне кажется, что EAX тоже затрется Да?
если адрес нужен часто, а в процедуре не используется один из регистров edi,esi,ebx, то есть смысл сохранить регистр в стеке, а адрес поместить в него - и красиво, и быстро.
gershkovich Если не понимаешь, попробуй это: Код (Text): proc func3,a1,a2,a3 ret endp ... xor edx,edx xor eax,eax invoke func3,eax,edx,addr var