purebasic.info

PureBasic forum
Текущее время: Вс фев 25, 2018 4:59 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 26, 2010 11:51 am 
Не в сети
доцент

Зарегистрирован: Сб мар 10, 2007 3:50 pm
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Кто нибуть работал в пурике с инструкциями SSE ? Есть у каво нибуть маленький пример? Больше интересует как запихнуть вектор в регистор и наобарот


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс сен 26, 2010 5:29 pm 
Не в сети
доцент

Зарегистрирован: Сб мар 10, 2007 3:50 pm
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Нашёл вычисление дистанции между 2 точками на плоскости с помощью sse3. Этот код мне никак не раскрывает глаза на работу sse. Тут похоже с помощью dqword передаётся сразу 128 бит начиная от адреса переменной PosX1. Я прав? Может я не туда лезу с моими мизерными познаниями асамблера?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Global PosX1.f=300
Global PosX2.f=400
Global PosY1.f=750
Global PosY2.f=900
Global Result1.f
Global Result2.f
Global Result3.f
 
Macro DistanceSSE3()         ;benotigt SSE3
!movupd xmm0,dqword[v_PosX1]
!hsubps xmm0,xmm0
!mulps xmm0,xmm0
!haddps xmm0,xmm0
!sqrtss xmm0,xmm0
  ;!rsqrtss xmm0,xmm0        ;kann sqrtss ersetzen, wenn?s nicht so genau sein mu?
  ;!rcpss xmm0,xmm0
!movss dword[v_Result3],xmm0
EndMacro



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн сен 27, 2010 11:58 am 
Не в сети
доцент

Зарегистрирован: Сб мар 10, 2007 3:50 pm
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Всемогущий Яндекс (не гугл) и метод научного тыка помогли мне более менее разобраться в этом насущном вопросе, который не оставил в стороне никаво. Итак чтобы занести в один из восьми регистров xmm наш вектор из 4 элементов float нужно сделать так чтобы в памяти они (4 элемента) шли подрят. Проще всего сделать это простой структурой. И потом занести в нужнгый регистр с помощью dqword (128 бит)

Код:
1
2
3
4
5
6
7
8
9
10
11
12
Structure vec4
a0.f
a1.f
a2.f
a3.f
EndStructure
 
b.vec4
 
!movupd xmm0,dqword[v_b]
 
 



Можно и масивом пихнуть сразу 4 элемента в регистор, но нужно предварительно состряпать в отдельную переменную указатель на первый из 4 элементов масива и с помощью указателя пихнуть это в регистор.


Код:
1
2
3
4
5
6
Dim r.f(3)
 
p=@r(0)
 
!MOV eax, dword[v_p]
!movupd xmm0,[eax]



Выводить значения можно также как и занесли

Код:
1
!movupd dqword[v_dk],xmm0



Если комуто мало заносить и выводить значения из регистра пускай идёт и смотрит описание инструкций SSE.
Как я понял sse потдерживается большинством (если не все) процесоров интел и амд (хотя у них есть 3dnow!)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 28, 2010 5:18 am 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
MMX SSE SSE2

Некоторые инструкции требуют выровненной памяти на 16 байт, мона париться с указателями в памяти или в секции, как удобней :)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
Global Result.f 
!MOVAPD xmm0,dqword[asd]
!hsubps xmm0,xmm0
!mulps xmm0,xmm0
!haddps xmm0,xmm0
!sqrtss xmm0,xmm0
!movss dword[v_Result],xmm0
Debug Result
End
!section '.data1' data align 16
!dd 0        ;для примера портим выровненость :)
!align 16    ;возвращаем как было
!asd dd 300.0, 400.0, 750.0, 900.0



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт сен 28, 2010 11:55 am 
Не в сети
доцент

Зарегистрирован: Сб мар 10, 2007 3:50 pm
Сообщений: 35
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
puremaster Это всё очень интересно и позновательно, и главное вовремя.

Как я понял выравнивание требует только MOVAPD и тому подобные копирования. movupd не нуждается в этом.
haddps/hsubps это горизонтальное складывание/вычитание, инструкция из SSE3.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 12:37 pm 
Не в сети
студент

Зарегистрирован: Вс мар 16, 2014 12:32 pm
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Как перевести

Код:
1
2
3
4
5
6
7
rp_in   RESTOREPOINTINFO
.....
        mov eax, dword [rp_in.llSequenceNumber+0]
        mov edx, dword [rp_in.llSequenceNumber+4]
        mov dword [rp_in.llSequenceNumber+0], eax
        mov dword [rp_in.llSequenceNumber+4], edx
 



в PureBasic? Стопорнул на этом:

Код:
1
2
3
4
5
6
7
rp_in.RESTOREPOINTINFO
.....
!       MOV eax, dword [p.v_rp_in\llSequenceNumber+0]
!       MOV edx, dword [p.v_rp_in\llSequenceNumber+4]
!       MOV dword [p.v_rp_in\llSequenceNumber+0], eax
!       MOV dword [p.v_rp_in\llSequenceNumber+4], edx
 


Цитата:
---------------------------
PureBasic - Assembler error
---------------------------
PureBasic.asm [227]:

MOV eax, dword [p.v_rp_in\llSequenceNumber+0]

error: invalid address.


---------------------------
ОК
---------------------------


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 12:54 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 404
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Dartess, ты код, не правильно перевел, предоставь полный код для перевода.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 1:02 pm 
Не в сети
студент

Зарегистрирован: Вс мар 16, 2014 12:32 pm
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Я предоставил только ту часть, с которой у меня возник вопрос))

Есть структура rp_in типа RESTOREPOINTINFO

