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, rs2add x1, x2, x3 # x1 = x2 + x3 -
Instruccions I:
opcode rd, rs1, immaddi 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, offsetbeq x1, x2, label # if (x1 == x2) jump to label -
Instruccions U:
opcode rd, immlui x1, 0x10000 # x1 = 0x10000 << 12 -
Instruccions J:
opcode rd, offsetjal 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
ecallExplicació 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
ecallExercici 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
ecallConclusió
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
