Untitled
unknown
plain_text
a year ago
8.1 kB
8
Indexable
.data index: .space 4 indexLinie: .space 4 indexColoana: .space 4 LinCol: .space 4 x: .space 4 y: .space 4 valcurenta: .space 4 pfs: .asciz "%ld " sfs: .asciz "%ld" pairsfs: .asciz "%ld %ld" newline: .asciz "\n" Linie: .space 4 linverif: .space 4 Coloana: .space 4 colverif: .space 4 NrCelule: .space 4 NrEvolutii: .space 4 NrVecini: .space 4 Matrice: .space 1600 MatriceSchimbare: .space 1600 .text .global main main: //citire numarul de linii si coloane pushl $Linie pushl $sfs call scanf popl %ebx popl %ebx pushl $Coloana pushl $sfs call scanf popl %ebx popl %ebx //crestem linia si coloana cu 2 bc bordare addl $2, Linie addl $2, Coloana //in linverif si colverif salvam valoarea pe care o folosim la verificari si afisari movl Linie, %ecx decl %ecx movl %ecx, linverif movl Coloana, %ecx decl %ecx movl %ecx, colverif //citire numarul de celule pushl $NrCelule pushl $sfs call scanf popl %ebx popl %ebx //index e un fel de i din for, bc et_citire_celule e forul de citire a perechilor movl $0, index et_citire_celule: movl index, %ecx cmp %ecx, NrCelule je et_citire_NrEvolutii //in matrice ar fi m[x][y] pushl $y pushl $x pushl $pairsfs call scanf popl %ebx popl %ebx popl %ebx //bc noi avem vector v[x*col +y] //bc matrice bordata x si y cresc cu 1 --> v[(x+1)*col +y+1] movl x, %eax incl %eax movl $0, %edx mull Coloana addl y, %eax incl %eax //in matrice, la valoarea (x+1)*col+y+1 punem 1 lea Matrice, %edi movl $1, (%edi, %eax, 4) incl index jmp et_citire_celule et_citire_NrEvolutii: pushl $NrEvolutii pushl $sfs call scanf popl %ebx popl %ebx //loop in care executam cele k evolutii movl $0, index et_evolutie: movl index, %ecx cmp %ecx, NrEvolutii je et_afisare //cand se executa cele k evolutii afisam solutia finala incl index //resetam index matrice ca sa o reparcurgem movl $1, indexLinie et_linie_evolutie: movl indexLinie, %ecx cmp %ecx, linverif je et_schimbare //atunci cand o parcurgem pe toata are loc interschimbarea movl $1, indexColoana et_coloana_evolutie: movl indexColoana, %ecx cmp %ecx, colverif je et_linie_next movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax lea Matrice, %edi movl (%edi, %eax, 4), %ebx movl %ebx, valcurenta // in ebx si valcurenta avem celula analizata curent //in edx retinem cei 8 vecini movl $0, NrVecini //1. [i-1][j-1] movl indexLinie, %eax movl $0, %edx decl %eax mull Coloana addl indexColoana, %eax decl %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //2. [i-1][j] movl indexLinie, %eax movl $0, %edx decl %eax mull Coloana addl indexColoana, %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //3. [i-1][j+1] movl indexLinie, %eax movl $0, %edx decl %eax mull Coloana addl indexColoana, %eax incl %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //4. [i][j-1] movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax decl %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //5. [i][j+1] movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax incl %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //6.[i+1][j-1] movl indexLinie, %eax movl $0, %edx incl %eax mull Coloana addl indexColoana, %eax decl %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //7. [i+1][j] movl indexLinie, %eax movl $0, %edx incl %eax mull Coloana addl indexColoana, %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //8. [i+1][j+1] movl indexLinie, %eax movl $0, %edx incl %eax mull Coloana addl indexColoana, %eax incl %eax movl (%edi, %eax, 4), %edx addl %edx, NrVecini //jmp in functie de conditie cmp $0, %ebx je et_celula_moarta jmp et_celula_vie et_coloana_next: incl indexColoana jmp et_coloana_evolutie et_linie_next: incl indexLinie jmp et_linie_evolutie et_celula_moarta: //verificam daca celula are 3 vecinii vii movl NrVecini, %eax cmp $3, %eax je et_creare_cel //altfel punem 0 in MatriceSchimbare movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax lea MatriceSchimbare, %edi movl $0, (%edi, %eax, 4) jmp et_coloana_next et_celula_vie: //verificam daca celula are 2 sau 3 vecini in viata movl NrVecini, %eax cmp $2, %eax je et_creare_cel movl NrVecini, %eax cmp $3, %eax je et_creare_cel //altfel punem 0 in MatriceSchimbare movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax lea MatriceSchimbare, %edi movl $0, (%edi, %eax, 4) jmp et_coloana_next et_creare_cel: //punem 1 in MatriceSchimbare movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax lea MatriceSchimbare, %edi movl $1, (%edi, %eax, 4) jmp et_coloana_next et_schimbare: //vom pune MatriceSchimbare in Matrice pt urmatorul pas movl $1, indexLinie et_linie_switch: movl indexLinie, %ecx cmp %ecx, linverif je et_evolutie movl $1, indexColoana et_coloana_switch: movl indexColoana, %ecx cmp %ecx, colverif je et_next_switch movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax lea MatriceSchimbare, %edi movl (%edi, %eax, 4), %ebx lea Matrice, %edi movl %ebx, (%edi, %eax, 4) incl indexColoana jmp et_coloana_switch et_next_switch: incl indexLinie jmp et_linie_switch jmp et_evolutie et_afisare: movl $1, indexLinie et_linie: movl indexLinie, %ecx cmp %ecx, linverif je et_exit movl $1, indexColoana et_coloana: movl indexColoana, %ecx cmp %ecx, colverif je et_next movl indexLinie, %eax movl $0, %edx mull Coloana addl indexColoana, %eax lea Matrice , %edi movl (%edi, %eax, 4), %ebx pushl %ebx pushl $pfs call printf popl %ebx popl %ebx pushl $0 call fflush popl %edx incl indexColoana jmp et_coloana et_next: movl $4, %eax movl $1, %ebx movl $newline, %ecx movl $2, %edx int $0x80 incl indexLinie jmp et_linie et_exit: mov $1, %eax xor %ebx, %ebx int $0x80
Editor is loading...
Leave a Comment