Работа с mmx (функция обработки массива в DLL) - Assembler
Формулировка задачи:
Всем доброго времени суток.
Есть пример создания DLL на ассемблере, содержащей функцию dMMX. Функция складывает содержимое массивов source и target, получает три параметра (размер массивов и адреса входного и выходного массивов), результат помещает в массив source.
Подскажите как решить проблему и понять что не так.
При выполнении отладки выдает сообщение с указанием на функцию.
Код DLL
Код программы на с++
Первый этап обработки исключения в "0x10001014" в "mmx.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000005".
Необработанное исключение в "0x10001014" в "mmx.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000005".
.586 ; разрешает непривилегированные ; команды Pentium .XMM ; разрешает команды SSE .MODEL FLAT, STDCALL ; задает модель памяти PUBLIC _MyFuncMMX@12 ; имя экспортируемой функции .CODE ; сегмент кода _start@12: ; точка входа в DLL mov al, 1; надо вернуть ненулевое число в EAX ret 12 ; очистить стек (передано три параметра) _MyFuncMMX@12 PROC ; заголовок функции push ebp mov ebp, esp mov eax, [ebp+8] ;в eax - размер массивов mov esi, [ebp+0Ch] ;в esi - адрес массива source mov edi, [ebp+10h] ;в edi - адрес массива target the_loop: movq mm0, [esi] ;поместить в регистр mm0 ;элемент массива source movq mm1, [edi] ;поместить в регистр mm1 ;элемент массива target paddb mm0, mm1 ;сложить регистры mm0 и mm1 add esi, 8 ;следующие 4-ре элемента add edi, 8 ;следующие 4-ре элемента sub eax, 4 ;уменьшить значения счетчика jnz short the_loop ;конец цикла? emms pop ebp ret _MyFuncMMX@12 ENDP ; завершение функции END _start@12 ; точка выхода из DLL
#include <iostream> #include <stdio.h> #include <windows.h> #include <locale> #include <time.h> #include <iomanip> using namespace std; int random(int min, int max); int random(int min, int max) { return rand()%(max - min) + min; } int main() { setlocale(LC_ALL,"Russian"); int i, n = 5, min = -120, max = 120; int *A = new int [n]; int *B = new int [n]; srand((int)time(0)); for(i=0;i<n;i++){ A[i] = random(min, max); B[i] = random(min, max); cout << setw(5) << A[i]; if(i==15){ cout<<endl; } } HINSTANCE hLib = LoadLibrary(TEXT("mmx.dll")); if (hLib != NULL) { cout << "Библиотека загружена" << endl; } typedef int (__stdcall *_MyFuncMMX)(int* ,int* ,int ); _MyFuncMMX funcMMX = (_MyFuncMMX)GetProcAddress(hLib, "_MyFuncMMX"); if (!funcMMX) { cout << "Не найдена функция '_MyFuncMMX'!\n\n" << endl; } else { funcMMX(A,B,n); // for(i=0;i<n;i++) // { // cout << setw(2) << A[i]; // if(i==15){ cout<<endl; } // } } delete [] A; delete [] B; FreeLibrary(hLib); // Освобождаем библиотеку system("pause"); return 0; }
Решение задачи: «Работа с mmx (функция обработки массива в DLL)»
textual
Листинг программы
push ebp
Объяснение кода листинга программы
push ebp
- в стековую память записывается значение регистра ebp, который содержит указатель на базу данных. Это необходимо для сохранения контекста работы процессора и корректного завершения работы программы.