Entra

View Full Version : qualche piccolo chiarimento sull'assemblea per favore


D4rkAng3l
20-03-2004, 09:59
Salve,
all'università nel corso di Architetture degli elaboratori II stiamo studiando l'assembler del processore MIPS di tipo RISC simulato grazie allo SPIM....avrei bisogno di qualche piccolo chiarimento...

Ma si tratta del processorre dei PowerPc o mi sbaglio?!?...possibile che un'architettura di tipo RISC viene usata per computer di questo tipo?!?!

Gli altri dubbi li ho su un piccolo programmino anche se in asm nulla sembra essere piccolo :eek: :D :mc:

.data # è una direttiva che memorizza ciò che segue nell'area data fino a una nuova direttiva
chiedi_input: .asciiz "Inserisci un intero, il programma calcolerà se è minore o uguale a 6\n"
minoreuguale: .asciiz "Il numero inserito è minore o uguale a 6"
maggiore: .asciiz "Il numero inserito è maggiore di 6"
numero: .word 6 # Metto nel blocco di memoria puntato dall'etichetta numero il valore 6

.text # è una direttiva che memorizza nell'area testo, qui sono contenute le istruzioni
.globl main # è una direttiva che dice che l'etichetta main è di tipo globale quindi visibile all'esterno

main:
la $a0, chiedi_input # Carica in $a0 l'indirizzo di memoria puntato dall'etichetta chiedi_input
li $v0, 4 # Carica in modo immediato il valore 4 nel registro $v0 usato per contenere i parametri delle syscall
syscall # Fa la syscall considerando il parametro 4 precedentemente caricato e STAMPA LA STRINGA

li $v0, 5 # Carica in modo immediato il valore 5 in $v0 per leggere l'input dalla tastiera
syscall # Legge il valore inserito dall'utente e va a sovrascrivere con esso $v0

move $t0, $v0 # $v0 è un registro ad uso specifico quindi per comodità e chiarezza sposto il suo contenuto in $t0 che è ad uso generale

lw $t1, numero # Carico il valore 6 puntato dall'eticheta numero in $t1
ble $t0, $t1, se_minore # Se il contenuto di $t0 è minore di quello di $t1 allora salta al codice puntato dall'etichetta se_minore

la $a0, maggiore
li $v0, 4
syscall
j the_end # Nel caso non avesse fatto il salto stampa il testo puntato dall'etichetta maggiore e termina


se_minore:
la $a0, minoreuguale
li $v0, 4
syscall # Stampa il testo puntato dall'etichetta minoreuguale e termina
j the_end


the_end:
li $v0, 10
syscall # Termina il programma !!!

DUBBI:

1) Quando faccio
la $a0, chiede_input
li $v0, 4
syscall

il computer carica l'indirizzo di memoria puntato dall'etichetta chiede_input nel registro $a0 e poi grazie alla syscall attuata con il parametro 4 stampa il valore contenuto in quell'indirizzo di memoria...vero? Non carica il contenuto dell'indirizzo di memoria puntato dall'etichetta nel registro....ho capito bene?

2) Quando invece leggo una stringa in input e faccio:

li $v0, 5
syscall

il computer attua la syscall con il parametro 5 e legge la stringa in input che poi viene messa nel registro $v0...quindi $v0 viene sovrascritto dal valore inserito dall'utente e non ci sta più dentro il valore 5....giusto?

Grazie

cionci
20-03-2004, 10:10
Il PowerPC è Risc ma non mi sembra sia compatibile con MIPS...
MIPS è una serie storica di microprocessori risc a 32 e 64 bit...
Gli utlimi a 32 bit credo che vangano utilizzati come microcontrollori, mentre quelli a 64 bit sulle workstation SGI...

D4rkAng3l
20-03-2004, 10:16
grazie meille...microcontrllori intendi cose tipo i PIC ? per quanto riguarda il programmino mi sai dire se ho capito bene ? :)

CMQ grazie mille :)

cionci
20-03-2004, 10:18
Sì..di quel genere...

Purtroppo non conosco l'assembler MIPS...

cionci
20-03-2004, 10:19
Se non sbaglio viene usato l'istruction set MIPS viene usato anche da alcune CPU per PDA...

maxithron
20-03-2004, 10:22
un'ottima guida per MIPS:


http://chortle.ccsu.edu/AssemblyTutorial/tutorialContents.html

recoil
20-03-2004, 10:40
mitico MIPS
quando ho qualche minuto edito e rispondo alle tue domande. non lo vedo da 3 anni ma ero abbastanza bravo all'epoca :O


1) Quando faccio
la $a0, chiede_input
li $v0, 4
syscall

il computer carica l'indirizzo di memoria puntato dall'etichetta chiede_input nel registro $a0 e poi grazie alla syscall attuata con il parametro 4 stampa il valore contenuto in quell'indirizzo di memoria...vero? Non carica il contenuto dell'indirizzo di memoria puntato dall'etichetta nel registro....ho capito bene?

carica l'indirizzo. del resto come potrebbe mettere il contenuto di quella locazione di memoria, potenzialmente molto più lungo dei 32 bit che hai a disposizione?

2) Quando invece leggo una stringa in input e faccio:

li $v0, 5
syscall

il computer attua la syscall con il parametro 5 e legge la stringa in input che poi viene messa nel registro $v0...quindi $v0 viene sovrascritto dal valore inserito dall'utente e non ci sta più dentro il valore 5....giusto?

non ricordo se la syscall 5 scriveva nel registro $v0 quindi mi fido di quello che dici. cmq non ci sarebbero problemi a sovrascrivere quel registro :)

D4rkAng3l
20-03-2004, 11:24
grazie ragazzi mi commuove tutta la vostra disponibilità :cry:

misterx
22-04-2004, 21:37
Originariamente inviato da recoil
mitico MIPS
quando ho qualche minuto edito e rispondo alle tue domande. non lo vedo da 3 anni ma ero abbastanza bravo all'epoca :O

molto bene, così se ho bisogno chiedo a te :D