С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
1

Как объявить прототип зная только адрес функции

02.02.2024, 15:51. Показов 1083. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
макрос invoke должен знать прототип функции
например при попытке прописать лишний параметр он вызовет ошибку

если например нужно функцию инициализировать посредством - GetProcAddress


Assembler
1
2
3
4
5
6
7
8
9
10
.data
tTxt1 db "DDRAW.DLL",0
tTxt2 db "DirectDrawCreate",0
.data?
NameFun dd ?
.code
 
invoke LoadLibrary,ADDR tTxt1
invoke GetProcAddress,eax,ADDR tTxt2
mov NameFun,eax

то как можно объявить прототип этого адреса функции

я конечно понимаю что её можно вызывать через - call


Assembler
1
2
3
4
push 0
push 0
push 0
call NameFun

но хочется через - invoke
чтобы отслеживалось количество параметров

объявить обычным способом


Assembler
1
NameFun PROTO :DWORD,:DWORD,:DWORD

не получится
выскакивает ошибка о переопределении идентификатора

кто в теме подскажите пожалуйста

или на masm32 это сделать нельзя
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2024, 15:51
Ответы с готовыми решениями:

Как на фасме объявить прототип пользовательской функции
Сам я работаю на Масме для одной темы изучаю пример на Фасме в определённых частях кода мне...

Как отправить данные на устройства, зная только его мак адрес?
Как нибудь можно отправить данные на устройства зная только его мак адрес. Ведь динамический ip...

Объявить прототип функции f1 с 2 аргументами-строками и возвращаемым результатом в виде литерного массива.
Доброе все время суток! Прошу помочь, задали задание на Turbo C,так сложилось что не успел...

Объявить прототип функции f1 с 2 аргументами-строками и возвращаемым результатом в виде литерного массива
Здрасте всем), есть такая задачка: Объявить прототип функции f1 с 2 аргументами-строками и...

7
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
02.02.2024, 16:58 2
assch1,
наверное, правильное название темы Как объявить прототип зная только имя функции? Откуда вы можете знать адрес, он еще и меняется динамически... Открою один секрет. Чтобы работать с функцией в masm32/masm64 через invoke прототип можно и не объявлять.
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
02.02.2024, 18:54  [ТС] 3
Скорее всего именно адрес
который собственно и возвращает функция - GetProcAddress
а лексему к этому адресу можно придумать любую

Честно говоря мне макрос invoke не нужен по тому что я им и не пользуюсь
а в теме я его указал только для того чтобы была понятна суть проблемы

Я пользуюсь своим транслятором по сути надстройкой перед компилятором
который сначала мой код проекта формирует под код ассемблера
и потом скармливает его уже основному компилятору MASM32 - ml.exe

Синтаксически я объявляю функцию вот так - fun Beep,50,500

Первым проходом транслятор собирает информацию
в том числе и типизацию с количеством параметров у функций
на основе объявленных прототипов
и на втором проходе при формировании листинга
уже отслеживает количество заполненных параметров у функций

Просто если функцию брать через - GetProcAddress
мой транслятор не сможет получить информацию о прототипе функции

Но если ответа на мой вопрос по теме не будет
то в принципи ничего страшного не произойдёт

я просто придумаю для моего транслятора дополнительное объявление прототипов

например вот так - PROTO NameFun DWORD,DWORD,DWORD

и тогда мой транслятор при первом проходе запомнит эти данные
0
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
03.02.2024, 14:44 4
Цитата Сообщение от assch1 Посмотреть сообщение
Скорее всего именно адрес который собственно и возвращает функция - GetProcAddress
assch1,
у GetProcAddress два параметра 1) Дескриптор DLL из которой экспортируется функция и 2) Указатель на символьную строку с именем функции. Зная имя, не сложно найти в справочнике и количество параметров передаваемых функции
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
03.02.2024, 16:29  [ТС] 5
Mikl___, Спасибо за пояснения


Если кому интересно то небольшое пояснение

