I have data save as r,g,ba,r,g,b,a,... when i give a small image like 1000x500px to asm everything is good but when i want to give him larger photo 5000x3000 it returns me memory access error what can be the reasone? and it will help when i start to use r,g,b,r,g,b,r,g,b data?
Asm code:
.data
LaplaceMask BYTE 9 DUP (0,-1,0,-1,4,-1,0,-1,0) ;Maska dla filtru laplace
;LaplaceEXAMPLE BYTE 9 DUP (10,10,10,10,100,10,10,10,10) ;Do testowanie liczenia nowej wartosci piksela
.code
_DllMainCRTStartup proc parameter1:DWORD, parameter2:DWORD, parameter3:DWORD ;entry point
MOV EAX, 1
RET
_DllMainCRTStartup endp
GetNewPixelValue PROC
PXOR XMM0,XMM0
MOVQ XMM0, QWORD PTR [LaplaceMask] ;przeniesienie wartosci maski do rejestru XMM0
;MOVQ XMM10, QWORD PTR [LaplaceEXAMPLE] ; Testowanie obliczania wartosci piksela
MOVDQU XMM10, XMM2 ;przeniesienie wektora koloru, ktory chcemy liczyc do wektora XMM10
PMOVSXBW XMM0, XMM0 ;konwersja na word
PMADDWD XMM0, XMM10 ;monozenie dwoch wektorow i sumowanie parami
PHADDD XMM0, XMM0 ;sumuje elemenety parami
PHADDD XMM0, XMM0 ;sumuje elemenety parami
MOVD ECX, XMM0 ;zapisanie wyniku do ECX
MOVSXD RDX, ECX ;przeniesienie wartosc do rejestru RDX
;Sprawdzanie czy wartosc jest z przedzialu 0-255
CMP RDX, 0
JL UnderZero
CMP RDX, 255
JG Overflow
JMP DONE
UnderZero:
MOV RDX, 0
JMP DONE
Overflow:
MOV RDX, 255
DONE:
RET
GetNewPixelValue ENDP
LaplaceApply PROC EXPORT
MOV R11, RCX ; Wskaznik na tablice wejsciowa
MOV R12, RDX ; Szerokosc obrazka (zapisana jako r b g a r g b a r g b a)
MOV R13, R8 ; Wysokosc obrazka
MOV R14, R9 ; Wskaznik na tablice wyjsciowa
XOR RAX,RAX
MOV RAX, QWORD PTR [RSP+40] ;przesuniecie dla threadow
ADD R11, RAX
ADD R14, RAX
XOR RAX, RAX ;COLOMN_LOOP iterator (i=0)
INC RAX ;i=1 zeby zaczac od 2 wiersza
COLOMN_LOOP:
XOR RBX, RBX ; ROW_LOOP iterator (j=0)
ADD RBX, 4 ;Przeskakiwanie co 4 wartosc sa w formacie r, g, b , a
ROW_LOOP:
;Lewy Gorny
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX ;przenosimy wartosc i, zeby jej potem nie stracic
DEC RDX ;zmniejszamy o jeden bo chcemy wartosc z pierwszzego wiersza a jestesmy w drugim
IMUL RDX, R12 ; mnozymy razy szerokosc aby dostac sie do odpowiedniego indexu
ADD RDX, RBX ; dodajemy iterator j
SUB RDX, 4 ; odejmujemy 4 aby cofnac sie do chcianej wartosc poprzedniego piksela
MOV CL, BYTE PTR [R11+RDX] ; wartosc piksela zapisujemy w rejestrze CL
PSLLDQ XMM7, 2 ; przesuwamy rejestr o 2
MOVD XMM1, ECX ; przenosimy zawartosc rejestru do rejestry XMM1
ADDPS XMM7, XMM1 ; dodanie do wektora ktory przechowuje wartosc piksel branych do obliczen
;Reszta piksel analogicznie rozni sie jedynie przejsciem do poszczegolnych pikseli
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebieski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Srodek Gora
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
DEC RDX
IMUL RDX, R12
ADD RDX, RBX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebieski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Prawo Gora
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
DEC RDX
IMUL RDX, R12
ADD RDX, RBX
ADD RDX, 4
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebieski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Lewo Srodek
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
IMUL RDX, R12
ADD RDX, RBX
SUB RDX,4
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebieski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Srodek
XOR RCX, RCX
XOR RDX, RDX
XOR R8,R8
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
IMUL RDX, R12
ADD RDX, RBX
MOV R8, RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebiskie
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Srodek prawo
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
IMUL RDX, R12
ADD RDX, RBX
ADD RDX, 4
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebieski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Lewo Dol
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
INC RDX
IMUL RDX, R12
ADD RDX, RBX
SUB RDX, 4
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebiski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Dol Srodek
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
INC RDX
IMUL RDX, R12
ADD RDX, RBX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebieski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Dol Prawo
XOR RCX, RCX
XOR RDX, RDX
PXOR XMM1, XMM1
;kolor czerwony
MOV RDX, RAX
INC RDX
IMUL RDX, R12
ADD RDX, RBX
ADD RDX, 4
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM7, 2
MOVD XMM1, ECX
ADDPS XMM7,XMM1
;kolor zielony
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM8, 2
MOVD XMM1, ECX
ADDPS XMM8, XMM1
;kolor niebiski
PXOR XMM1,XMM1
XOR RCX,RCX
INC RDX
MOV CL, BYTE PTR [R11+RDX]
PSLLDQ XMM9, 2
MOVD XMM1, ECX
ADDPS XMM9, XMM1
;Czerwony
PXOR XMM2,XMM2
XOR RDX, RDX
MOVDQU XMM2, XMM7 ; przensienie wartosc pikseli ktore bedziemy liczyli do wektora XMM2
CALL GetNewPixelValue ; wywoanie procedury
MOV BYTE PTR [R14+R8], DL ; przypisanie nowej wartosc
;zielony
PXOR XMM2,XMM2
XOR RDX, RDX
MOVDQU XMM2, XMM8 ; przensienie wartosc pikseli ktore bedziemy liczyli do wektora XMM2
CALL GetNewPixelValue ; wywoanie procedury
INC R8 ;przejscie do kolejnej skladowej
MOV BYTE PTR [R14+R8], DL; przypisanie nowej wartosc
;niebiski
PXOR XMM2,XMM2
XOR RDX, RDX
MOVDQU XMM2, XMM9 ; przensienie wartosc pikseli ktore bedziemy liczyli do wektora XMM2
CALL GetNewPixelValue ; wywoanie procedury
INC R8;przejscie do kolejnej skladowej
MOV BYTE PTR [R14+R8], DL; przypisanie nowej wartosc
INC R8;przejscie do kolejnej skladowej
MOV BYTE PTR [R14+R8], 255 ; zapisanie wartosc a na 255
ADD RBX, 4 ;j+=4
CMP RBX, R12
JL ROW_LOOP; j < szerokość obrazka
INC RAX ;i++
CMP RAX, R13
JL COLOMN_LOOP ; i < wysokość obrazka
;USUWAC OBRAMOWANIA
XOR RAX, RAX
MOV RAX, R12
IMUL RAX, R13
DEC RAX
XOR RBX, RBX
BOTTOM_EDGE:
XOR RCX, RCX
XOR RDX, RDX
DEC RAX
MOV RDX, RAX
SUB RDX, R12
MOV CL, BYTE PTR [R14+RDX]
MOV BYTE PTR [R14+RAX], CL
INC RBX
CMP RBX, R12
JNE BOTTOM_EDGE
XOR RAX, RAX
XOR RBX, RBX
TOP_EDGE:
XOR RCX, RCX
XOR RDX, RDX
MOV RCX, RAX
ADD RCX, R12
MOV DL, BYTE PTR [R14+RCX]
MOV BYTE PTR [R14+RAX], DL
INC RAX
CMP RAX,R12
JNE TOP_EDGE
RET
LaplaceApply ENDP
END
i try to give larger or smaller photo but there was a small limit where it is starting crushing and returing memory access errors