Introducció
El llenguatge Assembly ARM és utilitzat per programar microprocessadors basats en l'arquitectura ARM, que és àmpliament utilitzada en dispositius mòbils, sistemes embeguts i altres aplicacions de baix consum. En aquest mòdul, aprendrem els conceptes bàsics de l'Assembly ARM, incloent-hi la seva sintaxi, instruccions bàsiques i com escriure programes senzills.
Continguts
- Arquitectura ARM
- Registres ARM
- Instruccions Bàsiques
- Mode de Direccionament
- Escrivint el Primer Programa en ARM Assembly
- Exercicis Pràctics
- Arquitectura ARM
L'arquitectura ARM és una arquitectura RISC (Reduced Instruction Set Computing), la qual cosa significa que utilitza un conjunt d'instruccions reduït i optimitzat per a una execució ràpida i eficient.
Característiques Clau:
- Conjunt d'Instruccions Reduït: Menys instruccions, però més simples i ràpides.
- Registres Multipropòsit: Un gran nombre de registres que poden ser utilitzats per a diverses operacions.
- Pipeline: Execució de múltiples instruccions simultàniament per millorar el rendiment.
- Registres ARM
Els registres són elements de memòria d'alta velocitat dins de la CPU. En ARM, tenim diversos registres generals i alguns registres especials.
Registres Generals:
- R0-R12: Registres d'ús general.
- R13 (SP): Punter de pila (Stack Pointer).
- R14 (LR): Registre de retorn (Link Register).
- R15 (PC): Comptador de programa (Program Counter).
Registres Especials:
- CPSR: Registre d'estat del programa actual (Current Program Status Register).
- Instruccions Bàsiques
Les instruccions en ARM Assembly són molt similars a altres llenguatges Assembly, però amb algunes particularitats.
Instruccions de Moviment:
Instruccions Aritmètiques:
ADD R2, R0, R1 ; Suma el valor de R0 i R1, i guarda el resultat en R2 SUB R3, R2, #5 ; Resta 5 del valor de R2, i guarda el resultat en R3
Instruccions Lògiques:
AND R4, R0, R1 ; Realitza una operació AND entre R0 i R1, i guarda el resultat en R4 ORR R5, R0, R1 ; Realitza una operació OR entre R0 i R1, i guarda el resultat en R5
- Mode de Direccionament
El mode de direccionament defineix com es calcula l'adreça de l'operand. En ARM, tenim diversos modes de direccionament.
Direccionament Immediat:
Direccionament Registral:
Direccionament Indirecte:
LDR R2, [R0] ; Carrega el valor de la memòria apuntada per R0 a R2 STR R2, [R1] ; Emmagatzema el valor de R2 a la memòria apuntada per R1
- Escrivint el Primer Programa en ARM Assembly
A continuació, escriurem un programa senzill que suma dos nombres i emmagatzema el resultat en un registre.
Exemple de Codi:
.section .data num1: .word 5 num2: .word 10 .section .text .global _start _start: LDR R0, =num1 ; Carrega l'adreça de num1 a R0 LDR R1, [R0] ; Carrega el valor de num1 a R1 LDR R0, =num2 ; Carrega l'adreça de num2 a R0 LDR R2, [R0] ; Carrega el valor de num2 a R2 ADD R3, R1, R2 ; Suma els valors de R1 i R2, i guarda el resultat en R3 MOV R7, #1 ; Crida al sistema per sortir SWI 0 ; Interrupció de software
Explicació del Codi:
- .section .data: Defineix la secció de dades.
- num1, num2: Defineix dues variables amb valors 5 i 10.
- .section .text: Defineix la secció de codi.
- _start: Punt d'entrada del programa.
- LDR: Carrega valors de memòria a registres.
- ADD: Suma els valors de dos registres.
- MOV, SWI: Instruccions per sortir del programa.
- Exercicis Pràctics
Exercici 1:
Escriu un programa en ARM Assembly que multipliqui dos nombres i emmagatzemi el resultat en un registre.
Solució:
.section .data num1: .word 3 num2: .word 4 .section .text .global _start _start: LDR R0, =num1 ; Carrega l'adreça de num1 a R0 LDR R1, [R0] ; Carrega el valor de num1 a R1 LDR R0, =num2 ; Carrega l'adreça de num2 a R0 LDR R2, [R0] ; Carrega el valor de num2 a R2 MUL R3, R1, R2 ; Multiplica els valors de R1 i R2, i guarda el resultat en R3 MOV R7, #1 ; Crida al sistema per sortir SWI 0 ; Interrupció de software
Exercici 2:
Escriu un programa en ARM Assembly que realitzi una operació lògica XOR entre dos nombres i emmagatzemi el resultat en un registre.
Solució:
.section .data num1: .word 6 num2: .word 9 .section .text .global _start _start: LDR R0, =num1 ; Carrega l'adreça de num1 a R0 LDR R1, [R0] ; Carrega el valor de num1 a R1 LDR R0, =num2 ; Carrega l'adreça de num2 a R0 LDR R2, [R0] ; Carrega el valor de num2 a R2 EOR R3, R1, R2 ; Realitza una operació XOR entre R1 i R2, i guarda el resultat en R3 MOV R7, #1 ; Crida al sistema per sortir SWI 0 ; Interrupció de software
Conclusió
En aquest mòdul, hem après els conceptes bàsics del llenguatge Assembly ARM, incloent-hi la seva arquitectura, registres, instruccions bàsiques i modes de direccionament. També hem escrit alguns programes senzills per consolidar els nostres coneixements. En el següent mòdul, explorarem altres arquitectures d'Assembly, com MIPS i RISC-V.
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