Моя платформа программирования - MASM32
с той лишь разницей что мой код проекта
сначала обрабатывает программа транслятор формируя листинг
который потом скармливается основному компилятору MASM32 - ml.exe

На первый взгляд этот метод похож на применение пользовательских макросов
но на самом деле разница очень большая
пользовательские макросы могут многое но к большому сожелению не всё
потому что имеют разного рода определённые ограничения
у программы транслятора таких ограничений нет от слова совсем

В своё время я часто применял свои пользовательские макросы
например когда при работе с - OpenGL
ради интереса переводил - Уроки от NeNe на - MASM32
несомненно применение макросов значительно упрощали рутину кода проекта
но дело всё в том что обработкой макросов занимается - ml.exe
и соответственно тратит на них определённое время
при небольших проектах это конечно незаметно
но однажды время компиляции какого то урока показало 2000 миллисекунд
2 секунды это конечно не критично но всё же было досадно
я понимал что это всё из за тяжеловесных макросов
с которыми приходится работать компилятору - ml.exe

Я подумал а что если написать транслятор который будет формировать код проекта
в котором не нужно будет делать лишнею работу компилятору - ml.exe
результат превзошёл все мои ожидания
работа транслятора плюс работа компилятора - ml.exe
того же самого кода составила - 100 миллисекунд
то есть в 20 раз быстрее
с тех пор я давно забыл про макросы
и только периодически обновляю программу транслятора новыми возможностями

Для моего транслятора начальные регистро-независимые символы - fun
по сути являются директивой которая под капотом записывает в листинг
объявляемую функцию посредством команды - call
и соответственно при наличии аргументов командой - push

Утрированный но показательный пример ухода от рутины кода:

Предположим я в коде у себя объявил библиотеку - lib glu32
и воспользовался в проекте функцией из этой библиотеки - gluPerspective
мой транслятор при первоначальном сборе информации
зафиксирует прототип этой функции

gluPerspective PROTO :double,:double,:double,:double

Само объявление прописывать в проекте не нужно
транслятор сам найдёт этот прототип в подключённых библиотеках

И при объявлении этой функции в проекте

Assembler
1
fun gluPerspective,p1,float(esi/edi),p2,p3
Если количество аргументов не совпадёт с прототипом
транслятор вызовет ошибку
но если всё правильно то зная типизацию каждого аргумента
и имея на борту определённые алгоритмы
под капотом на этом месте в листинг запишется код

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
movsd xmm1,p3
sub esp,8
movsd qword ptr [esp],xmm1
movsd xmm1,p2
sub esp,8
movsd qword ptr [esp],xmm1
movd xmm0,esi
movd xmm7,edi
divss xmm0,xmm7
cvtss2sd xmm1,xmm0
sub esp,8
movsd qword ptr [esp],xmm1
movsd xmm1,p1
sub esp,8
movsd qword ptr [esp],xmm1
call gluPerspective
Но если транслятор не будет иметь сведений о прототипе определённой функции
то директива - fun
обработку будет делать по умолчанию
то есть каждый аргумент будет обработан как тип - dword
и отслеживание количества аргументов происходить не будет
по сути ответственность будет только на программисте

Чаще всего транслятор знает о прототипах функций проекта
исключением является лишь тот случай
если адрес функции взят через - GetProcAddress

Предположим мы взяли адрес функции и поместили его в лексему - NameFun
прописывать прототип функции в проекте необязательно
но в определённых случаях желательно иметь прототип функции
к примеру у функции четыре параметра и только первый аргумент - dword
при объявление прототипа в лоб

NameFun PROTO :dword,:float,:double,:qword

Компилятор вызовет ошибку уникальности имён
по этому я и создал эту тему

Но по сути я решил эту проблему для себя
я буду объявлять прототип таких функций в проекте обычным способом
за исключением одной детали
имя функции будет иметь сигнатурный префикс прямого слеша

|NameFun PROTO :dword,:dword,:dword

