Sostieni il forum con una donazione! Il tuo contributo ci aiuterà a rimanere online!
Immagine

Assembler

Tutto ciò che riguarda l'elettronica digitale, dalla porta not al protocollo midi... e oltre!
Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:Assembler

Messaggio da Dimitree » 17/06/2009, 15:53

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.. :numb1:

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:Assembler

Messaggio da Dimitree » 17/06/2009, 16:14

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!!
Ultima modifica di Anonymous il 17/06/2009, 16:18, modificato 1 volta in totale.

hilkin
Diyer Aiutante
Diyer Aiutante
Messaggi: 90
Iscritto il: 04/03/2009, 12:54
Località: Alonte (VI)

Re:Assembler

Messaggio da hilkin » 17/06/2009, 16:17

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

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:Assembler

Messaggio da Dimitree » 17/06/2009, 16:19

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

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:Assembler

Messaggio da Dimitree » 17/06/2009, 16:58

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  :lol1:


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.

hilkin
Diyer Aiutante
Diyer Aiutante
Messaggi: 90
Iscritto il: 04/03/2009, 12:54
Località: Alonte (VI)

Re:Assembler

Messaggio da hilkin » 17/06/2009, 17:13

Perfetto, sono contento di non essere cosi arrugginito in programmazione anche se per lavoro ormai è da 3 anni che faccio tutt'altro :arf2:

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.

Avatar utente
Dimitree
Diyer Esperto
Diyer Esperto
Messaggi: 425
Iscritto il: 01/09/2006, 23:56

Re:Assembler

Messaggio da Dimitree » 17/06/2009, 21:01

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?

hilkin
Diyer Aiutante
Diyer Aiutante
Messaggi: 90
Iscritto il: 04/03/2009, 12:54
Località: Alonte (VI)

Re:Assembler

Messaggio da hilkin » 17/06/2009, 23:21

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

Avatar utente
Hades
Roger Mayer Jr.
Roger Mayer Jr.
Messaggi: 2615
Iscritto il: 10/09/2008, 11:56
Località: Carpi (MO)

Re:Assembler

Messaggio da Hades » 18/06/2009, 21:37

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...

Rispondi