Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1

ASM вставка с SSE

11.02.2014, 12:23. Показов 2198. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня есть код на FASM (фрактал Мандельброта), и в нём прописана визуализация. На фасме работает быстрее, однозначно!

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
movapd  xmm0,dqword[minmax]
minpd   xmm0,dqword[minmax+16]
vhaddpd xmm2,xmm0,xmm0
movsd   xmm1,[C4096]
divsd   xmm1,xmm2
movhlps xmm0,xmm0  
@@:cvtsi2sd xmm2,[Buffer+ecx*4-4]
   subsd    xmm2,xmm0
   mulsd    xmm2,xmm1
   cvtsd2si eax,xmm2
   and      eax,4095
   mov      eax,[pal+eax*4]
   mov      [Buffer+ecx*4-4],eax
loop @b
            invoke SetDIBitsToDevice,[DC],0,0,Width,Height,0,0,0,Height,Buffer,BMInfo,0
            invoke ValidateRect,[wnd],0
            ret 16 
; определение
BMInfo       BITMAPINFOHEADER sizeof.BITMAPINFOHEADER, Width, Height, 1, 32, 0, Width*Height*4
BitmapHeader BITMAPFILEHEADER
Такой же код на Delphi:

Delphi
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
      begin
        min := MinSearch();
        max := MaxSearch();
        step := 4095 / (max + 1 - min);
        index := 0; // cnt := 0;
        ms := min * step;
        for y := 0 to maxy - 1 do
          for x := 0 to maxx - 1 do
          begin
            if (IterDat[x, y] >= max) then
            begin
              buffer[index] := 0; // red
              buffer[index + 1] := 0; // green
              buffer[index + 2] := 0; // blue
            end
            else if (IterDat[x, y] > 0) then
            begin
              ColorIndex := round((IterDat[x, y]) * step - ms) mod 4096;
              buffer[index] := pal[ColorIndex].b; // red
              buffer[index + 1] := pal[ColorIndex].g; // green
              buffer[index + 2] := pal[ColorIndex].r; // blue
            end;
            inc(index, 4)
          end;
      end;
Как мне сделать под дельфи, чтобы работало? Дельфи-то SSE не видит =(
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2014, 12:23
Ответы с готовыми решениями:

Вставка на asm
есть вставка на asm'е function Bit(Value, n: Integer): Boolean; asm bt eax, edx setc al and eax, 0FFh end; ...

asm вставка в C++
#include <iostream> int a = 10; void func( int& aIn ) { __asm { mov aIn, 15 } }

asm вставка в C++
есть код #include "stdafx.h" #include <iostream> #include <fstream> using namespace std; slozh(int* pi1, int...

7
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
12.02.2014, 17:53  [ТС]
А ориентировочно, кто может знать??? Где об этом инфу накопать можно???
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
12.02.2014, 19:08
Цитата Сообщение от SeryZone Посмотреть сообщение
Дельфи-то SSE не видит =(
SSE видит, не видит AVX или откуда там эта vhaddpd.
А так вообще компилишь функцию FASM'ом в .obj, подцепляешь к коду на Delphi ({$L...}, external). Или при желании можно в ассемблерной вставке все неизвестные инструкции через db написать.
1
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
12.02.2014, 19:55  [ТС]
Somebody, это я знаю. очень рад, что хоть ты откликнулся! Но как сделать это вызываемой процедурой с параметрами, кстати, это будет работать?
Входные параметры: min, max: dword (4 байта); палитра, думаю, одна на всех, но db #<вставка> должна ли палитру увидеть (переменную palette)? IterDat:дин. двумерный массив; maxx,maxy:integer - ширина и высота.
Выводные параметры: готовая BitMap.
Пожалуйста, подскажи, как "загнать" параметры, как это всё обустроить!
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
12.02.2014, 20:07
Цитата Сообщение от SeryZone Посмотреть сообщение
Но как сделать это вызываемой процедурой с параметрами, кстати, это будет работать?
В смысле "как"? Как любая другая процедура, только calling convention одинаковый надо. В Delphi по умолчанию параметры передаются слева направо в eax, edx, ecx, стеке (да и вообще можно посмотреть, что Delphi компилирует).
Цитата Сообщение от SeryZone Посмотреть сообщение
палитра, думаю, одна на всех, но db #<вставка> должна ли палитру увидеть (переменную palette)?
В смысле глобальная переменная? Как известно, это не айс, так что передавай как параметр.
0
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
12.02.2014, 21:54  [ТС]
Somebody, короче говоря, есть такие глобальные переменные:
Delphi
1
2
3
4
5
6
7
var 
IterDat:array of array of longword;// визуализируемый массив
pal:array[0..4095] of record
r:byte;
g:byte;
b:byte;
end;
локальные - это min,max, MaxX, MaxY - это ширина и высота. Задаются один раз - вначале открытия файла.
Задаётся ширина и высота массива.

Но в данном случае, на фасме палитра задана как BitMap. Адрес на палитру передаётся через диалог и сохраняется в переменную Pal:string; на фасме у меня палитра открывается так:
Assembler
1
invoke ReadFile,ebx,pal,4096*4,n,0
Данные задаются так (выделил нужные):
Assembler
1
2
3
4
minmax       rq 4
Buffer       rd Width*Height
pal          rd 4096
DC           rd 1
Блин, я уже запутался. Разобраться не могу, что дельфи компилит. Но как разложить это дело по полочкам, с Calling Convection???

Добавлено через 1 час 9 минут
Somebody, Хочу разобраться.
в фасм-файле прописываю:
Assembler
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
46
47
48
49
format MS COFF
 
public VIZUALIZE
;Òàê ëè íóæíî ãðóçèòü???
extrn palette ;ýòî àäðåñ ïàëèòðû â ñèñòåìå
extrn width
extrn height
extrn Iterdat ;ïîíÿòíî - äâóìåðíàÿ ìàòðèöà ðàçìåðàìè width*height
extrn min     ;ìèíèìóì è ìàêñèìóì, íåîáõîäèìûé äëÿ âèçóàëèçàöèè
extrn max
 
VIZUALIZE:
invoke CreateFileW,Palette,GENERIC_READ,0,0,OPEN_EXISTING,0,0   ;çàãðóçèòü ïàëèòðó
mov    ebx,eax
invoke ReadFile,ebx,BitmapHeader,sizeof.BITMAPFILEHEADER,n,0
invoke SetFilePointer,ebx,[BitmapHeader.bfOffBits],0,FILE_BEGIN
invoke ReadFile,ebx,pal,4096*4,n,0
invoke CloseHandle,ebx
 
movapd  xmm0,dqword[minmax]            ;âèçóàëèçàöèÿ
minpd   xmm0,dqword[minmax+16]
vhaddpd xmm2,xmm0,xmm0
movsd   xmm1,[C4096]
divsd   xmm1,xmm2
movhlps xmm0,xmm0
 
mov  ecx,Width*Height
@@:cvtsi2sd xmm2,[Buffer+ecx*4-4]
   subsd    xmm2,xmm0
   mulsd    xmm2,xmm1
   cvtsd2si eax,xmm2
   and      eax,4095
   mov      eax,[pal+eax*4]
   mov      [Buffer+ecx*4-4],eax
loop @b
 
invoke SetDIBitsToDevice,[DC],0,0,Width,Height,0,0,0,Height,Buffer,BMInfo,0
            invoke ValidateRect,[wnd],0
 
ret
 
.data
 
pal rd 4096
Buffer       rd Width*Height
C4096   dq -4096.0
 
BMInfo       BITMAPINFOHEADER sizeof.BITMAPINFOHEADER, Width, Height, 1, 32, 0, Width*Height*4          ;êîðî÷å, âûâîäèìûé BMP
BitmapHeader BITMAPFILEHEADER
Как задавать параметры? А в дельфи-коде что прописывать???
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
12.02.2014, 22:31
Динамические массивы - это не просто массивы, а структуры с указателем, размером, счётчиком ссылок - где-то в хелпе Delphi должно быть описано.
ebx в функции портить нельзя - надо сохранить и восстановить потом. Зато ecx и edx можно - так что их надо для себя сохранить перед вызовом api'шных функций.
В Delphi типа такого:
Delphi
1
2
procedure ......; external;
{$L asmunit.obj}
0
 Аватар для SeryZone
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
13.02.2014, 15:14  [ТС]
Somebody, чет ничего непонятно... Можно поподробнее???
Delphi
1
2
3
type DatArray = array of array of longword;
procedure Visualize(palette:string; width,height:integer; IterDat:DatArray;  min,max:integer; out BMP:TBitMap); external;
{$L asmunit.obj}
Добавлено через 30 секунд
И как оформить тот asmunit.asm?

Добавлено через 15 часов 32 минуты
Somebody, так, то есть в ebx какие параметры надо помещать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2014, 15:14
Помогаю со студенческими работами здесь

Asm вставка
Пишу в первый раз в жизни на ассемблере если что: После ввода значений переменных vicual c++ 2008 вырубается. Возможно в шоке от моего кода...

Вставка asm в С++
Здравствуйте! Помогите пожалуйста! Задание: Вычислить арифметическое выражение. Требуется написать функцию на языке C++ с вставкой на...

asm вставка в C++ часть 2
есть код. за его написание отдельное спасибо Kastaneda) #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int...

Секундомер asm + вставка в с++
Доброго времени суток! Нужно реализовать секундомер в asm и вставить код в с++ чтобы кот-то работало. У кого есть подобные проекты или...

ASM-вставка, OBJ файл
Как вызывать подпрограмму из OBJ-файла скомпилированного в FASM'e? В дельфи всё как-то намного проще: {$L Proc.OBJ} procedure...


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

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

Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru