Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dll, регистры mmx 
V
    Опции темы
kleinengel
Дата 23.11.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Надо написать программу на "чистом" Си и с использованием ассемблера. 
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? 
PM MAIL   Вверх
sgi1981
Дата 23.11.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Но у вас же результат не записывается в память.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
kleinengel
Дата 23.11.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



точно. спасибо, sgi1981 smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.