Транслятор увидев объявление прототипа функции таким способом
запомнит эти данные прототипа
а под капотом просто закоментирует эту строку в листинге
0
Модератор
Эксперт по электронике
8542 / 4394 / 1651
Регистрация: 01.02.2015
Сообщений: 13,653
Записей в блоге: 9
03.02.2024, 16:37 6
На форуме masm32 видел такой вариант:
https://masm32.com/board/index... 7#msg52707
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
proto_PGetRawInputData typedef proto stdcall :HRAWINPUT,:DWORD,:LPVOID,:PUINT,:DWORD
PGetRawInputData typedef ptr proto_PGetRawInputData
 
.data?
    _GetRawInputData    PGetRawInputData ?
 
.code
 
GetApiAdd proc dllname:DWORD,procname:DWORD
    Local hdll:HWND
 
    invoke LoadLibrary,dllname
    .if eax!=0
        mov hdll,eax
        invoke GetProcAddress,hdll,procname
        push    eax
        invoke FreeLibrary,hdll
        pop eax
    .endif
    ret
GetApiAdd endp
        
    invoke  GetApiAdd,CTXT("User32.dll"),CTXT("GetRawInputData")
    .if eax==0
        mov _GetRawInputData,eax
        invoke  ErrorMessage,CTXT("GetRawInputData")
    .else
        mov _GetRawInputData,eax
    .endif
....
    invoke  _GetRawInputData,lParam,RID_INPUT,NULL,addr dwSize,sizeof RAWINPUTHEADER
Посмотрите, может подойдёт...
1
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
03.02.2024, 18:33  [ТС] 7
ФедосеевПавел, Спасибо за участие

Попробую проанализировать

Добавлено через 35 минут
Отличный метод

Он снимает проблему уникальности имён

Ещё раз Спасибо ФедосеевПавел,

Век живи век учись

Добавлено через 1 час 13 минут
После тестовых операций я понял
что этот метод сработает только для макроса - invoke
и то если параметр будет не больше 4-байта

например если параметр в прототипе будет указан как - real8 или qword
то вызовется ошибка

потому что как я понял макрос - invoke
может принять такой параметр только за два раза (хотя не исключено что я ошибаюсь)

По сути это и есть преимущество транслятора который легко это обойдёт
и сделает он это просто при помощи добавления сигнатурного префикса прямого слеша
при банальном объявлении прототипа

И как я уже писал выше
транслятор увидев объявление прототипа функции таким способом
запомнит эти данные прототипа
а под капотом просто закоментирует эту строку в листинге

Я уже внёс этот функционал в свой транслятор и как показали тесты всё работает без проблем
0
Модератор
Эксперт по электронике
8542 / 4394 / 1651
Регистрация: 01.02.2015
Сообщений: 13,653
Записей в блоге: 9
03.02.2024, 18:44 8
Где-то встречал пример с передачей через invoke чисел типа real8.
Кажется, эти числа передавались не напрямую, а через макрос или макрос-функцию. Но при этом возникали другие неудобства.

Кажется, макрос называется FP()...
0
03.02.2024, 18:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2024, 18:44
Помогаю со студенческими работами здесь

Как правильно объявить прототип функций
Нужно функции с программы объявить всеми тремя способами. Помогите это сделать. - записать...

Узнать адрес функции 2, зная адрес функции 1
Допустим две функции расположены так: int f1() { return 1; } int f2() { return 2; } int...

Как найти ip адрес устройства в локальной сети зная его MAC адрес?
Имеется web-server который реализован на контроллере, мне нужно ловить его так как ip он получает...

Как отправить файл на сервер через FTP не зная имени а зная только расширение файла?
Доброго времени суток! Очень нужна ваша помощь форумчане.. Пытаюсь отправить файл через FTP на...

Как определить IP-адрес сети, зная IP-адрес узла назначения и маску сети
Добрый вечер, форумчане! Дали задачку одну: "Найти IP-адрес сети, зная IP-адрес узла...

Прототип с символьным указателем (объявить)
Объявить прототип функции m с 3 аргументами (первые два из них являются литерными указателями,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru