Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > dll, регистры mmx


Автор: kleinengel 23.11.2009, 18:14
Надо написать программу на "чистом" Си и с использованием ассемблера. 
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? 

Автор: sgi1981 23.11.2009, 20:13
Но у вас же результат не записывается в память.

Автор: kleinengel 23.11.2009, 20:27
точно. спасибо, sgi1981 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)