Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Assembly] chiarimenti

    Ciao,
    Voglio scrivere questo programma da pseudo C a linguaggio assembly che prende in input il parametro n intero e restituisce un intero.

    codice:
    •function calcola (n : integer) : integer;
    •var m,x : integer;
    •begin
    •x := resto di n diviso 3 # usare la divisione del MIPS
    •if (x<2)
    •thenrisultato := 2
    •else m := call(x)# calle’ una funzione data
    •risultato := calcola (m) + calcola (x)
    •end;
    Potete spiegarmi secondo le regole del metodo chiamante e del metodo chiamato dove e quando si devono salvare determinati registri nello stack e quando si devo ripristinare?
    La regola sarebbe:
    Quando il Main chiama Procedura:
    1.Dentro Proc creo spazio, nello stack, per tutte le variabili usate
    2.memorizzo tali variabili nello stack
    QuandoProc rida’ il controllo al Main:
    3.rimetto nei registri utilizzati da Proc i valori iniziali
    4.puliscolo stack

    Inoltre in questo codice che ho trovato online non ho capito esattamente perchè vengono ripristinati i registri due volte.

    codice:
    addi$sp, $sp, -8 # alloco spazio nello stack
    sw$ra, 4($sp)
    sw$a0, 0($sp)
    slti$t0, $a0, 1   # se a0<1, $t0 diventa1
    beq$t0, $zero, Else   # Controllon < 1
    addi$v0, $zero, 1
    lw$a0, 0($sp)
    lw$ra, 4($sp)
    addi$sp, $sp, 8 # aggiorno stack
    jr$ra
    Else: sub $a0, $a0,1 # calcolo n-1
    jal Fatt # chiamo il fattoriale
    lw$a0, 0($sp) # ripristino $a0
    lw$ra, 4($sp) # ripristino $ra
    addi$sp, $sp, 8 # aggiorno stack
    mul$v0, $a0, $v0 # setto il risultaton * fatt (n-1)
    jr $ra
    Cioè riuscite a spiegarmi in modo semplice come procedere con procedure ricorsive e annnidate?


    Grazie

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Intanto il load dei registri viene fatto 2 volte xche una volta è l'if e la seconda è l'else.

    Se lo avessi scritto una sola volta la cpu avrebbe dovuto saltare alla parte di codice in comune e nonstante le cpus siano ottimizzate per i salti sicurmante avrebbe fatto si che la pipeline fosse in qualche modo rinializzata, poi potrebbero esserci motivi di allineamento di codice e roba simile, cs che poi l'architettura della cpu predilige o no. MIPS?
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Perfetto ti ringrazio comunque si MIPS32.

    Inoltre puoi anche dirmi che errore c'è in questo programma? E cosa fa esattamente? non riesco a capirlo.


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Dovresti dirlo tu cosa fa ... e che errore mostra o quale comportamento anomalo ha ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    X questo ho il mio IBAN ma pare faccia moltiplicazioni usando le somme, ad occhio.
    Per gli Spartani e Sparta usa spartan Il mio github

  6. #6
    Originariamente inviato da oregon
    Dovresti dirlo tu cosa fa ... e che errore mostra o quale comportamento anomalo ha ...
    Lo so ma proprio non capisco. Cioè mi sembra che i registri t7 e t8 vengano prima caricati dalla memoria e poi scritti in memoria il che non credo sia giusto.
    Inoltre non capisco una cosa: le due istruzioni di load (lw) che ci sono non si dovrebbero usare per gli array? Oppure in questo caso sono usate per indicare che i registri t6 e t4 sono già in memoria?

  7. #7
    Originariamente inviato da linoma
    X questo ho il mio IBAN ma pare faccia moltiplicazioni usando le somme, ad occhio.
    Come in tuo IBAN? Comunque secondo voi per capire cosa fa mi conviene fare un esempio con parametri costanti tipo 2 e 3? Cioè in questo caso pare che i parametri siano due. Se provo a scorrere il prog mettendo ai parametri 2 e 3 dovrei riuscire a capire che succede?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da christian4488
    Come in tuo IBAN?
    Traduzione di IBAN ... se lo paghi, ti risolve il problema ...

    Comunque secondo voi per capire cosa fa mi conviene fare un esempio con parametri costanti tipo 2 e 3? Cioè in questo caso pare che i parametri siano due. Se provo a scorrere il prog mettendo ai parametri 2 e 3 dovrei riuscire a capire che succede?
    Prova ... ma avresti potuto provare prima di proporre il quesito sul forum ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Infatti ho provato, ma siccome non ho capito comunque cosa fa il prog allora ho chiesto se il metodo unico per capire un programma così era fare una prova con parametri a caso.

    Dunque non puoi dirmi cosa fa e che errori ci sono nel caso ce ne siano?

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    Originariamente inviato da christian4488
    Dunque non puoi dirmi cosa fa e che errori ci sono nel caso ce ne siano?
    Non è un problema di potere: il problema è che il forum non è un luogo in cui buttare codice e chiedere ad altri la spiegazione di quello che fa, cioè non è un servizio di interpretariato, ma tutt'al più uno strumento per ottenere aiuto nell'attività di programmazione, cioè nella stesura del proprio codice sorgente.

    Inoltre, per comprendere un programma basta studiare i principi fondamentali del linguaggio, della piattaforma e dell'architettura di riferimento, e il forum non sostituisce la necessità di documentarsi, né è uno strumento per farlo (per questo ci sono libri, guide, tutorial, ecc.).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.