No ACL setup yet! Denying access to everyone.
pl:edu:zmitac:n1z:ja:lab2
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| pl:edu:zmitac:n1z:ja:lab2 [2021/04/03 19:01] – [Biblioteka asemblerowa dll] ktokarz | pl:edu:zmitac:n1z:ja:lab2 [2021/04/10 17:06] (current) – [Instalacja środowiska Visual Studio Community 2019 i konfiguracja do tworzenia bibliotek dll napisanych w MASM.] pczekalski | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Instalacja środowiska Visual Studio Community 2019 i konfiguracja do tworzenia bibliotek dll napisanych w MASM. ====== | + | ====== |
| ===== Instalacja ===== | ===== Instalacja ===== | ||
| Line 164: | Line 164: | ||
| </ | </ | ||
| - | Często chcemy wykorzystać przekazane do funkcji parametry. Przypomnijmy, | + | Często chcemy wykorzystać przekazane do funkcji parametry. Przypomnijmy, |
| + | |||
| + | < | ||
| + | ... | ||
| + | MyProc proc | ||
| + | mov RAX, RCX | ||
| + | add RAX, RDX | ||
| + | ret | ||
| + | MyProc endp | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | Argumenty typu zmiennoprzecinkowego należy przekazać przez rejestry XMM0 i XMM1, a wynik zwrócić przez XMM0. Oczywiście należy użyć instrukcji rozszerzeń MMX/SSE. | ||
| + | |||
| + | < | ||
| + | ... | ||
| + | FloatProc PROC | ||
| + | addsd xmm0, xmm1 | ||
| + | ret | ||
| + | FloatProc ENDP | ||
| + | ... | ||
| + | </ | ||
| ==== Odwołanie do biblioteki dll z programu C++ ==== | ==== Odwołanie do biblioteki dll z programu C++ ==== | ||
| Line 172: | Line 193: | ||
| - Odczytać aktualny adres interesującej nas funkcji wywołując GetProcAddress, | - Odczytać aktualny adres interesującej nas funkcji wywołując GetProcAddress, | ||
| - Użyć funkcji odwołując się do jej adresu. | - Użyć funkcji odwołując się do jej adresu. | ||
| + | Przykładowy kod mógłby wyglądać tak: | ||
| < | < | ||
| Line 182: | Line 204: | ||
| { | { | ||
| dllHandle = LoadLibrary(TEXT(" | dllHandle = LoadLibrary(TEXT(" | ||
| - | std::cout << "Hello World!\n"; | ||
| MyProc procedura = (MyProc)GetProcAddress(dllHandle, | MyProc procedura = (MyProc)GetProcAddress(dllHandle, | ||
| std::cout << procedura(); | std::cout << procedura(); | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | Użycie funkcji z parametrami wymaga nieco zmodyfikowanych definicji typu. Należy także zwrócić uwagę na typ wartości zwracanej przez funkcję. Pamiętać należy, że w przypadku liczb zmiennoprzecinkowych, | ||
| + | |||
| + | < | ||
| + | ... | ||
| + | typedef int(_stdcall* MyProc)(int, | ||
| + | typedef double(_stdcall* FloatProc)(double, | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | ==== Zadanie do zrealizowania w ramach laboratorium ==== | ||
| + | Należy napisać bibliotekę DLL w asemblerze i program w C++ demonstrujący działanie tej biblioteki.\\ | ||
| + | **Biblioteka DLL** ma udostępniać funkcje wykonujące i zwracające wynik podstawowych obliczeń arytmetycznych (dodawanie, odejmowanie, | ||
| + | **Program w C++** ma wywoływać wszystkie funkcje przekazując przykładowe wartości parametrów i wyświetlić wyniki na ekranie. Nie jest wymagany interfejs użytkownika - wartości do obliczeń mogą być umieszczone w kodzie programu. | ||
| + | |||
pl/edu/zmitac/n1z/ja/lab2.1617469263.txt.gz · Last modified: by ktokarz
