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.

© Copyright 2024. Tots els drets reservats