Форум программистов, компьютерный форум, киберфорум
FASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 01.10.2017
Сообщений: 56
1
FASM

Создать DLL и из тестовой программы вызвать процедуру из этой DLL

25.11.2018, 19:28. Показов 3088. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте ,проверти правильно выполнения задания ,нужно создать библиотеку и использовать ее же в программе .

Библиотека.
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
32
format PE GUI DLL
include 'C:\Program Files\ass\include\win32a.inc'
a dd 12
b dd 14
c dd 16
d dd 18
e dd ?
start:
mov ebx,1
ret
func1:
mov eax,[a]
mov ebx,[b]
mul ebx     ;eax=a*b
mov esi,eax ;перекинули eax в esi
mov eax,[c]
mov ebx,[d]
add ebx,eax ;ebx=c+d
mov eax,[a]
mul ebx     ;eax=a*(c+d)
add esi,eax ;сложили результат eax=a*(c+d) с eax=a*b
mov eax,[d]
neg eax
add eax,esi ;-d+a*b+a*(c+d)
mov [e],eax
 
section '.edata' export data readable ; объявление секции экспорта
export 'lab3.1.DLL',\ ; перечисление экспортируемых точек входа
         func1, 'func1'
 
data fixups  ; объявление секции релокаций символов
end data
Добавлено через 27 секунд
Программа.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
format PE GUI
entry start
include 'C:\Program Files\ass\include\win32a.inc'
 
start:
invoke  func1 ; зовём внешнюю процедуру из нашей DLL
 
 
 
 
 
ret
 
section '.idata' import data readable writeable ; объявление секции импорта
library mydll, 'C:\Program Files\lab3.1.DLL' ; указание импортируемой библиотеки
import mydll,\ ; для указанной библиотеки
        func1, 'func1' ; перечисление импортируемых символов из неё
Добавлено через 56 секунд
Еще нужно сделать тоже самое только с соглашением вызова cdecl,не подскажите как ? Спасибо !
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2018, 19:28
Ответы с готовыми решениями:

можно ли вызвать в VB процедуру из 32-разрядной DLL?
Кто-нибудь знает можно ли вызвать в VB процедуру из 32-разрядной DLL, а из нее в свою очередь...

Как вызвать процедуру в dll из службы
Пробую так, в приложении все работает, в службе нет var LibHandle: THandle; fExtract:...

Как вызвать с помощью команды Calli(MSIL) процедуру из unmanaged DLL
Задача в том чтобы написать на MSIL процедуру вызова функции из unmanaged DLL не прибегая к...

Как сохранить форму в dll и потом вызвать её из проэкта к которому подключена эта dll?
Как сохранить форму в dll и потом вызвать её из проэкта к которому подключена эта dll?

4
Модератор
Эксперт по электронике
8516 / 4370 / 1648
Регистрация: 01.02.2015
Сообщений: 13,577
Записей в блоге: 9
25.11.2018, 21:15 2
Лучший ответ Сообщение было отмечено Nord0102033 как решение

Решение

Посмотрите статью
Пишем DLL на FASM'e

А про передачу параметров в процедуру - нужно среди параметров макроса proc искать тип соглашения о передаче параметров. Поищите в описании proc - я совсем не знаю FASM.
1
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
26.11.2018, 13:58 3
Nord0102033, в строке(9) библиотеки поставь MOV EAX,1 а не ebx
и оформи нормально функцию func1, чтобы в конце был выход по RET
1
1 / 1 / 0
Регистрация: 01.10.2017
Сообщений: 56
26.11.2018, 14:45  [ТС] 4
R71MT, что значит оформи нормально функцию ,вообщем? или только ret добавить?

Добавлено через 15 секунд
Спасибо!
0
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
26.11.2018, 17:43 5
Лучший ответ Сообщение было отмечено Nord0102033 как решение

Решение

Цитата Сообщение от Nord0102033 Посмотреть сообщение
или только ret добавить?
формат описания fasm-функции без аргументов:
Assembler
1
2
3
4
5
6
7
8
proc   func1
       nop
;[....]
       ret
endp
;======== так она выглядит в отладчике:
00362006 >   90             NOP
00362007   . C3             RETN
по сути это cdecl-функция, код которой не очищает стек сам.
если ты добавишь в её описание пару аргументов, то fasm автоматом сгенерит stdcall, который будет очищать за собой стек:
Assembler
1
2
3
4
5
6
7
8
9
10
11
proc   func1  arg1,arg2
       nop
;[....]
       ret
endp
;======== так она выглядит в отладчике:
00362006 >/$ 55             PUSH  EBP
00362007  |. 89E5           MOV   EBP,ESP
00362009  |. 90             NOP
0036200A  |. C9             LEAVE
0036200B  \. C2 0800        RETN 8         ;<-- очищает стек от двух аргументов
т.е. fasm при трансляции исходника сам проверяет кол-во аргументов и подставляет в RETN нужное значение - в данном случае 2*4=8. Если при вызове такой функции ты подсунешь ей 1 или 3 аргумента (но не 2, как нужно), то программа выдаст ошибку. Здесь нужно следить за кол-вом аргументов..

Этим отличается первый/cdecl вариант, где в зависимости от кол-ва переданных аргументов ты сам очищаешь стек уже после того, как функция вернёт тебе управление по RETN. Пример её вызова с двумя аргументами из библиотеки будет выглядеть так:
Assembler
1
2
     invoke  func1,[a],[b]
     retn    8
и переменные a,b,c,d,e вытащи из библиотеки - нечего им там делать.
в DLL'ках лучше хранить только константы, или неинициализированные данные.
для хранения промежуточных данных советуют пользоваться или регистрами, или локальным фреймом в стеке.
1
26.11.2018, 17:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2018, 17:43
Помогаю со студенческими работами здесь

Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова?
Можно ли из ASP как-то вызвать dll, чтобы результат её (dll) работы вставился в место вызова?...

Inject dll, а также вызов функции из этой же dll
Всем привет, заинжектить dll в другой процесс получилось, но еще необходимо вызвать функцию в этой...

Как из DLL, в котором есть только DllGetClassObject, обратиться к методу, который должен быть в этой DLL?
Есть метод ITaskbarList3::SetProgressState, он предназначен для того, чтобы в значке программы...

Создать DLL на С++ и вызвать ее функции
Здравствуйте, в общем пытаюсь это сделать, но после компиляции не могу найти библиотеку ))), куда...


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

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