Introducció
El llenguatge Assembly MIPS és utilitzat per programar microprocessadors de l'arquitectura MIPS (Microprocessor without Interlocked Pipeline Stages). Aquesta arquitectura és coneguda per la seva simplicitat i eficiència, i és àmpliament utilitzada en sistemes embeguts, educació i investigació.
Conceptes Bàsics
Registres en MIPS
Els registres són elements fonamentals en l'arquitectura MIPS. Hi ha 32 registres de propòsit general, cadascun amb una funció específica. A continuació es mostra una taula amb alguns dels registres més importants:
| Registre | Nom | Descripció |
|---|---|---|
| $zero | Zero | Sempre conté el valor 0 |
| $at | Assembler | Reservat per a l'assemblador |
| $v0-$v1 | Values | Per a valors de retorn de funcions |
| $a0-$a3 | Arguments | Per a arguments de funcions |
| $t0-$t9 | Temporals | Per a valors temporals |
| $s0-$s7 | Saved | Per a valors que es mantenen |
| $gp | Global | Punt de dades globals |
| $sp | Stack | Punt de la pila |
| $fp | Frame | Punt de marc |
| $ra | Return | Adreça de retorn |
Sintaxi Bàsica
La sintaxi d'instruccions en MIPS segueix el format:
Per exemple, una instrucció per sumar dos registres i emmagatzemar el resultat en un tercer seria:
Aquesta instrucció suma els valors dels registres $t1 i $t2 i emmagatzema el resultat en $t0.
Instruccions Bàsiques
Instruccions Aritmètiques
Les instruccions aritmètiques permeten realitzar operacions matemàtiques bàsiques. A continuació es mostren algunes de les més comunes:
add $t0, $t1, $t2 # $t0 = $t1 + $t2 sub $t0, $t1, $t2 # $t0 = $t1 - $t2 mul $t0, $t1, $t2 # $t0 = $t1 * $t2 div $t0, $t1, $t2 # $t0 = $t1 / $t2
Instruccions de Memòria
Les instruccions de memòria permeten carregar i emmagatzemar dades des de i cap a la memòria. Les instruccions més comunes són lw (load word) i sw (store word):
lw $t0, 0($t1) # Carrega la paraula de la memòria a l'adreça $t1 + 0 a $t0 sw $t0, 0($t1) # Emmagatzema la paraula de $t0 a la memòria a l'adreça $t1 + 0
Instruccions de Control de Flux
Les instruccions de control de flux permeten alterar la seqüència d'execució del programa. Algunes de les més comunes són:
beq $t0, $t1, etiqueta # Salta a 'etiqueta' si $t0 és igual a $t1 bne $t0, $t1, etiqueta # Salta a 'etiqueta' si $t0 no és igual a $t1 j etiqueta # Salta incondicionalment a 'etiqueta'
Exemple Pràctic
A continuació es mostra un exemple complet d'un programa en MIPS que suma dos nombres i emmagatzema el resultat en un tercer registre:
.data
num1: .word 5
num2: .word 10
result: .word 0
.text
main:
lw $t0, num1 # Carrega el valor de num1 a $t0
lw $t1, num2 # Carrega el valor de num2 a $t1
add $t2, $t0, $t1 # Suma $t0 i $t1, emmagatzema el resultat en $t2
sw $t2, result # Emmagatzema el resultat a la memòria (result)
li $v0, 10 # Finalitza el programa
syscallExercicis Pràctics
Exercici 1
Escriu un programa en MIPS que multipliqui dos nombres i emmagatzemi el resultat en un tercer registre.
Solució
.data
num1: .word 3
num2: .word 4
result: .word 0
.text
main:
lw $t0, num1 # Carrega el valor de num1 a $t0
lw $t1, num2 # Carrega el valor de num2 a $t1
mul $t2, $t0, $t1 # Multiplica $t0 i $t1, emmagatzema el resultat en $t2
sw $t2, result # Emmagatzema el resultat a la memòria (result)
li $v0, 10 # Finalitza el programa
syscallExercici 2
Escriu un programa en MIPS que compari dos nombres i emmagatzemi el valor més gran en un tercer registre.
Solució
.data
num1: .word 7
num2: .word 5
result: .word 0
.text
main:
lw $t0, num1 # Carrega el valor de num1 a $t0
lw $t1, num2 # Carrega el valor de num2 a $t1
bge $t0, $t1, greater # Si $t0 >= $t1, salta a 'greater'
sw $t1, result # Emmagatzema $t1 a result
j end # Salta a 'end'
greater:
sw $t0, result # Emmagatzema $t0 a result
end:
li $v0, 10 # Finalitza el programa
syscallConclusió
En aquesta secció hem explorat els conceptes bàsics del llenguatge Assembly MIPS, incloent-hi els registres, la sintaxi bàsica i les instruccions fonamentals. També hem vist exemples pràctics i exercicis per reforçar els conceptes apresos. Amb aquesta base, estàs preparat per aprofundir en temes més avançats i aplicar els teus coneixements en projectes pràctics.
Curs de Programació en Assembly
Mòdul 1: Introducció al Llenguatge Assembly
- Què és el Llenguatge Assembly?
- Història i Evolució de l'Assembly
- Conceptes Bàsics i Terminologia
- Configuració de l'Entorn de Desenvolupament
Mòdul 2: Fonaments del Llenguatge Assembly
- Comprensió de la CPU i la Memòria
- Registres i les Seves Funcions
- Sintaxi i Estructura Bàsiques
- Escrivint el Teu Primer Programa en Assembly
Mòdul 3: Representació de Dades i Instruccions
- Sistemes Binari i Hexadecimal
- Tipus de Dades i Mides
- Instruccions Aritmètiques
- Instruccions Lògiques
Mòdul 4: Flux de Control
Mòdul 5: Conceptes Avançats d'Assembly
- Interrupcions i Crides de Sistema
- Macros i Assembly Condicional
- Assembly Inline en Llenguatges d'Alt Nivell
- Optimització del Codi Assembly
Mòdul 6: Assembly per a Diferents Arquitectures
Mòdul 7: Aplicacions Pràctiques i Projectes
- Escrivint un Bootloader Simple
- Creant un Nucli Bàsic de Sistema Operatiu
- Interfície amb el Maquinari
- Depuració i Perfilat del Codi Assembly
