Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    36

    [Assembly MIPS] esercizio su una procedura

    Avrei da fare questo esercizio in Assembly del MIPS:
    Scrivere una procedura (chiamata scarray) in assembly MIPS che prende in input un array di words e ritorna il punteggio totale dell'array. L'array è passato tramite l'indirizzo del primo elemento in $a0 e l'indirizzo dell'ultimo in $a1. Il punteggio totale deve essere ritornato in $v0 ed è la somma dei punteggi relativi agli elementi dell'array. Il punteggio di un elemento si ottiene chiamando la procedura score, passandogli in $a0 il valore dell'elemento, che ritorna in $v0 il punteggio dell'elemento. La procedura score non deve essere scritta, si assume che sia stata scritta da qualcun'altro (ad es. potrebbe far parte di una libreria). Si conosce solamente l'indirizzo, che è la label score, e si sa che la procedura rispetta le convenzioni MIPS per la chiamata di procedure.

    ed io l'ho fatto in questo modo:
    li $v0,0
    subu $sp,$sp,12
    sw $ra,12($sp) #salvo nello stack l'indirizzo di ritorno
    WHILE: bge $a0,$a1,SCARRAY_END
    sw $a0,8($sp) #salvo l'inidirizzo dell'elemento corrente dell'array
    sw $v0,($sp) #salvo l'output
    jal SCORE
    lw $s0,($sp) #assegno ad $s0 l'output della procedura SCORE
    lw $a0,8($sp) #recupero l'inidirizzo dell'elemento corrente dell'array
    add $s0, $s0, $v0 #sommo a $s0 l'output di SCORE
    move $v0,$s0 #assegno a $v0 il valore della precedente operazione
    addi $a0,$a0,4 #passo all'elemento successivo dell'array
    j WHILE
    SCARRAY_END: lw $ra,12($sp)
    addu $sp,$sp,12
    jr $ra

    ed io per testarla ho inserito il tutto sostituendo la chiamata all'ipotetica procedura SCORE con un contatore generico nel ciclo WHILE, in questo programma:
    .data
    dim: .word 4
    v: .word 1,2,3,4
    .text
    la $a0,v
    sll $a1,$a0,2
    li $v0,0
    jal SCARRAY
    j END

    SCARRAY:
    li $v0,0
    subu $sp,$sp,8
    sw $ra,8($sp)
    WHILE: bge $a0,$a1,SCARRAY_END
    sw $a0, ($sp)
    addi $v0,$v0,1
    lw $a0, ($sp)
    addi $a0,$a0,4
    j WHILE
    SCARRAY_END: lw $ra,8($sp)
    addu $sp,$sp,8
    jr $ra
    END:

    ma non funziona perchè va in loop nel WHILE, come mai??

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Credo che bge sia confronto con interi. Credo che ci siano bugs ance cn lo stack.
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    36
    sono riuscito a correggerlo, bge va bene l'errore era solo ne calcolo del puntatore al primo e all'ultimo elemento dell'array!
    Inevce di:
    la $a0,v
    sll $a1,$a0,2
    li $v0,0
    jal SCARRAY
    j END

    ho corretto con:
    lw $a1,dim
    sll $a1,$a1,2
    la $a1,v($a1)
    la $a0,v
    li $v0,0
    jal SCARRAY
    j END

    ed ora funziona

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.