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