MIPS: memorizzare stringhe

di il
3 risposte

MIPS: memorizzare stringhe

Buonasera, sono nuovo del forum e vorrei chiedere un consiglio su che tipo di approccio avere su un problema che sto avendo col MIPS (è qualche anno che non ci metto più mano e sono un pò arrugginito).

Devo creare un programma che memorizza dei profili di utenti e gestirli come se si trattasse di un database (quindi con operazioni di ricerca di valori, sostituzioni, cancellazioni ecc).
Il mio problema si è presentato fin da subito, in quanto ho cercato di trovare un metodo per la memorizzazione delle stringhe ma il risultato non è come sperato.

Ho provato a fare una cosa del genere: riservare della memoria per ogni profilo e muoversi dall'indirizzo iniziale aggiungendo via via i valori immessi dall'utente.
li $v0, 9
	li $a0, 8
	syscall

	move $s0, $v0
	
	li $v0, 4
	la $a0, richiestanome
	syscall

	li $v0, 8
	la $a0, 0($s0)
	li $a1, 4
	syscall
	
	li $v0, 4
	la $a0, richiestacognome
	syscall

	li $v0, 8
	la $a0, 4($s0)
	li $a1, 4
	syscall
In un certo senso funziona, ma se volessi aggiungere un nuovo profilo, questo non andrebbe a sovrascrivere il precedente invece di affiancarglisi?
Esiste un modo migliore per poter procedere?
grazie

3 Risposte

  • Re: MIPS: memorizzare stringhe

    La mia idea è quella di usare una malloc, ovvero la system call 9 in MIPS.
    Ogni volta che devi memorizzare un nuovo utente fai la malloc, la quale ti ritorna un puntatore al nuovo blocco di memoria appena allocato. Tramite questo puntatore utilizzi la syscall 4 per inserirci una nuova stringa, ovvero nome e cognome. Nel frattempo però i puntatori agli utenti li memorizzo in un array di puntatori, altrimenti non li posso ricordare. Penso ci siano anche altre soluzioni molto più eleganti ma questa è quella che mi è venuta.
    Nel codice ipotizzo solo di memorizzare 3 utenti, giustamente puoi crearti una funzioncina inserisci utente o elimina utente o cerca utente.
    
    .globl main
    
    .data
    
    utenti: .space 1000
    str: .space 1000
    nomcog: .asciiz "NOME E COGNOME : "
    
    
    .text
    main:
    	
    .macro malloc
    	li $v0, 9
    	li $a0, 1000
    	syscall	
    .end_macro
     
     li $t0, 0
     
    memorizza_utenti:
     	beq $t0, 3, stampo #memorizzo al max 3 utenti
     	sll $t6, $t0, 2
     	
     	malloc #ritorna in $v0 il puntatore alla memoria appena allocata
    	move $t4, $v0
    	li $v0, 8
    	la $a0, ($t4)	#leggo da stdin
    	li $a1, 1000
    	syscall	
    
     	sw $t4, utenti($t6)
    	
    	addi $t0, $t0, 1
    	j memorizza_utenti
    
    stampo:	 
    li $t0, 0
    loop_stampa:
    	beq $t0, 3, exit #stampo i 3 utenti
     	sll $t6, $t0, 2
     	
     	lw $t3, utenti($t6)
     	
     	li $v0, 1
     	move $a0, $t3
     	syscall
     	
     	li $v0, 11
     	li $a0, 10
     	syscall
     	
     	li $v0, 4
     	la $a0, nomcog
     	syscall
     	
     	li $v0, 4
     	move $a0, $t3
     	syscall
     	
     	
     	li $v0, 11
     	li $a0, 10
     	syscall
    
    	addi $t0, $t0, 1
     	
     	j loop_stampa
     	
     exit:
     li $v0, 10
     syscall
     
    
    Forse 1000 byte sono un pò esagerati per la malloc -.-
  • Re: MIPS: memorizzare stringhe

    Grazie mille!
    Quindi ero già sulla strada giusta anche se effettivamente all'idea di usare un array per i puntatori non avevo pensato.
    Al momento sono un pò cotto ma domani mattina provo subito a studiare questa soluzione.
    grazie ancora!
  • Re: MIPS: memorizzare stringhe

    Aggiornaci
Devi accedere o registrarti per scrivere nel forum
3 risposte