ASM Registri in Assembly MIPS

SaraAP

Utente Iron
12 Maggio 2018
6
4
0
19
Buongiorno, sto studiando il linguaggio Assembly MIPS.
Sto tentando di creare un programma che Stampa una stringa in maiuscolo.
Ogni qualvolta compare la pseudo istruzione load address unita al target in_name, non riesco a capirne la funzione, come in questo caso:
la $a0, in_name
li $a1, 31
li $v0, 8
syscall

Se può essere utile, questo è il programma completo:




Codice:
############### Data segment ##########
.data
nome_prompt: .asciiz "Prego inserisci il tuo nome: \n"
out_name: .asciiz "Il tuo nome in maiuscolo è: "
in_name: .space 31
############ Code segment ##########
.text
.global main
main:
    
     la $a0, nome_prompt
     li $v0, 4
     syscall
    
     la $a0, in_name
     li $a1, 31
     li $v0, 8
     syscall
    
     la $a0, out_name
     li $v0, 4
     syscall
    
     la $t0, in_name
    
loop:
    
     lbu  $t1, 0($t0)
     beqz $t1, exit_loop
     blt $t1, 'a', no_change
     bgt $t1, 'z', no_change
     addiu $t1, $t1, -32
     sb $t1, ($t0)
    
no_change:


     addiu $t0, $t0, 1
     j loop
    
exit_loop:

     la $a0, in_name
     li $v0, 4
     syscall
    
     li $v0, 10
     syscall
 
la $registro, label
esattamente carica l'indirizzo dell'area di memoria riferita alla label, ad esempio, tu hai dichiarato
in_name: .space 31, questo vuol dire che in_name è l'indirizzo del primo byte di questi 31 byte. Quindi se in_name rappresenta l'indirizzo 0x4000 quando fai la $a0, in_name, in $a0 troverai 4000hex.

Con un esempio più semplice forse si capisce di più,
supponiamo di specificare da dove inizia l'area dati dinamica quindi scriviamo:

.data 0x10010000
var1: .byte 3, 2
var2: .byte 4

la var1 è un array di due byte, e var 2 è un solo byte. questi 3 byte sono allocati a partire dall'indirizzo 0x10010000, quindi var1 è proprio pari a questo indirizzo perchè non vi è nulla prima, var2 invece è 0x10010000+2=0x10010002, poichè ci sono i due byte precedenti.
 
  • Mi piace
Reazioni: SaraAP