Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
B9
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 5
#1

Не могу запустить ассемблерную вставку на c++ - C++

16.12.2012, 15:13. Просмотров 401. Ответов 6
Метки нет (Все метки)

Вставка находит скалярное произведение двух векторов, помогите запустить

C++
1
2
3
4
5
6
7
8
9
10
11
12
__asm
{
    movaps      xmm0, xmmword ptr[A]    // 0 | A.z | A.y | A.x
    movaps      xmm1, xmmword ptr[B]    // 0 | B.z | B.y | B.x
    mulps       xmm0, xmm1              // 0 | A.z*B.z | A.y*B.y | A.x*B.x
    movhlps     xmm1, xmm0      // ? | ? | 0 | A.z*B.z
    unpcklps    xmm0, xmm0      // A.y*B.y | A.y*B.y | A.x*B.x | A.x*B.x
    movhlps     xmm2, xmm0      // ? | ? | A.y*B.y | A.y*B.y
    addss       xmm0, xmm1      // ? | ? | ? | A.x*B.x+A.z*B.z
    addss       xmm0, xmm2      // ? | ? | ? | A.x*B.x+A.y*B.y+A.z*B.z
    movss       dword ptr[dot], xmm0
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2012, 15:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу запустить ассемблерную вставку на c++ (C++):

Как сделать ассемблерную вставку на с++? - C++
Вроде бы ничего нет сложного, код очень простой, и много где есть, но не идет код У меня c++ BorlandC 3.0, ассемблер MASM использую. Взял...

Как сделать ассемблерную вставку? - C++
Нужно сложить два числа. Не могу понять ошибки вроде примеры смотрел вставки делаются именно так #include <iostream> #include <stdio.h>...

Нужно переделать С++ функцию на ассемблерную вставку - C++
Вот у меня имеется функция,осуществляющая реверс строки на С++ void reverse(const char *s) { if (s && *s) { int l; for (l =...

Сделать из assembler кода ассемблерную вставку в C++ - C++
У меня есть код в ассемблере, мне надо его сделать ассемблерной вставкой, чтоб он работал вот код include \masm32\include\masm32rt.inc...

Помогите написать очень маленькую ассемблерную вставку - C++
я слышал что по новым стандартам вот такая конструкция не работает int n; cin >> n; int m пишет размер статистического масива...

пишу программу на С++, и делаю в ней ассемблеровскую вставку. Возможно ли в этой _asm вставке сделать С++ вставку? - C++
Я пишу программу на С++, и делаю в ней ассемблеровскую вставку. Возможно ли в этой _asm вставке сделать С++ вставку? Если да, то как?

6
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,386
Записей в блоге: 2
Завершенные тесты: 1
16.12.2012, 17:37 #2
Цитата Сообщение от B9 Посмотреть сообщение
Не могу запустить ассемблерную вставку на c++
А что значит "не могу запустить"? В чем именно проблема?
Кстати Visual Studio на 64 битной платформе не поддерживает inline assembler, поэтому если у тебя именно студия на 64 битах, то проблема в этом.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
16.12.2012, 17:43 #3
Цитата Сообщение от B9 Посмотреть сообщение
movhlps
это что за мнемоника?
Цитата Сообщение от B9 Посмотреть сообщение
movaps
и это?
Цитата Сообщение от B9 Посмотреть сообщение
addss
да и это тоже?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.12.2012, 17:46 #4
Цитата Сообщение от taras atavin Посмотреть сообщение
да и это тоже?
Команды для работы с SSE-регистрами.


Цитата Сообщение от B9 Посмотреть сообщение
помогите запустить
Полностью код функции нарисуй.
0
B9
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 5
16.12.2012, 20:19  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <time.h>
#include <iostream>
 
int Scalar(short* Vector1, short* Vector2, int count)
{
 int iSum;
float dot;
// считаем, что четвертый элемент каждого вектора равен нулю
__asm
{
    movaps      xmm0, xmmword ptr[Vector1]    // 0 | A.z | A.y | A.x
    movaps      xmm1, xmmword ptr[Vector2]    // 0 | B.z | B.y | B.x
    mulps       xmm0, xmm1              // 0 | A.z*B.z | A.y*B.y | A.x*B.x
    movhlps     xmm1, xmm0      // ? | ? | 0 | A.z*B.z
    unpcklps    xmm0, xmm0      // A.y*B.y | A.y*B.y | A.x*B.x | A.x*B.x
    movhlps     xmm2, xmm0      // ? | ? | A.y*B.y | A.y*B.y
    addss       xmm0, xmm1      // ? | ? | ? | A.x*B.x+A.z*B.z
    addss       xmm0, xmm2      // ? | ? | ? | A.x*B.x+A.y*B.y+A.z*B.z
    movss       dword ptr[dot], xmm0
}
 
 return iSum;
}
 
int main()
{
 const int  n = 10000000;
 short *Vector1 = new short[n];
 short *Vector2 = new
short[n];
 int i;
 
 srand((unsigned int)time(0));
 for(i=0;i<n;i++)
 {
  Vector1[i] = rand()%2000 - 1000;
  Vector2[i] = rand()%2000 - 1000;
 }
 
 int iSum=Scalar(Vector1, Vector2, n);
 
 delete []Vector1;
 delete []Vector2;
 return 0;
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.12.2012, 07:56 #6
Ты помещаешь результат в dot, а возвращаешь iSum.
Код не проверял пока что.

Добавлено через 9 минут
Теперь кратко по коду - работать в таком виде он не будет:
1. movaps принимает данные типа float, ты же передаёшь short
2. Для этих функций данные должны быть выровненными (на 16 байт, кажется, но лучше уточнить для конкретной платформы). Т.е. нельзя использовать new, нужно либо выравнивать при выделении на стэке, либо aligned_malloc/aligned_free использовать (название переврал, ищи в гугле)
3. XMM регистры всего лишь по 128 бит, поэтому массив в 10000000 элементов в них не влезет, а цикла у тебя не предусмотрено.
0
Kastaneda
Jesus loves me
Эксперт С++
4697 / 2901 / 238
Регистрация: 12.12.2009
Сообщений: 7,386
Записей в блоге: 2
Завершенные тесты: 1
17.12.2012, 11:21 #7
И если вместо short сделать double (а не float), то нужно испльзовать SSE2, а не SSE. Там отличия в том, что в SSE XMM регистры трактуются как 4 * 32 (4 значения по 32 бита), а в SSE2 как 2 * 64 (ну отличия конечно не только в этом)).
0
17.12.2012, 11:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2012, 11:21
Привет! Вот еще темы с ответами:

Не могу запустить g++ - C++
Добрый день, только что установила MinGW для win32, пробовала прописывать путь до папки C:\MinGW\bin в системные переменные Path или...

не могу запустить программу - C++
Ребята помогите!!!! никак не могу запустить программу все время ругaется на &quot;global.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Не могу запустить программу - C++
Делаю лабораторную работу, есть программа которая тупо скопирована с методички #include &quot;stdafx.h&quot; #include &lt;string&gt; #include...

Не могу запустить следующий код - C++
class Tokenizer { private: string content; string delims; size_t npos; public: //constructors and destructors...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.