Assembler
Re:Assembler
grazie mille hilkin, provo a simularlo io!
la funzione li è un load immediate, che carica nel registro di destinazione un valore immediato.. in questo caso quindi dovremmo usare la move..
la funzione li è un load immediate, che carica nel registro di destinazione un valore immediato.. in questo caso quindi dovremmo usare la move..
Re:Assembler
provato, ma mi sa ho sbagliato qualcosa nel sostituire quel LI..perchè ora come output mi da 1 in continuazione e non si ferma più..
EDIT: avevo sbagliato una cosa, il programma non terminava più, ora ho corretto e funziona
però calcola il numero di fibonacci del numero precedente a quello inserito in input..
per esempio, inserisco 12, e mi calcola 144, che è il fibonacci di 11..
ora provo a vedere dove va corretto
intanto grazie mille!!
EDIT: avevo sbagliato una cosa, il programma non terminava più, ora ho corretto e funziona
però calcola il numero di fibonacci del numero precedente a quello inserito in input..
per esempio, inserisco 12, e mi calcola 144, che è il fibonacci di 11..
ora provo a vedere dove va corretto
intanto grazie mille!!
Ultima modifica di Anonymous il 17/06/2009, 16:18, modificato 1 volta in totale.
Re:Assembler
puo anche darsi che ho sbagliato io, non fidarti ciecamente di me che in fin dei conti ti ho dato un programma non verificato fatto con un linguaggio che non conosco, adesso lo riguardo
Re:Assembler
no no hilkin, avevo sbagliato io..ecco ora ho editato il mio post perchè ho riprovato a eseguirlo con delle modifiche al main e non alla tua funzione
Re:Assembler
scusate per la fretta..altri errori miei.. red_face
la funzione è perfetta hilkin!! funziona come dovrebbe!
grazieee
ora provo a farne qualcuna io vediamo se sono autonomo con la ricorsione
ora mi chiedo..come faccio a valutare più parametri? per esempio qui abbiamo avuto il caso base x=0 oppure x=1, ma se io avessi bisogno di un caso base così:
se x>=0 o y>=0 o z>=0
come faccio?
la funzione è perfetta hilkin!! funziona come dovrebbe!
grazieee
ora provo a farne qualcuna io vediamo se sono autonomo con la ricorsione
ora mi chiedo..come faccio a valutare più parametri? per esempio qui abbiamo avuto il caso base x=0 oppure x=1, ma se io avessi bisogno di un caso base così:
se x>=0 o y>=0 o z>=0
come faccio?
Ultima modifica di Anonymous il 17/06/2009, 17:09, modificato 1 volta in totale.
Re:Assembler
Perfetto, sono contento di non essere cosi arrugginito in programmazione anche se per lavoro ormai è da 3 anni che faccio tutt'altro
Come funzione ti ritrovi? In realtà è pochissimo diversa dall'altra, solo fa due chiamate ricorsive quindi bisogna salvare in stack i valori intermedi. Io gestisco lo stack in maniera diversa da come era gestito nella funzione postata da te, e probabilmente in maniera non efficiente per questa piattaforma, sono rimasugli della programmazione su processori cisc e non risc come dovrebbe essere questo.
ps: la numerazione torna adesso? Comunque resto a disposizione se ti serve una mano.
Comunque Il mio consiglio è di imparare bene la programmazione assembler, anche se il funzionamento intrinseco dei processori e il linguaggio assembler non trovano molto posto nella scuola italiana ti posso assicurare che per essere dei buoni programmatori con i linguaggi di alto livello bisogna conoscere bene come funziona la piattaforma su cui si sviluppa. Questo vale per tutti i linguaggi a parte java in cui invece devi conoscere bene come funziona la macchina virtuale.
Come funzione ti ritrovi? In realtà è pochissimo diversa dall'altra, solo fa due chiamate ricorsive quindi bisogna salvare in stack i valori intermedi. Io gestisco lo stack in maniera diversa da come era gestito nella funzione postata da te, e probabilmente in maniera non efficiente per questa piattaforma, sono rimasugli della programmazione su processori cisc e non risc come dovrebbe essere questo.
ps: la numerazione torna adesso? Comunque resto a disposizione se ti serve una mano.
Comunque Il mio consiglio è di imparare bene la programmazione assembler, anche se il funzionamento intrinseco dei processori e il linguaggio assembler non trovano molto posto nella scuola italiana ti posso assicurare che per essere dei buoni programmatori con i linguaggi di alto livello bisogna conoscere bene come funziona la piattaforma su cui si sviluppa. Questo vale per tutti i linguaggi a parte java in cui invece devi conoscere bene come funziona la macchina virtuale.
Re:Assembler
si si ora la numerazione torna, prima no perchè avevo controllato le soluzioni della serie di fibonacci su un sito internet ma erano sbagliati.. Poi me lo sono scritto in C e ho trovato le soluzioni giuste e ho visto che il tuo programma le calcolava correttamente..
con il tuo modo di allocare/salvare l'ho capito meglio, penso che userò questo tuo metodo perchè è più chiaro e bisogna fare meno conti..
ora mi chiedo..come faccio a valutare più parametri? per esempio qui abbiamo avuto il caso base x=0 oppure x=1, ma se io avessi bisogno di un caso base così:
se x>=0 o y>=0 o z>=0
con la funzione che riceve come parametri x y e z
come faccio?
con il tuo modo di allocare/salvare l'ho capito meglio, penso che userò questo tuo metodo perchè è più chiaro e bisogna fare meno conti..
ora mi chiedo..come faccio a valutare più parametri? per esempio qui abbiamo avuto il caso base x=0 oppure x=1, ma se io avessi bisogno di un caso base così:
se x>=0 o y>=0 o z>=0
con la funzione che riceve come parametri x y e z
come faccio?
Re:Assembler
fai conto di avere x in $a0, y in $a1 e z in $a2 spero che questi registri esistano tutti in questa architettura
Facciamo però il caso in cui x>=1, y>=1 e z>=1 perchè essendo interi unsigned non serve testarli per >=0 perchè sarebbe sempre verificato
il confronto lo puoi fare cosi:
slti $t0, $a0, 1 #decide se $a0 è minore di 1
slti $t1, $a1, 1 #decide se $a1 è minore di 1
slti $t2, $a2, 1 #decide se $a2 è minore di 1
and $t0, $t0, $t1 #fa la and di $t0 e $t1
and $t0, $t0, $t2 #fa la and del precedente con $t2
nor $t2, $t1, $t1 #preaparo una variabile negata di $t1
and $t1, $t1, $t2 #in $t1 ci sarà il valore FALSE
beq $t0, $t1, base #salta a base nel caso in cui in $t0 ci sia il valore FALSE
I comandi li ho trovati in questa pagina, quindi non so se sono giusti:
http://it.wikiversity.org/wiki/ISA_e_Li ... semby_MIPS
Sicuramente c'è qualche modo più furbo di fare la stessa cosa, ma non conosco l'architettura quindi mi sono arrangiato con quello che ho trovato. Attenzione che lavora in logica negata, quindi fa la and dei negati per far saltare fuori la or negata, secondo la legge di moore. Sapendo come è rappresentato il valore false sicuramente si può fare qualcosa di meglio
Facciamo però il caso in cui x>=1, y>=1 e z>=1 perchè essendo interi unsigned non serve testarli per >=0 perchè sarebbe sempre verificato
il confronto lo puoi fare cosi:
slti $t0, $a0, 1 #decide se $a0 è minore di 1
slti $t1, $a1, 1 #decide se $a1 è minore di 1
slti $t2, $a2, 1 #decide se $a2 è minore di 1
and $t0, $t0, $t1 #fa la and di $t0 e $t1
and $t0, $t0, $t2 #fa la and del precedente con $t2
nor $t2, $t1, $t1 #preaparo una variabile negata di $t1
and $t1, $t1, $t2 #in $t1 ci sarà il valore FALSE
beq $t0, $t1, base #salta a base nel caso in cui in $t0 ci sia il valore FALSE
I comandi li ho trovati in questa pagina, quindi non so se sono giusti:
http://it.wikiversity.org/wiki/ISA_e_Li ... semby_MIPS
Sicuramente c'è qualche modo più furbo di fare la stessa cosa, ma non conosco l'architettura quindi mi sono arrangiato con quello che ho trovato. Attenzione che lavora in logica negata, quindi fa la and dei negati per far saltare fuori la or negata, secondo la legge di moore. Sapendo come è rappresentato il valore false sicuramente si può fare qualcosa di meglio
Re:Assembler
Ricorda che se hai altre funzioni che precedono questa devi inizializzare i registri ad un valore conosciuto, normalmente 0... altrimenti il registro risulta null e la funzione da' errore. Almeno questo sull'architettura mips reale, il simulatore forse la inizializza automaticamente alla prima chiamata e ti da' un warning...
Live another day, climb a little higher, find another reason to stay...