User Tools

Site Tools


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.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
pl:edu:zmitac:n1z:ja:lab2 [2021/04/03 19:01] – [Biblioteka asemblerowa dll] ktokarzpl: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. ======+====== Ćwiczenie 2: Instalacja środowiska Visual Studio Community 2019 i konfiguracja do tworzenia bibliotek dll napisanych w MASM. ======
 ===== Instalacja ===== ===== Instalacja =====
  
Line 164: Line 164:
 </code> </code>
  
-Często chcemy wykorzystać przekazane do funkcji parametry. Przypomnijmy, że w 64-bitowej konwencji wywołań pierwsze cztery parametry są umieszczane bezpośrednio w rejestrach procesora. Szczegóły są opisane w instrukcji do pierwszego ćwiczenia [[pl:edu:zmitac:n1z:ja:lab1#powtorka_z_teoriifunkcje_i_ich_wywolywanie_z_poziomu_assemblera]]. I tak, dwa parametry typu całkowitego są umieszczone w rejestrach RCX i RDX. +Często chcemy wykorzystać przekazane do funkcji parametry. Przypomnijmy, że w 64-bitowej konwencji wywołań pierwsze cztery parametry są umieszczane bezpośrednio w rejestrach procesora. Szczegóły są opisane w  [[pl:edu:zmitac:n1z:ja:lab1#powtorka_z_teoriifunkcje_i_ich_wywolywanie_z_poziomu_assemblera|instrukcji do pierwszego ćwiczenia]]. I tak, dwa parametry typu całkowitego są umieszczone w rejestrach RCX i RDX. Funkcja, któa zwraca sumę dwóch argmentów całkowitych wyglądałaby w następujący sposób. 
 + 
 +<code> 
 +... 
 +MyProc proc 
 +mov RAX, RCX 
 +add RAX, RDX 
 +ret 
 +MyProc endp 
 +... 
 +</code> 
 + 
 +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. 
 + 
 +<code> 
 +... 
 +FloatProc PROC 
 +addsd xmm0, xmm1 
 +ret 
 +FloatProc ENDP 
 +... 
 +</code>
 ==== 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:
  
 <code> <code>
Line 182: Line 204:
 { {
     dllHandle = LoadLibrary(TEXT("JaAsm.dll"));     dllHandle = LoadLibrary(TEXT("JaAsm.dll"));
-    std::cout << "Hello World!\n"; 
     MyProc procedura = (MyProc)GetProcAddress(dllHandle, "MyProc");     MyProc procedura = (MyProc)GetProcAddress(dllHandle, "MyProc");
     std::cout << procedura();     std::cout << procedura();
 } }
 </code> </code>
 +
 +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, rozmiar rejestrów XMM0, XMM1 to 64 bity. Odpowiada to wartości zmiennoprzecinkowej podwójnej precyzji, czyli w języku C++ typowi "double".
 +
 +<code>
 +...
 +typedef int(_stdcall* MyProc)(int, int);
 +typedef double(_stdcall* FloatProc)(double, double);
 +...
 +</code>
 +
 +==== 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, mnożenie i dzielenie) na parach liczb przekazanych jako parametry ich wywołania. Funkcje powinny mieć wersję stało- i zmiennoprzecinkową (w sumie osiem funkcji).\\
 +**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