Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Utilizzo di fpatan

    Qualcuno sa indicarmi un esempio di utilizzo corretto della funzione fpatan? Nel modo in cui io la utilizzo vi e' un errore di accesso al segmento di memoria;
    Da qaunto ho capito, per utilizzarla non devo prima pushare i due parametri sullo stack e poi ripigliare il risultato con un semplice pop? :master:
    --
    "It is DIFFICULT to get a man to understand something when his SALARY depends upon his NOT UNDERSTANDING IT." Upton Sinclaire
    --
    HP compaq nx6125, AMD Turion 1.6, ATI RADEON XPRESS 200M chipset, ATI MOBILITY RADEON X300, 1GB RAM, Broadcom 802.11a/b/g WLAN, Bluetooth, 60GB drive, dual booting XP Home/Gusty G., router Negtgear DG834G v3

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288

    Moderazione

    E' obbligatorio specificare il linguaggio anche nel titolo della discussione, come da Regolamento.

    Di quale linguaggio si tratta? :master:
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Pardon, rimedio subito:
    sto' programmando in assmbly sotto linux con il nasm
    --
    "It is DIFFICULT to get a man to understand something when his SALARY depends upon his NOT UNDERSTANDING IT." Upton Sinclaire
    --
    HP compaq nx6125, AMD Turion 1.6, ATI RADEON XPRESS 200M chipset, ATI MOBILITY RADEON X300, 1GB RAM, Broadcom 802.11a/b/g WLAN, Bluetooth, 60GB drive, dual booting XP Home/Gusty G., router Negtgear DG834G v3

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Le microistruzioni del coprocessore matematico lavorano con un proprio stack accessibile proprio tramite tali istruzioni.

    Niente a che fare con lo stack della CPU. Il tuo problema deriva dal fatto che scrivi i due push e un solo pop nello stack della CPU, alterandone ovviamente il contenuto.

    Mostra il codice che hai scritto e quello che vuoi ottenere ...

  5. #5
    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
    --
    "It is DIFFICULT to get a man to understand something when his SALARY depends upon his NOT UNDERSTANDING IT." Upton Sinclaire
    --
    HP compaq nx6125, AMD Turion 1.6, ATI RADEON XPRESS 200M chipset, ATI MOBILITY RADEON X300, 1GB RAM, Broadcom 802.11a/b/g WLAN, Bluetooth, 60GB drive, dual booting XP Home/Gusty G., router Negtgear DG834G v3

  6. #6
    Noto che la cosa si fa complicata;
    documentandomi in internet ho scoperto che x caricare gx e gy nei miei registri st0 e st1 devo utilizzare l'istruzione fld e fstp per recuperare il risultato e che l'istruzione fld prende come operando o un registro FPU o un operando in memoria, che puo' essere un real4 o real8; ma come poter passargli tale tipo di valore;
    se provo a scrivere fld eax, il compilatore mi segnala errore.Come devo fare allora per caricare questi due benedetti valori?
    --
    "It is DIFFICULT to get a man to understand something when his SALARY depends upon his NOT UNDERSTANDING IT." Upton Sinclaire
    --
    HP compaq nx6125, AMD Turion 1.6, ATI RADEON XPRESS 200M chipset, ATI MOBILITY RADEON X300, 1GB RAM, Broadcom 802.11a/b/g WLAN, Bluetooth, 60GB drive, dual booting XP Home/Gusty G., router Negtgear DG834G v3

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.