03/07/10 9:33
Ste4OS
Ciao a tutti! Avrei bisogno di una mano con questo piccolo programma assembly. Il programma deve fare questo: l'utente può inserire un numero (da 0 a 5) che indica il numero di oggetti da permutare, quindi se ad esempio viene inserito 3 il programma stamperà:
123
213
231
...
...
Prima di "buttarmi" nella programmazione assembly ho codificato questo algoritmo in Java. Vi posto il codice:
L'ho fatto in java perchè è l'unico linguaggio che conosco.
Ora vi posto il codice .asm, non è completo ma una parte della codifica. Il problema è che non so se quello che sto scrivendo è esatto. Non posso provarlo finchè non è finito visto che sfrutta al 100% la ricorsione.
Grazie mille in anticipo!
123
213
231
...
...
Prima di "buttarmi" nella programmazione assembly ho codificato questo algoritmo in Java. Vi posto il codice:
public class perm { static void permutazioni(int anagramma[], int elementiMancanti[]){ if (elementiMancanti.length == 0){ print(anagramma); return; } int[] anag = new int[anagramma.length + 1]; for (int i=0; i<anagramma.length; i++) anag[i]=anagramma[i]; for (int i=0; i<elementiMancanti.length; i++){ anag[anag.length-1] = elementiMancanti[i]; //in assembler anag.length - 1 = anagramma.length int[] manc = new int[elementiMancanti.length-1]; int k=0; for (int j=0; j<elementiMancanti.length; j++){ if (j!=i){ manc[k]=elementiMancanti[j]; k++; } } permutazioni(anag, manc); } } static void print(int[] anagramma){ for (int i=0; i<anagramma.length; i++) System.out.print(anagramma[i]); System.out.println(); } }
L'ho fatto in java perchè è l'unico linguaggio che conosco.
Ora vi posto il codice .asm, non è completo ma una parte della codifica. Il problema è che non so se quello che sto scrivendo è esatto. Non posso provarlo finchè non è finito visto che sfrutta al 100% la ricorsione.
.data elemMancanti: .space 16 anagramma: .space 16 anag: .space 20 string1: .asciiz "Inserisci elementi: " .text .globl main main: addi $t2, $zero, 0 #dimensione iniziale anagramma addi $t3, $zero, 1 #dimensione anag al primo giro acquis: li $v0, 4 #Seleziona print_string la $a0, string1 #$a0 = indirizzo dell'etichetta string1 syscall #chiama la procedura per stampare una stringa li $v0, 5 #seleziona read_int syscall #chiama la procedura per leggere un intero add $s0, $zero, $v0 #$s0 = oggetti da utilizzare la $s1, elemMancanti #uso $s1 per memorizzare la base dell'array la $s2, anagramma #uso $s2 per memorizzare la base dell'array la $s3, anag #uso $s3 per memorizzare la base dell'array li $t0, 0 #uso $t0 per memorizzare l'indice (in questo caso 0) riempi_elemMancanti: slt $t4, $t0, $s0 beq $t4, $zero, elabora move $a0, $t0 #carico in $a0 il valore dell'indice sll $t1, $t0, 2 #$t1 = t0 * 4 add $t1, $s1, $t1 #$t1 = inizio_elemMancanti + i*4 sw $a0, 0($t1) #elemMancanti[i]= i addi $t0, $t0, 1 #incremento contatore j riempi_elemMancanti #goto riempi_elemMancanti move $a0, $s1 #$a0 = base di elemMancanti move $a1, $s2 #$a1 = base di anagramma move $a2, $s0 #$a2 = dimensione di elemMancanti move $a3, $t2 #$a3 = dimensione di anagramma jal permutazioni #vai alla procedura permutazioni permutazioni: bne $s0, $zero, calcola #se la "dimensione" del vettore elemMancanti != 0 goto calcola li $t0, 0 #uso $t0 per memorizzare l'indice (in questo caso 0) stampa_anagramma: slt $t1, $t0, $t2 #se i < dimensione Anagramma allora $t1 = 1 beq $t0, $t2, ritorna beq $t1, $zero, calcola #se $t1 == 0 allora goto calcola, else stampo vettore move $a0, $t0 #carico in $a0 il valore dell'indice sll $t1, $t0, 2 #$t1 = $t0 * 4 add $t1, $s2, $t1 #$t1 = inizio_anagramma + i*4 lw $a0, 0($t1) #$a0 = anagramma[i] li $v0, 1 #Seleziona print_int syscall #chiama la procedura per stampare un intero addi $t0, $t0, 1 #incremento contatore j stampa_anagramma #goto stampa_anagramma ritorna: j $ra calcola: li $t0, 0 #uso $t0 per memorizzare l'indice (in questo caso 0) step1: slt $t1, $t0, $t2 #se i < dimensione anagramma allora $t1 = 1 beq $t1, $zero, step2 #se $t1 == 0 allora goto step2, else elabora calcoli move $a0, $t0 #carico in $a0 il valore dell'indice sll $t1, $t0, 2 #$t1 = $t0 * 4 add $t1, $s2, $t1 #$t1 = inizio_anagramma + i*4 lw $a0, 0($t1) #$a0 = anagramma[i] sll $t1, $t0, 2 #$t1 = $t0 * 4 add $t1, $s3, $t1 #$t1 = inizio_anag + i*4 lw $a1, 0($t1) #$a1 = anag[i] sw $a0, 0($a1) #anag[i] = anagramma[i] addi $t0, $t0, 1 #incremento contatore j step1 #goto step1 step2: li $t0, 0 #uso $t0 per memorizzare l'indice (in questo caso 0) slt $t4, $t0, $s0 beq $t4, $zero, elabora move $a0, $t0 #carico in $a0 il valore dell'indice sll $t1, $t0, 2 #$t1 = t0 * 4 add $t1, $s1, $t1 #$t1 = inizio_elemMancanti + i*4 move $a1, $t1 #preservo il contenuto in $a1, cosi riutilizzo $t1 sll $t1, $t3, 2 #$t1 = $t3 * 4, ho settato $t3 = 1 all'inizio perche anag parte con length = 1 add $t1, $s3, $t1 #$t1 = inizio_anag + i*4 addi $t1, $t1, -4 #$t1 = anag - 1 sw $a1, 0($t1) #anag[anag.length-1] = elementiMancanti[i] addi $t0, $t0, 1 #incremento contatore j riempi_elemMancanti li $v0, 10 syscall
Grazie mille in anticipo!
Ultima modifica effettuata da Ste4OS 03/07/10 9:35
aaa