Есть кусок кода
Код:
1
2
3
4
   mov eax, dword [rp_in.llSequenceNumber+0]
   mov edx, dword [rp_in.llSequenceNumber+4]
   mov dword [rp_in.llSequenceNumber+0], eax
   mov dword [rp_in.llSequenceNumber+4], edx


Его нужно перевести на инлайнасм пурика.

Создаю в пурике структуру (т.к. она вроде есть, но у неё нет нужных членов
Код:
1
2
3
4
5
6
Structure RESTOREPOINTINFO
  dwEventType.l
  dwRestorePtType.l
  llSequenceNumber.q
  szDescription.s{#MAX_DESC}
EndStructure


Создаю экземпляр
Код:
1
rp_in.RESTOREPOINTINFO


пытаюсь перевести код
Код:
1
2
3
4
5
6
EnableASM
!       MOV eax, dword [p.v_rp_in\llSequenceNumber+0]
!       MOV edx, dword [p.v_rp_in\llSequenceNumber+4]
!       MOV dword [p.v_rp_in\llSequenceNumber+0], eax
!       MOV dword [p.v_rp_in\llSequenceNumber+4], edx
DisableASM



Получаю, соответственно, ошибку. Пробовал по разному писать, не догоняю, как нужно...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 1:24 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11081
Благодарил (а): 4 раз.
Поблагодарили: 386 раз.
Переводится так:
Код:
1
2
rp_in.RESTOREPOINTINFO
rp_in\llSequenceNumber = rp_in\llSequenceNumber

Только логики никакой в этой конструкции.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 1:44 pm 
Не в сети
студент

Зарегистрирован: Вс мар 16, 2014 12:32 pm
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр, но мне нужно в инлайн асм перевести, а не на чистый пб :С это не весь код, который нужно перевести. Весь код не хотелось бы переводить, т.к. он не мой, да и смысла в этом нет, к сути вопроса он не относится.

p.s. в чём смысл перегонки назад свежепереданных значений не знаю, но нужно, чтобы они были в регистрах, видимо.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 1:57 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 146
Благодарил (а): 73 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
смысл в том, чтобы засунуть число размера q в два регистра, да ещё чтобы число находилось в структуре.
есть два кода, может, они чем-то помогут:
rp.Point
rp\x=2
rp\y=3
MOV eax, rp\x
MOV edx, rp\y
MOV rp\x, edx
MOV rp\y, eax
Debug rp\x
Debug rp\y

Procedure _GetSelfName()
!MOV eax, [fs:$30]
!MOV eax, [eax+0x0C]
!MOV eax, [eax+0x14]
!MOV ecx, [eax+0x24] ;Length
!MOV eax, [eax+0x28] ;Buffer(Unicode btw)
ProcedureReturn
EndProcedure
второй код:
Procedure.s GetSelfName()
ProcedureReturn PeekS(_GetSelfName(), -1, #PB_Unicode)
EndProcedure
OpenConsole()
PrintN(GetSelfName())
Input()
Думаю, что можно как то сделать и со структурой. Заодно тоже задам вопрос: как просматривать содержимое
регистра в любой момент? Приходится запускать odbg или копировать в переменные. А без этого нельзя?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 2:03 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11081
Благодарил (а): 4 раз.
Поблагодарили: 386 раз.
Если записать так
Код:
1
2
EnableASM
MOV eax, rp_in\llSequenceNumber

то в eax запихивается не dword, а qword
Код:
1
2
LEA ebp,[v_rp_in]
MOV eax, qword [ebp+8]

на что конечно ругается FASM.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 2:04 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 146
Благодарил (а): 73 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
быть может, последние две строчки должны быть:
! MOV dword [p.v_rp_in\llSequenceNumber+0], edx
! MOV dword [p.v_rp_in\llSequenceNumber+4], eax
то есть, обменять местами старшую и младшую части rp_in\llSequenceNumber используя для этого регистры.
В PB ведь нет команд для выделения нижней и верхней частей в d и q? Хотя, кажется, видел в библиотеках команды Low и high..


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 2:45 pm 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 404
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Dartess, так пойдет?
Код:
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
Structure RESTOREPOINTINFO
  dwEventType.l
  dwRestorePtType.l
  llSequenceNumber.q
  szDescription.s{12}
EndStructure
 
rp_in.RESTOREPOINTINFO
rp_in_1.RESTOREPOINTINFO
 
rp_in\llSequenceNumber = 567567657567657
rp_in\dwEventType = 5
 
EnableASM
!Lea eax, [v_rp_in]
!Lea ecx, [v_rp_in_1]
!MOV ebx,dword [eax+8]
!MOV dword [ecx+8],  ebx
!MOV ebx,dword [eax+12]
!MOV dword [ecx+12], ebx
DisableASM
 
 Debug rp_in\dwEventType
 Debug rp_in\llSequenceNumber
 Debug rp_in_1\dwEventType
 Debug rp_in_1\llSequenceNumber



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PureBasic и AsmInline
СообщениеДобавлено: Вс мар 16, 2014 2:58 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 370
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Ну если писать на асме, то всё
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
!struc RESTOREPOINTINFO
!{
!.dwEventType dd ?
!.dwRestorePtType dd ?
!.llSequenceNumber dq ?
!}
 
rp_in = $403000
 
!MOV ESI, DWORD [v_rp_in] ; или !LEA ESI, DWORD [v_rp_in]смотря что в rp_in, адрес структуры, или адрес указателя на структуру
!rp_in RESTOREPOINTINFO
!MOV eax, dword [ESI + rp_in.llSequenceNumber]
!MOV edx, dword [ESI + rp_in.llSequenceNumber+4]
!MOV dword [ESI + rp_in.llSequenceNumber], eax
!MOV dword [ESI + rp_in.llSequenceNumber+4], edx



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 48 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB