Работа с mmx (функция обработки массива в DLL) - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Есть пример создания DLL на ассемблере, содержащей функцию dMMX. Функция складывает содержимое массивов source и target, получает три параметра (размер массивов и адреса входного и выходного массивов), результат помещает в массив source. Подскажите как решить проблему и понять что не так. При выполнении отладки выдает сообщение с указанием на функцию.
Первый этап обработки исключения в "0x10001014" в "mmx.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000005". Необработанное исключение в "0x10001014" в "mmx.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000005".
Код DLL
.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

Объяснение кода листинга программы

  1. push ebp - в стековую память записывается значение регистра ebp, который содержит указатель на базу данных. Это необходимо для сохранения контекста работы процессора и корректного завершения работы программы.

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы