Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // asm library-----
- public myFunc
- public Summ
- _TEXT segment
- DllMain proc
- mov rax, 2
- ret 12
- DllMain endp
- ; myFunc принимает 5 аргументов, ВМ вроде говорил что это надо, но у меня не проверял, если что надо будет посмотреть
- ; куда кладутся эти аргументы (4 в регистры, остальные в стек),
- ; делать это через дизассемблерный? код в клиенте (alt+8 в режиме отладки)
- myFunc proc export
- mov rax, 0
- add rax, rcx
- add rax, rdx
- mov ecx, r8d
- mov edx, r9d
- add rax, rcx
- add rax, rdx
- add rax, qword ptr[rsp+28h]
- ret
- myFunc endp
- ; void Summ(int a, int b)
- ; rcx input
- ; rdx 2nd input
- ; Summ - название функции, все что после Summ proc export и до ret - тело функции (2 строчки без комента),
- ; здесь выполняется простое сложение
- ; переделайте под что-то свое
- ; еще такой момент, по идее аргументы кладутся в rcx, rdx, r8d, r9d, но у меня дизасм показывал, что кладутся в ecx, edx,
- ; поэтому здесь 2 строки закоменчены, пробовать нужно обе
- ; делаем библу и клиент на 64х
- Summ proc export
- ;add rcx, rdx
- ;mov rax, rcx
- add ecx, edx
- mov eax, ecx
- ret
- Summ endp
- _TEXT ends
- end
- // client asm-----
- // задание: сравнить время работы функции написанной на asm(sum) и функции на сишке(int summa), асм должен быть в 2-3 раза быстрее
- #include <Windows.h>
- #include <iostream>
- using namespace std;
- typedef int (WINAPI* Summ)(int, int);
- typedef int (WINAPI* MyFunc)(int, int, int, int, int);
- int summa(int a, int b) {
- return a + b;
- }
- int main()
- {
- HMODULE hModule;
- hModule = LoadLibrary(TEXT("asm_library.dll"));
- if (hModule == NULL) return -1;
- Summ sum;
- sum = (Summ)GetProcAddress(hModule, "Summ");
- MyFunc fun = (MyFunc)GetProcAddress(hModule, "myFunc");
- int k;
- int start_time = clock();
- for (int i = 0; i < 100000000; i++)
- {
- k = sum(5, 2);
- }
- int end_time = clock();
- cout << end_time - start_time << " time of asm" << endl;
- int d;
- int start_time1 = clock();
- for (int i = 0; i < 100000000; i++)
- {
- d = summa(5, 2);
- }
- int end_time1 = clock();
- cout << end_time1 - start_time1 << " time of c++" << endl;
- fun(1, 1, 1, 1, 1);
- FreeLibrary(hModule);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement