Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Assembly Mips : procedure annidate

    Utilizzando QtSpim, scrivere un programma che legga due interi non negativi x e y e visualizzi su console il loro prodotto prod(x,y) = { 0 se y=0 oppure somma(x,prod(x,y-1)) }
    somma(x,y)= { x se y=0 oppure [1+ somma(x,y-1)] }


    #Es_2 (procedura prod sum)
    .data
    risultato: .asciiz "\nIl risultato è "
    inserisci1: .asciiz "\n Inserire il primo numero numero x : "
    inserisci2: .asciiz "\n Inserire il secondo numero numero y : "
    .text
    .globl main


    prod:
    sub $sp, $sp,12 #si crea l'area di memoria per la procedura
    sw $a0, 4($sp) #essendo ricorsiva, memorizza l'intero passato come argomento
    sw $a1, 8($sp) #essendo ricorsiva, memorizza l'intero passato come argomento
    sw $ra, 0($sp) #essendo ricorsiva, salvo il registro di ritorno $ra nella pila
    beq $a1, $zero, zero #se l'intero è zero devo ritornare questo valore
    sub $a1,$a1,1
    sw $a1, 8($sp)
    jal sum
    move $a0,$v0
    jal prod
    lw $ra, 0($sp)
    move $v0,$a0
    addi $sp, $sp, 12 #ripristino dello stack
    jr $ra


    sum:
    lw $ra, 0($sp)
    #lw $a1, 8($sp)
    #lw $a0, 4($sp)
    beq $a1,$zero, x
    sub $a1,$a1,1
    sw $a1, 8($sp)
    addi $a0,$a0,1
    sw $a0, 4($sp)
    jal sum
    move $v0,$a0
    jr $ra


    x:
    lw $ra, 0($sp) #prima di tutto recupero l'indirizzo di ritorno e lo carico in $ra
    addi $sp, $sp, 16 #ripristino lo stack sommando il numero di byte che gli avevo sottratto all'inizio della procedura
    move $v0, $a0 #ritorno il valore di x
    jr $ra #torno al chiamante



    zero: #oltre a ritornare il valore zero devo anche ripristinare lo stack

    lw $ra, 0($sp) #prima di tutto recupero l'indirizzo di ritorno e lo carico in $ra
    addi $sp, $sp, 16 #ripristino lo stack sommando il numero di byte che gli avevo sottratto all'inizio della procedura
    li $v0, 0 #ritorno il valore zero
    jr $ra #torno al chiamante


    ############################## procedura main


    main:
    li $v0, 4
    la $a0, inserisci1
    syscall


    #si legge l'intero scelto dall'utente
    li $v0, 5
    syscall


    move $a0, $v0 #l'intero scelto si passa come parametro alla procedura

    li $v0, 4
    la $a0, inserisci2
    syscall

    #si legge l'intero scelto dall'utente
    li $v0, 5
    syscall


    move $a1, $v0 #l'intero scelto si passa come parametro alla procedura

    jal prod

    move $t0, $v0 #si copia il valore in $t0 perchè $v0 deve essere usato per la syscall


    li $v0, 4
    la $a0, risultato
    syscall


    #si stampa il valore copiandolo da $t0 in $a0
    li $v0, 1
    move $a0, $t0
    syscall


    #uscita dal programma
    li $v0, 10
    syscall


    non capisco perchè al momento della chiamata alla procedura, in a0 ovvero x mi metta 26milioni ?
    sapete dirmi dov'è lo sbaglio ?
    grazie!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Parli di questa linea

    la $a0, inserisci1

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    quella mi serve per stampare la stringa, ma dopo faccio li
    $v0, 5

    syscall

    move $a0, $v0
    per passare il valore letto alla procedura ma a quanto pare non fa.. sai dirmi perchè ?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Intendi in questa parte di codice

    move $a0, $v0 #l'intero scelto si passa come parametro alla procedura

    li $v0, 4
    la $a0, inserisci2
    syscall

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    si secondo me è li l'errore perchè quando faccio debag invece che passare il valore assegnato alla procedura gli passa 268501049
    non so perchè..

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Scusa ... ma se subito dopo la move scrivi

    la $a0, inserisci2

    è ovvio che in a0 non hai più quello che ti aspetti ... no?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    si hai ragione.. però come faccio allora a passare due parametri ad una procedura?
    devo mettere una

    jal prod

    prima di

    la $a0, inserisci2
    ?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Utilizza lo stack oppure due registri diversi da v0 a0
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    fatto, grazie.
    ora il problema è se metto x=3 e y=2 dovrebbe uscire 6 invece esce 4 perchè le procedure le fa solo una volta..

  10. #10
    mi spiego meglio:

    credo che la procedura sum la deva fare n volte fino a quando y non è zero vero ?
    o mi sbaglio..

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.