il codice e'il seguente ed e' relativo ad una funzione c che sto' tentando di ottimizzare; X farla breve questa funzione carica della memoria un certo numero di pixel per elaborarli con la matrice di sobel (e questo lo fa), poi con gx e gy dovrei fare l'atan2 (parte finale del ciclo for + interno), ed e' qui che avrei bisogno di un esempio di codice o qualcuno che mi mostri un esempio pratico di come si facci ad utilizzarla;
P.S
Alcune parti di codice sono commentate o indentate in modo starno (per motivi miei un po particolari, ma che provvedero' a mettere a posto).
Ancora una cosa, mi dispiace di non aver risposto subito!
BITS 32
GLOBAL __ll_grey_sobel
SECTION .bss
dest_arg resd 1 ; // float*
xidim resd 1 ; // const unsigned int
yidim resd 1 ; // const unsigned int
j resd 1
SECTION .text
; Parametri
; ESP+4
__ll_grey_sobel:
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
push esi
push edi
;lettura dei parametri della funzione dallo stack
pxor mm0,mm0
; pxor mm1,mm1
pxor mm2,mm2
pxor mm3,mm3
pxor mm5,mm5
; pxor mm6,mm6
pxor mm7,mm7
mov edi,[ebp+8] ; EDI := dest_abs
mov eax, [ebp+12]
mov [dest_arg],eax
; sub [dest_arg],edi
mov eax, [ebp+16]
mov esi,eax ; ESI := src
mov eax, [ebp+20]
mov [xidim],eax
add [dest_arg],eax
mov eax, [ebp+24]
mov [yidim],eax
; ESI equivale a src. [src] non dovra piu essere toccata.
;add esi, [xidim] ; src += width
add edi, [xidim]
mov eax, [yidim]
dec eax
dec eax ; ciclo per height - 2
mov [j], eax ; j = height - 2
loop_esterno:
;preparo esi+edi affinche' puntino al pixel corrente dell'immagine passata alla funzione
inc esi ; src++ vi sommo 1
inc edi ; dst++
xor eax,eax
inc eax
add [dest_arg],eax
mov ecx, [xidim] ;ripristino il valore del contatore int
dec ecx
dec ecx ; ciclo per width - 2 pixel
mov edx, [xidim]
loop_interno:
;gx = - a - 2*d - f + c + 2*e + l
xor eax,eax
xor ebx,ebx
mov al, [esi+1] ; c ax: c
mov bl, [esi+edx+1] ; e bx: e
shl bx,1 ; bx: 2e
add ax,bx ; ax: c+2e
xor ebx,ebx
mov bl, [esi+2*edx+1] ; l bx: l
add ax,bx ; ax: c+2e+l
movd mm0,eax ; mm0: 00 00 00 0(c+2e+l)
xor eax,eax
mov al, [esi-1] ; a ax: a
mov bl, [esi+edx-1] ; d bx: d
shl bx,1 ; bx: 2d
add ax,bx ; ax: a+2d
xor ebx,ebx
mov bl, [esi+2*edx-1] ; f bx: f
add ax,bx ; ax: a+2d+f
movd mm7,eax ; mm7: 00 00 00 0(a+2d+f)
;abs di gx
movq mm2,mm0
psubusw mm2,mm7 ; A-B
psubusw mm7,mm0 ; B-A
paddusw mm2,mm7 ; (A-B)+(B-A)
movd eax,mm2
push eax ;gx nello stack
;gy = - a - 2*b - c + f + 2*g + l
xor eax,eax
mov al, [esi+2*edx-1] ; f ax: f
mov bl, [esi+2*edx] ; g bx: g
shl bx,1 ; bx: 2g
add ax,bx ; ax: f+2g
xor ebx,ebx
mov bl, [esi+2*edx+1] ; l bx: l
add ax,bx ; ax: f+2g+l
movd mm3,eax ;; mm3: 00 00 00 0(f+2g+l)
xor eax,eax
mov al, [esi-1] ; a ax: a
mov bl, [esi] ; b bx: b
shl bx,1 ; bx: 2b
add ax,bx ; ax: a+2b
xor ebx,ebx
mov bl, [esi+1] ; c bx: c
add ax,bx ; ax: a+2b+c
movd mm7,eax ; mm7: 00 00 00 0(a+2b+c)
;abs di gy
movq mm5,mm3
psubusw mm5,mm7 ; A-B
psubusw mm7,mm3 ; B-A
paddusw mm5,mm7 ; (A-B)+(B-A)
movd eax,mm5
push eax ;gy nello stack
paddw mm2,mm5 ; sommo i due abs
psrlq mm2,2 ; mm2/4 ->Basta uno shift a destra di 2
movd ebx,mm2
emms
mov [edi], bl
xor eax,eax
xor ebx,ebx
inc esi
inc edi
inc eax
dec ecx
;QUI HO I MAGGIORI PROBLEMI
pop eax ;recupero gy
pop ebx ;recupero gx
fld eax ;li pongo nello stack floating point
fld ebx
fpatan
; fld [esp+8]
; fld [esp]
; fpatan
; pop ;ebx
; pop ;ebx
fstp ebx ;recupero il risultato di Atan2
mov [dest_arg], bl
add [dest_arg],eax
; dec ecx ;l'ho spostato 10 righe sopra assieme agli inc
jnz loop_interno ;xdim > j+1 continuo a ciclare
inc esi ; finisco la riga (visto che il pixel sul bordo non viene contato) e vado a capo
inc edi ; vado a capo anche con il dst
xor eax,eax
inc eax
add [dest_arg],eax
mov eax, [j]
dec eax
mov [j], eax
jnz loop_esterno ; ciclo fino a che j == 0
; altrimenti esco senza ripristinare il contatore ext
; emms ;fine istruzioni mmx
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
pop ebp
RET