Variabili assembly

di il
1 risposte

Variabili assembly

Salve, devo convertire questa funzione in c in assembly:

#define MATRIX float*
MATRIX prodMatrixRowCacheUnroll(MATRIX A, MATRIX B, int righeA, int colonneB, int RC, int block_size){

MATRIX Prod = alloc_matrix(righeA,colonneB);
int i,j,k,ii,jj,kk;
int unroll=10;
for (i=0;i<righeA;i+=block_size) {
for (j=0;j<colonneB;j+=block_size) {
for(k=0;k<RC;k+=block_size){
for (ii=i; ii<i+block_size; ii++) {
for (jj=j; jj<j+block_size; jj++){
for (kk=k; kk<k+block_size; kk+=unroll) {

Prod[(ii*colonneB)+jj]+=A[(ii*RC)+kk]*B[(kk*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+1)]*B[((kk+1)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+2)]*B[((kk+2)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+3)]*B[((kk+3)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+4)]*B[((kk+4)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+5)]*B[((kk+5)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+6)]*B[((kk+6)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+7)]*B[((kk+7)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+8)]*B[((kk+8)*colonneB)+jj];
Prod[(ii*colonneB)+jj]+=A[(ii*RC)+(kk+9)]*B[((kk+9)*colonneB)+jj];
}
}
}
}
}
}
return Prod;
}
è un prodotto di matrici, dove A è la trasposta di B, con tecniche di unrolling e cache blocking, sono nuovo di assembly nasm, e ho cominciato a scrivere questa funzione:

%include "sseutils.nasm"

section .data
section .bss
section .text

global main


A equ 8
beta equ 12
m equ 16 ; righe matrice
n equ 20 ; colonne matrice


main:
push ebp ; salva il Base Pointer
mov ebp, esp ; il Base Pointer punta al Record di Attivazione corrente
push ebx ; salva i registri da preservare
push esi
push edi

mov eax, [ebp+A] ; indirizzo della MATRIX A
mov ebx, [ebp+beta] ; indirizzo di beta
mov ecx, [ebp+m] ; numero m righe
mov edx, [ebp+n] ; numero n colonne

call prodMatrixRowCacheUnroll

il punto è che siccome devo farla con la architettura X86, come memorizzo tutte le variabili i,ii,j,jj,block_size, k e kk? non mi bastano i registri, forse sarà una domanda banale, ma sono nuovo e non so come fare, devo tradurre questa funzione e sono in difficoltà..grazie

1 Risposte

  • Re: Variabili assembly

    Ciao
    inizia con la definizione della matrice
    per definirla devi fare :
    
    section .bss
    arr1 resd 16*20 ; definizione prima matrice.
    arr2 resd 16* 20 ; definizione seconda matrice.
    
    per quanto riguarda l'indirizzamento
    dovrai fare:
    
    mov esi,arr1 ;prende offset delle righe prima matrice.
    mov edi,arr2 ;prende offset delle righe per la seconda matrice.
    mov eax,dword [esi] preleva l'elemento x della prima matrice.
    add esi,4 posiziona il puntatore al prossimo elemento della prima matrice
    

    usa queste poche nozioni per modificare il programma
    e se tieni problemi posta nuovamente il codice con le modifiche che avrai fatto.
    spero di esserti stato d'aiuto.
Devi accedere o registrarti per scrivere nel forum
1 risposte