Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложение векторов на ASM 
:(
    Опции темы
x8m6
Дата 5.10.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Потребовалось написать функцию сложения векторов на Ассемблере. Использую инлайн ассемблер, встроенный в MSVS:
Код

void addition(){
  
       int n = 4;
     __declspec(align(16)) double* a = new double[n];
     __declspec(align(16)) double* b = new double[n];
     __declspec(align(16)) double* c = new double[n];
    
    for (int i = 0;i<n;i++) {
       a[i] = i;
       b[i] = i*2;
       c[i] = 0.0;
    }
    // C = A + B
    
    __asm{
        mov eax,a
        mov ebx,b
        mov edx,c
        xorps ecx,ecx
    }
    
    for (int i = 0;i<n;i+=2){        
       __asm{        
          movapd xmm0,[eax+ecx] // Ошибка при выполнении программы нет доступа при чтении
          movapd xmm1,[ebx+ecx]        
          addpd xmm0,xmm1
          movapd [edx+ecx],xmm0
          add ecx,16
     }
    
    
    }


Что я не правильно делаю?

Это сообщение отредактировал(а) x8m6 - 5.10.2009, 12:47
PM MAIL   Вверх
Mikl_
Дата 6.10.2009, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



x8m6, для получения адреса переменной A используй команды lea eax,A или mov eax, offset A 
если содержимое A[0] равно нулю, то после команды mov eax,A регистр eax=0, содержимое ecx  ты обнулил самостоятельно командой xorps ecx,ecx (хотя правильнее xor ecx,ecx или sub ecx,ecx) в результате попытки чтения по нулевому адресу 
movapd xmm0,[eax+ecx] получаешь "Ошибка при выполнении программы нет доступа при чтении" доступ на чтение нулевых адресов имеет только операционная система  smile 

PM MAIL   Вверх
x8m6
Дата 6.10.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я немного переписал код. Теперь он выглядит так:
Код

void addition(){
   int n = 4; 
     __declspec(align(16)) double* a = new double[n];
     __declspec(align(16)) double* b = new double[n];
     __declspec(align(16)) double* c = new double[n];
    
    for (int i = 0;i<n;i++) {
       a[i] = i+1;
       b[i] = i+1;
       c[i] = 0.0;
    }
    // C = A + B
    
    _asm{ 
          lea eax,a ; загрузить адрес начала массива a в eax
          lea ebx,b ; загрузить адрес начала массива b в ebx
          lea edx,c    ; загрузить адрес начала массива c в edx
          mov esi,0
          mov ecx,n

      L1:
          movapd xmm0,xmmword ptr[eax+esi]
          movapd xmm1,xmmword ptr[ebx+esi]     
          addpd xmm0,xmm1
           movapd xmmword ptr[edx+esi],xmm0
          add esi,16
          sub ecx,2  ; ecx = ecx - 2
      jnz L1 ; если ecx!=0 прыжок в L1
                                     
    }
}

При дебаге  вылетает ошибка Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.

Это сообщение отредактировал(а) x8m6 - 6.10.2009, 12:56
PM MAIL   Вверх
sgi1981
Дата 6.10.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void addition(){
   int n = 2; 
   double* a = new double[n << 1];
   double* b = new double[n << 1];
   double* c = new double[n << 1];
    
    for (int i = 0; i < (n << 1); i++) {
       a[i] = i+1;
       b[i] = i+1;
       c[i] = 0.0;
    }
    // C = A + B
    
    _asm{ 
          mov eax,a ; загрузить указатель a в eax
          mov ebx,b ; загрузить указатель b в ebx
          mov edx,c ; загрузить указатель c в edx
          mov esi,0
          mov ecx,n

      L1:
          jecxz L2;
          movupd xmm0,xmmword ptr[eax+esi]
          movupd xmm1,xmmword ptr[ebx+esi]     
          addpd xmm0,xmm1
          movupd xmmword ptr[edx+esi],xmm0
          add esi,16
      loop L1 ; если ecx!=0 прыжок в L1
      L2:                               
    }
}



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


Опытный
**


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

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



x8m6, "Stack around the variable 'c' was corrupted." не мудрено, "с" в ассемблере директива, назови переменную с1 или с_ и будет тебе счастье  smile 
PM MAIL   Вверх
x8m6
Дата 7.10.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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


 




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


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

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