Надо написать программу на "чистом" Си и с использованием ассемблера. DLL на ассемблере, содержащей функцию, складывающую содержимое массивов a и b (paddusw)
| Код | .586 .XMM .MODEL FLAT PUBLIC _PADDUSW@12 .CODE
_start@12: mov al, 1 ret 12
_PADDUSW@12 PROC push ebp mov ebp, esp
; тело функции mov eax, [ebp+8] mov ecx, [ebp+0ch] mov edx, [ebp+10h] the_loop: movq mm0, [ecx] movq mm1, [edx] paddusw mm0, mm1 add ecx, 8 add edx, 8 sub eax, 4 jnz short the_loop emms
pop ebp ret _PADDUSW@12 ENDP END _start@12
|
подключение DLL в Qt
| Код | #include <iostream> #include <ctime> #include <QtGui/QApplication> #include "QLibrary" QLibrary mylib("mmx");
using namespace std; typedef unsigned int byte;
void Ass(long n, byte *a, byte *b) { typedef byte (*MyPrototype)(long n, byte *a, byte *b); MyPrototype PADDUSW = (MyPrototype) mylib.resolve("PADDUSW");// PADDUSW(n,a,b); }
//реализация на C++----------------------------------- void Cpp(long n, byte a[], byte b[], byte c[]) { int i; for(i=0;i<n;i++){ c[i]=a[i]+b[i]; if(c[i]>65535) c[i]=65535; } }
int main(int argc, char *argv[]) { long i, n=16; byte *a, *b, *c; a=new byte [n]; b=new byte [n], c=new byte [n]; srand( time(NULL)); for(i=0;i<n;i++) { a[i]=rand()%1000; b[i]=rand()%1000; } cout<<"Massiv A "; for(i=0;i<n;i++) cout<<a[i]<< " "; cout<<"\nMassiv B "; for(i=0;i<n;i++) cout<<b[i]<< " "; //подключение dll----------------- mylib.load(); cout<<"\nSumma"; Cpp(n,a,b,c); cout<<"\nC++ "; for(i=0;i<n;i++) cout<<c[i]<<" "; //--------------------------------------------------------- Ass(n,a,b); cout<<"\nAssembler "; for(i=0;i<n;i++) cout<<a[i]<< " "; free(a); free(b); getchar(); return 0; }
|
проблема в том, что суммирование не происходит. Выводит исходный массив. Может ошибка в dll? |