![]() |
|
![]() ![]() ![]() |
|
Kurt |
|
|||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Здравствуйте!
Хочу написать DLL на ASM, но никак не могу понять, как передать ссылку на переменную, если быть точнее, как ею воспользоваться в ASM? Например, на VB вызываю мою DLL-функцию:
А как этой ссылкой воспользоваться в ASM-ой DLL-процедуре? Например, присвоить а значение 5? Покажите, пожалуйста. Желательно, кодом. Заранее спасибо. P.S. Просто я очень мало работал с Win32 на ASM... -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
зависит как ты длл написал
можно через стек передать либо через регистры типа mov eax,5 call myfunc или mov eax,5 push eax call myfunc на мойвзгляд удобнее через регистры не надо парится с esp -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Kurt |
|
|||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Сорри, ты немного не понял ( некудышно я объясняю..
![]() По ссылке изменить a, потом воспользоваться новым a в VB. Здесь 5 - лишь пример. Вобщем, вопрос (по ASM-вой библиотеке): 1) достать из стека ссылку на переменную a (сколько байт надо? в переменную какой длинны поместить ссылку из стека) Типа pop pTmpVar ; pTmpVar должна быть какого размера, как объявлена? dd? dw?.. 2) имея ссылку (pTmpVar), изменить значение a (присвоить a=5) После этого в VB-проге значение a должно быть равно 5. Т.е. я хочу изменить VB-шную переменную с помощью ASM-библиотеки. После вызова DLL-function, print a выведет 5. Во всяком случае, должен. Опять же, буду очень рад коду, примеру. P.S. Наверно, опять очень сумбурно объяснено? Ну, как могу... -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
значит так
после myfunc(a) на стеке будет лежать адрес возврата и указатель на ячейку памяти с переменной А если только визуал басик туда еще ченить не пихает тогда делаем так mov eax,[esp-4] mov [eax],byte 5 ret вообшемто все -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: нет Всего: 6 |
Всё верно, oleg1973, но надо результат запихивать перед ret. Функция Long возвращает.
И ещё, чтоб избежать ошибок и не понимания. Функция вызывается stdcall. Т.е. параметры передаются справа налево, из стека из удаляет вызываемая функция (та, что в Dll). |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
немного не согласенRAN
к примеру стандартная CRTDLL.DLL стек не поправляет ето уже сам компилятор после call myfunc(a) add esp,4 // эту строчку компилер добавит и это вообшем почти для всех внешних длл правильно -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: нет Всего: 6 |
oleg1973, IMHO, так паскаль делает. В C (cdecl и stdcall) и в VB за освобождение стека отвечает функция.
Кто рассудит наш спор? А лучше пусть Kurt проверит. Ему всё равно код писать надо. |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
нетRAN
я пробовал с CRTDLL.DLL обыкновенный printf на асме вызывать со стеком будут глюки если самому не поправлять тоже самое касаемо к примеру svgalib и libc в линюхе никто стек не коректирует -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Kurt |
|
|||
Увлеченный ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1662 Регистрация: 22.8.2003 Где: Краснодар Репутация: 1 Всего: 36 |
Сожусь проверять... ![]() Вариант oleg1973 не подходит сразу - вылетает с ошибкой. Пытаюсь проверить вариант RAN, кстати, наверняка можно использовать директиву ARG. Не велетает. Выполняется, но неверно. Ищу ошибку. Только результат надо помещать в eax (ПРОВЕРЕНО!!!), а не возвращать в ret. ret - для очищения стека. -------------------- Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед) ... Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн) |
|||
|
||||
RAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: нет Всего: 6 |
Так не парь мозги и используй. Только вопрос, как это происходит технически останется не выясненным. |
|||
|
||||
Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
...
.model flat, stdcall ... TestProc proc lpValue: LPDWORD mov esi, [lpValue] mov byte ptr [esi], 5 ret TestProc endp А так катит? masm32 з.ы. так вы к чему пришли? какая конвенция вызова у басика-то? з.з.ы код выше прелестно работает в дельфи при stdcall -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: 7 Всего: 34 |
format PE
include '%include%\win32a.inc' entry start start: invoke printf,msg add esp,4 ret msg: db "hello wolrld",0dh,0ah data import include '%include%\import.inc' include '%include%\import1.inc' end data ----------------------------------------------- вот на асме все работает если убрать add esp,4 то естественно глюк поймаем так что --------------- допустим на С ( в линюхе правда) var=getvideomode(); var через eax возврашается Это сообщение отредактировал(а) oleg1973 - 18.9.2003, 13:08 -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |