Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2016, 16:07   #1
DarkRiDDeR
Новичок
Джуниор
 
Регистрация: 18.04.2016
Сообщений: 3
По умолчанию Генерация фрактала Мандельброта. NASM + OpenGL

Всем здравия! Помогите мне, нужна помощь опытных людей. Замучился совсем. Вроде делаю всё как надо, но выводит непонятно что.
Основная проблема: не могу нормально сформировать цвета для точек.
Как основу использовал проект http://github.com/duncanspumpkin/NeHeNASM
Для сборки моего проекта смотрите архив (кому интересно).
Там есть:
1) NASM и ALINK необходимые для сборки
2) файлы "window.asm" (создание окна) и "DrawGLScene.asm" ("для генерации и рисования фрактала")
3) файлы "*.inc" либы необходимые для работы
3) файл "window.exe" - скомпилированный проект

Пример сборки проекта:
"./NASM/nasm.exe" -i "./include/" -fobj "./window.asm"
"./NASM/nasm.exe" -i "./nclude/" -fobj "./DrawGLScene.asm"
"./ALINK/ALINK.EXE" -oPE "./window.obj" "./DrawGLScene.obj"

Переписывал пример с JAVA:
Код:
    private final float bound = 2.0f;
    private float step = bound / 400.0f;
    private final int maxIter = 1000;
    private void setUpMandelbrot() {
        mandelbrotDisplayList = glGenLists(1);
        glNewList(mandelbrotDisplayList, GL_COMPILE);
        glBegin(GL_QUADS);
 
        for (float y = -bound; y < bound; y += step) {
            for (float x = -bound; x < bound; x += step) {
                float X = 0;
                float Y = 0;
                int iter = 0;
                while (X*X + Y*Y < 4 && iter < maxIter) {
                    float xtemp = X*X - Y*Y + x;
                    Y = 2*X*Y + y;
                    X = xtemp;
                    iter++;
                }
                if (iter == 1000) continue;
                int r = (40 * iter) % 256;
                int g = (80 * iter) % 256;
                int b = (120 * iter) % 256;
                glColor3f(r/256.0f, g/256.0f, b/256.0f);
                glVertex3f(x, y, iter/1000.0f);
                glVertex3f(x + step, y, iter/1000.0f);
                glVertex3f(x + step, y + step, iter/1000.0f);
                glVertex3f(x, y + step, iter/1000.0f);
            }
        }
 
        glEnd();
        glEndList();
Буду очень благодарен за помощь.
Вложения
Тип файла: zip archive.zip (697.7 Кб, 9 просмотров)
DarkRiDDeR вне форума Ответить с цитированием
Старый 19.04.2016, 09:34   #2
DarkRiDDeR
Новичок
Джуниор
 
Регистрация: 18.04.2016
Сообщений: 3
По умолчанию

Сейчас я смог вывести следующее изображение (см. 1 рис.), хотя должно получится что-то вроде этого (см. 2 рис.).
Код:
Код:
    section .bss use32
    iter resd 1
    Y resd 1
    X resd 1
    z resd 1
    y resd 1
    x resd 1
    red resd 1
    green resd 1
    blue resd 1
    koefColor dd 1
    temp resd 1
    CONTROL_WORD resw 1 ; настройки регистров сопроцессора
    CONTROL_TEMP resw 1 ; временные настройки регистров сопроцессора
    
    section .data use32
    position dd -6.0,0.0,0.0
    maxCoord dd 8.0
    count dd 25.0
    maxY dd 2.0
    maxX dd 2.0
    step dd 0.005
    startY dd -7.2
    startX dd -5.2
    maxIter dd 80
    koefY dd 2
    koefX dd 0.1
    stepColor dd 0.683, 0.786, 1.0 ; 0.1563, 0.3126, 0.4689
    
    
    DrawGLScene:
      push dword GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
      call [glClear] ;Очистка screen и depth
      call [glLoadIdentity] ;Сброс матрицы видов (modelview matrix)
      
      push dword [position]
      push dword [position+4]
      push dword [position+8]
      call [glTranslatef] ; позиция
    
      push dword GL_QUADS
      call [glBegin]
        
        mov dword  eax, [startY]
        mov dword [y], eax
        .for1:
            finit ; очистка сопроцессора
            fld dword [maxY]
            fld dword [y]
            fcompp
            fstsw ax
            sahf
            jae .endfor1
       
            mov dword  eax, [startX]
            mov dword [x], eax
            .for2:
                fld dword [maxX]
                fld dword [x]
                fcompp
                fstsw ax
                sahf
                jae .endfor2
                xor eax, eax ; обнуляем переменные
                mov [X], eax
                mov [Y], eax    
                mov [iter], eax
            
                mov ecx, [iter]
                .while: ; цикл
                    cmp ecx, [maxIter] ; 2 условие
                    jae .endfor2
                    fld dword [maxCoord] ; 1 условие
                    fld dword [X]
                    fmul dword [X]
                    fld dword [Y]
                    fmul dword [Y]
                    faddp
                    fcompp
                    fstsw ax
                    sahf
                    jae .endwhile
                    
                    fld dword [X]
                    fmul dword [X]
                    fld dword [Y]
                    fmul dword [Y]
                    fsubp
                    fadd dword [x]
                    fstp dword [temp] ; вычислили temp = X*X - Y*Y + x
                    fld dword [X]
                    fmul dword [koefY]
                    fmul dword [Y]
                    fadd dword [y]
                    fstp dword [Y] ; вычислили Y = 2*X*Y + y
                    mov eax, [temp]
                    mov [X], eax ; X = temp
                    
                    add  ecx, 1
                    jmp .while
                .endwhile:
                mov [iter], ecx
                
                ; вычисляем цвета и вычисляем координаты, ну и рисуем
                ; модификация модуля округления
                fstcw [CONTROL_WORD]
                mov ax, [CONTROL_WORD]
                or ah, 0b00000100   ; Set RC=1: округление к отриц. бесконечности
                mov [CONTROL_TEMP], ax
                fldcw [CONTROL_TEMP]   ; Загружаем новые настройки регистров
                
                fld dword [iter]
                fdiv dword [maxIter]
                fstp dword [koefColor]
                
                fld dword [stepColor]
                fmul dword [koefColor]
                fstp dword [blue] ; blue
                fld dword [stepColor+4]
                fmul dword [koefColor]
                fstp dword [green] ; green
                fld dword [stepColor+8]
                fmul dword [koefColor]
                fstp dword [red] ; red
                
    
    
                
                ;fld dword [iter]
                ;fdiv dword [maxIter]
                ;fstp dword [z] ; подсчёт координаты z
                
                push dword [blue] ; [blue]
                push dword [green] ; [green]
                push dword [red] ; [red]
                call [glColor3f]
                ;push dword [z]
                push dword [y]
                push dword [x]
                call [glVertex2f] ; 1 вершина
                ;push dword [z]
                push dword [y]
                fld dword [x]
                fadd dword [step]
                fstp dword [temp]
                push dword [temp]
                call [glVertex2f] ; 2 вершина
                ;push dword [z]
                fld dword [y]
                fadd dword [step]
                fstp dword [temp]
                push dword [temp]
                fld dword [x]
                fadd dword [step]
                fstp dword [temp]
                push dword [temp]
                call [glVertex2f] ; 3 вершина
                ;push dword [z]
                fld dword [y]
                fadd dword [step]
                fstp dword [temp]
                push dword [temp]
                push dword [x]
                call [glVertex2f] ; 4 вершина
                
                fldcw [CONTROL_TEMP] ; возвращаем стандартные флаги модуля округления
                fld dword [x] ; шаг 1-ого цикла
                fadd dword [step]
                fstp dword [x]
                jmp .for2
            .endfor2:
            fld dword [y] ; шаг 2-ого цикла
            fadd dword [step]
            fstp dword [y]
            jmp .for1
        .endfor1:
         call [glEnd]
    
    
      mov dword eax,1
      
    ret ;DrawGLScene
Изображения
Тип файла: jpg ассемблер генерация.jpg (9.2 Кб, 161 просмотров)
Тип файла: png 2016-04-19_14-30-29.png (13.3 Кб, 32 просмотров)
DarkRiDDeR вне форума Ответить с цитированием
Старый 19.04.2016, 12:17   #3
DarkRiDDeR
Новичок
Джуниор
 
Регистрация: 18.04.2016
Сообщений: 3
Лампочка

ха-ха. Я нашёл ошибку, она в строке
Код:
koefY dd 2
Из-за того, что задано целое число, то во время вычисления строк:
Код:
fld dword [X]
fmul dword [koefY]
fmul dword [Y]
fadd dword [y]
fstp dword [Y] ; вычислили Y = 2*X*Y + y
сопроцессор округлял значения. Надо писать
Код:
koefY dd 2.0
Я УБЬЮ СЕБЯ!!!
DarkRiDDeR вне форума Ответить с цитированием
Старый 05.05.2016, 15:05   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

как-то тоже развлекал себя этой темой.


http://postimg.org/image/5fitkfltt/


Код:
?CalculateVS@@CAXPEA_J@Z	PROC
	PUSH r12
	PUSH r13
	PUSH r14

	PUSH rbx

	MOV rbx, rcx

	MOV r8, [rbx + 16] ; width
	MOV r9, [rbx + 24] ; height
	MOV r11, r8


	MOV r12d, [rbx + 64]
	MOV r13d, [rbx + 64 + 4]
	


	XORPD xmm3, xmm3
	XORPD xmm6, xmm6
	
	MOVAPD xmm4, [rbx + 32] ; offset
	MOVAPS xmm5, xmm4

	MOVSD xmm3, QWORD PTR [rbx + 48]
	SHUFPD xmm6, xmm3, 1
			
	MOVAPS xmm7, XMMWORD PTR [y_sign]
	MOVAPD xmm2, XMMWORD PTR [double_4]

	LEA rcx, [rbx + 128]
	XOR r14, r14

	align 16
		calc_loop:

			MOV eax, [rcx] ; runlength
			AND eax, eax
			JZ no_14a
				AND r14, r14
				CMOVZ r14, rcx
				JZ no_14u
					ADD [r14], eax
				no_14u:

				SHL rax, 5
				LEA rcx, [rcx + rax]
				SHR rax, 5
								
				CVTSI2SD xmm0, eax
				MULPD xmm0, xmm3
				ADDPD xmm5, xmm0

			no_14a:
			
			INC eax

			SUB r8d, eax
			JS ca_co

			MOV edx, [rcx + 4]

			MOVAPD xmm0, [rcx + 16]

		align 16
			run_loop:
				
				ADD edx, 8

				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0


				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0


				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0
				

				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0


				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0


				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0


				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				SBB edx, 0


				MOVAPD xmm1, xmm0
				SHUFPD xmm1, xmm1, 1
				MULPD xmm1, xmm0
				MULPD xmm0, xmm0
				ORPD xmm0, xmm7
				HADDPD xmm0, xmm1
				ADDPD xmm0, xmm5

				MOVAPD xmm1, xmm0
				MULPD xmm1, xmm1
				HADDPD xmm1, xmm1

				COMISD xmm2, xmm1
				JC run_esc

			SUB eax, 1
			JNZ run_loop

		run_esc:
			MOV eax, [rcx]
			ADC eax, 0
			CMOVZ r14, rax
			JZ no_rl
				AND r14, r14
				CMOVZ r14, rcx

				ADD [r14], eax

				CMP r12d, edx
				CMOVA r12d, edx
				CMP r13d, edx
				CMOVB r13d, edx

			no_rl:
			
			ADDPD xmm5, xmm3

			MOVNTI [rcx], eax
			MOVNTI [rcx + 4], edx

			MOVNTPD [rcx + 16], xmm0
		
			ADD rcx, 32

			CMP r8d, 0
			JA calc_loop

	align 16
		ca_co:
			XOR r14, r14
			MOV r8, r11

			ADDPD xmm4, xmm6
			MOVAPS xmm5, xmm4

		DEC r9d
		JNZ calc_loop

		MOV [rbx + 64], r12d
		MOV [rbx + 64 + 4], r13d

		INC DWORD PTR [rbx]

		SFENCE

	POP rbx

	POP r14
	POP r13
	POP r12
	
	RET
?CalculateVS@@CAXPEA_J@Z	ENDP
void CalculateVS(I_64 *);

буфер идущий в CalculateVS организован следующим оразом:

служебная_инфо с_и[16];
double растр_мандельброта[4*ширина_оласти*высота_области]; (должен быть инициализирован нулями)

служебная_инфо {
I_64 reserved_1;
I_64 площадь_области;
I_64 ширина_области; (кратна 16)
I_64 высота_области; (кратна 16)

double х_смещение_области;
double у_смещение_области;

double х_шаг_сканирования;
double у_шаг_сканирования;

I_64 минимальное_время_выхода; (должно быть инициализированно большим числом, например 0xFFFFFFFFFF)
I_64 максимальное_время_выхода; (должно быть инициализированно большим числом, например 0xFFFFFFFFFF)

I_64 reserved_2[6];
}

Последний раз редактировалось f.hump; 05.05.2016 в 15:16.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение фрактала облака (delphi) Rol Помощь студентам 1 05.11.2017 09:53
Последовательность Мандельброта на Паскале archi1121 Помощь студентам 0 25.12.2011 12:32
Ассемблер(NASM). Как оформить цикл "while" в NASM-е? Зелёный Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 10.06.2011 16:04
снежинка Мандельброта NiCola999 Общие вопросы C/C++ 5 25.09.2010 16:17