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 syscall
Exercicis 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 syscall
Exercici 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 syscall
Conclusió
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