Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача ссылки в DLL... Для вопроса желательно знать основы VB.. 
:(
    Опции темы
Kurt
Дата 16.9.2003, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Здравствуйте!
Хочу написать DLL на ASM, но никак не могу понять, как передать ссылку на переменную, если быть точнее, как ею воспользоваться в ASM?
Например, на VB вызываю мою DLL-функцию:
Код

Declare function myFunc lib "myDLL" (ByRef variable as integer) as long
...
dim a as integer
myFunc(a)


А как этой ссылкой воспользоваться в ASM-ой DLL-процедуре?
Например, присвоить а значение 5?
Покажите, пожалуйста.
Желательно, кодом.
Заранее спасибо.

P.S. Просто я очень мало работал с Win32 на ASM...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
oleg1973
Дата 16.9.2003, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Kurt
Дата 16.9.2003, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Сорри, ты немного не понял ( некудышно я объясняю.. sad.gif )- я хочу из VB передать ссылку (в ASM-вую DLL) на переменную a.
По ссылке изменить 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. Наверно, опять очень сумбурно объяснено? Ну, как могу...


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
oleg1973
Дата 17.9.2003, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
RAN
Дата 17.9.2003, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: нет
Всего: 6



Всё верно, oleg1973, но надо результат запихивать перед ret. Функция Long возвращает.
И ещё, чтоб избежать ошибок и не понимания. Функция вызывается stdcall. Т.е. параметры передаются справа налево, из стека из удаляет вызываемая функция (та, что в Dll).
PM MAIL ICQ   Вверх
oleg1973
Дата 17.9.2003, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



немного не согласенRAN
к примеру стандартная CRTDLL.DLL стек не поправляет
ето уже сам компилятор после
call myfunc(a)
add esp,4 // эту строчку компилер добавит и это вообшем почти для всех внешних длл правильно



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
RAN
Дата 18.9.2003, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: нет
Всего: 6



oleg1973, IMHO, так паскаль делает. В C (cdecl и stdcall) и в VB за освобождение стека отвечает функция.
Кто рассудит наш спор? А лучше пусть Kurt проверит. Ему всё равно код писать надо.

PM MAIL ICQ   Вверх
oleg1973
Дата 18.9.2003, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



нетRAN
я пробовал с CRTDLL.DLL обыкновенный printf на асме вызывать
со стеком будут глюки если самому не поправлять
тоже самое касаемо к примеру svgalib и libc в линюхе
никто стек не коректирует


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Kurt
Дата 18.9.2003, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: 1
Всего: 36



Цитата
А лучше пусть Kurt проверит

Сожусь проверять... smile.gif
Вариант oleg1973 не подходит сразу - вылетает с ошибкой.
Пытаюсь проверить вариант RAN, кстати, наверняка можно использовать директиву ARG.
Не велетает. Выполняется, но неверно.
Ищу ошибку.

Только результат надо помещать в eax (ПРОВЕРЕНО!!!), а не возвращать в ret.
ret - для очищения стека.


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
RAN
Дата 18.9.2003, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: нет
Всего: 6



Цитата
кстати, наверняка можно использовать директиву ARG.

Так не парь мозги и используй. Только вопрос, как это происходит технически останется не выясненным.
PM MAIL ICQ   Вверх
Baa
Дата 18.9.2003, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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
PM ICQ   Вверх
oleg1973
Дата 18.9.2003, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1267 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.