Advertisement
Teammasik

laba_3_EVM

Mar 25th, 2023 (edited)
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | Help | 0 0
  1. // asm library-----
  2. public myFunc
  3. public Summ
  4.  
  5. _TEXT segment
  6.  
  7.  
  8. DllMain proc
  9.  
  10. mov rax, 2
  11. ret 12
  12. DllMain endp
  13.  
  14. ; myFunc принимает 5 аргументов, ВМ вроде говорил что это надо, но у меня не проверял, если что надо будет посмотреть
  15. ; куда кладутся эти аргументы (4 в регистры, остальные в стек),
  16. ; делать это через дизассемблерный? код в клиенте (alt+8 в режиме отладки)
  17.  
  18. myFunc proc export
  19. mov rax, 0
  20. add rax, rcx
  21. add rax, rdx
  22. mov ecx, r8d
  23. mov edx, r9d
  24. add rax, rcx
  25. add rax, rdx
  26. add rax, qword ptr[rsp+28h]
  27.  
  28. ret
  29. myFunc endp
  30.  
  31. ; void Summ(int a, int b)
  32. ; rcx input
  33. ; rdx 2nd input
  34.  
  35. ; Summ - название функции, все что после Summ proc export и до ret - тело функции (2 строчки без комента),
  36. ; здесь выполняется простое сложение
  37. ; переделайте под что-то свое
  38. ; еще такой момент, по идее аргументы кладутся в rcx, rdx, r8d, r9d, но у меня дизасм показывал, что кладутся в ecx, edx,
  39. ; поэтому здесь 2 строки закоменчены, пробовать нужно обе
  40. ; делаем библу и клиент на 64х
  41.  
  42. Summ proc export
  43.  
  44. ;add rcx, rdx
  45. ;mov rax, rcx
  46.  
  47. add ecx, edx
  48. mov eax, ecx
  49.  
  50. ret
  51. Summ endp
  52. _TEXT ends
  53. end
  54.  
  55.  
  56. // client asm-----
  57. // задание: сравнить время работы функции написанной на asm(sum) и функции на сишке(int summa), асм должен быть в 2-3 раза быстрее
  58. #include <Windows.h>
  59. #include <iostream>
  60. using namespace std;
  61.  
  62. typedef int (WINAPI* Summ)(int, int);
  63. typedef int (WINAPI* MyFunc)(int, int, int, int, int);
  64.  
  65.  
  66. int summa(int a, int b) {
  67.     return a + b;
  68. }
  69.  
  70. int main()
  71. {
  72.  
  73.     HMODULE hModule;
  74.     hModule = LoadLibrary(TEXT("asm_library.dll"));
  75.  
  76.     if (hModule == NULL) return -1;
  77.  
  78.    
  79.     Summ  sum;
  80.     sum = (Summ)GetProcAddress(hModule, "Summ");
  81.     MyFunc fun = (MyFunc)GetProcAddress(hModule, "myFunc");
  82.     int k;
  83.     int start_time = clock();
  84.  
  85.     for (int i = 0; i < 100000000; i++)
  86.     {
  87.         k = sum(5, 2);
  88.     }
  89.     int end_time = clock();
  90.     cout << end_time - start_time << " time of asm" << endl;
  91.  
  92.     int d;
  93.     int start_time1 = clock();
  94.     for (int i = 0; i < 100000000; i++)
  95.     {
  96.         d = summa(5, 2);
  97.     }
  98.     int end_time1 = clock();
  99.     cout << end_time1 - start_time1 << " time of c++" << endl;
  100.     fun(1, 1, 1, 1, 1);
  101.  
  102.     FreeLibrary(hModule);
  103. }
  104.  
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement