Introducció
El RISC-V és una arquitectura de conjunt d'instruccions (ISA) de codi obert que ha guanyat popularitat per la seva flexibilitat i eficiència. A diferència d'altres arquitectures propietàries com x86 o ARM, RISC-V permet una major personalització i adaptació a diferents necessitats de maquinari.
Objectius del Tema
- Comprendre les característiques bàsiques de l'arquitectura RISC-V.
- Aprendre la sintaxi i les instruccions bàsiques del llenguatge Assembly RISC-V.
- Escriure i executar programes simples en RISC-V.
Característiques de l'Arquitectura RISC-V
Simplicitat i Modularitat
- Simplicitat: RISC-V segueix el principi de disseny RISC (Reduced Instruction Set Computer), que es caracteritza per tenir un conjunt d'instruccions reduït i simple.
- Modularitat: L'ISA de RISC-V és modular, permetent extensions opcionals que poden ser afegides segons les necessitats específiques.
Registres
- Registres Generals: RISC-V té 32 registres generals (x0 - x31), cadascun de 32 bits (en la variant RV32) o 64 bits (en la variant RV64).
- Registre Zero: El registre x0 sempre conté el valor zero.
Tipus d'Instruccions
- Instruccions R: Operacions aritmètiques i lògiques entre registres.
- Instruccions I: Operacions amb constants immediates.
- Instruccions S: Operacions de memòria (emmagatzematge).
- Instruccions B: Instruccions de salt condicional.
- Instruccions U: Instruccions de càrrega d'adreces immediates.
- Instruccions J: Instruccions de salt incondicional.
Sintaxi i Estructura Bàsiques
Format d'Instruccions
Les instruccions en RISC-V segueixen un format consistent. A continuació es mostra el format de les instruccions més comunes:
-
Instruccions R:
opcode rd, rs1, rs2
add x1, x2, x3 # x1 = x2 + x3
-
Instruccions I:
opcode rd, rs1, imm
addi x1, x2, 10 # x1 = x2 + 10
-
Instruccions S:
opcode rs2, offset(rs1)
sw x1, 0(x2) # Mem[x2 + 0] = x1
-
Instruccions B:
opcode rs1, rs2, offset
beq x1, x2, label # if (x1 == x2) jump to label
-
Instruccions U:
opcode rd, imm
lui x1, 0x10000 # x1 = 0x10000 << 12
-
Instruccions J:
opcode rd, offset
jal x1, label # x1 = PC + 4; jump to label
Escrivint el Teu Primer Programa en RISC-V
Exemple: Programa "Hello, World!" en RISC-V
A continuació es mostra un exemple de com escriure un programa simple en RISC-V que imprimeix "Hello, World!" a la consola.
.section .data msg: .asciz "Hello, World!\n" .section .text .globl _start _start: # Load address of msg into a0 la a0, msg # Load syscall number for write (64) into a7 li a7, 64 # Load file descriptor (stdout) into a1 li a1, 1 # Load length of msg into a2 li a2, 14 # Make the syscall ecall # Exit the program li a7, 93 li a0, 0 ecall
Explicació del Codi
- .section .data: Defineix la secció de dades, on es declara el missatge a imprimir.
- .section .text: Defineix la secció de codi, on es troben les instruccions del programa.
- _start: Etiqueta que indica el punt d'entrada del programa.
- la a0, msg: Carrega l'adreça del missatge en el registre a0.
- li a7, 64: Carrega el número de syscall per a l'escriptura (64) en el registre a7.
- li a1, 1: Carrega el descriptor de fitxer per a stdout (1) en el registre a1.
- li a2, 14: Carrega la longitud del missatge en el registre a2.
- ecall: Fa la crida al sistema per a l'escriptura.
- li a7, 93: Carrega el número de syscall per a la sortida (93) en el registre a7.
- li a0, 0: Carrega el codi de sortida (0) en el registre a0.
- ecall: Fa la crida al sistema per sortir del programa.
Exercicis Pràctics
Exercici 1: Suma de Dos Nombres
Escriu un programa en RISC-V que sumi dos nombres i imprimeixi el resultat.
Solució
.section .data num1: .word 5 num2: .word 10 result: .word 0 .section .text .globl _start _start: # Load num1 and num2 into registers lw t0, num1 lw t1, num2 # Add t0 and t1, store result in t2 add t2, t0, t1 # Store result in memory sw t2, result # Exit the program li a7, 93 li a0, 0 ecall
Exercici 2: Bucles i Condicionals
Escriu un programa en RISC-V que compti de 0 a 9 i imprimeixi cada número.
Solució
.section .data msg: .asciz "Number: " num: .word 0 .section .text .globl _start _start: li t0, 0 # Initialize counter to 0 loop: bge t0, 10, end # If counter >= 10, exit loop # Print "Number: " la a0, msg li a7, 64 li a1, 1 li a2, 8 ecall # Print counter value mv a0, t0 li a7, 64 li a1, 1 li a2, 1 ecall # Increment counter addi t0, t0, 1 # Jump back to loop j loop end: # Exit the program li a7, 93 li a0, 0 ecall
Conclusió
En aquest tema, hem explorat les característiques bàsiques de l'arquitectura RISC-V i hem après a escriure programes simples en llenguatge Assembly RISC-V. Hem cobert la sintaxi i les instruccions bàsiques, així com exemples pràctics per reforçar els conceptes apresos. Amb aquesta base, estàs preparat per explorar més a fons les capacitats de RISC-V i aplicar-les en projectes més complexos.
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