To read a file in the RARS (RISC-V Assembler and Runtime Simulator),
you need to use a sequence of three POSIX-like environment
calls (ecall):
- Open the file (ecall 1024) to get a file descriptor.
- Read from the file (ecall 63) into a memory buffer.
- Close the file (ecall 57) to free up system resources.
Code Example
#=================================================================
# read a file (one-buffer-at-a-time)
# ================================================================
.data
filename: .string "sample.txt" # The file name (must be
# null-terminated)
buffer: .space 2048 # Allocate 2048 bytes of buffer
# space to store contents
.text
.global main
main:
# -------------------------------------------------------------
# STEP 1: Open the file
# -------------------------------------------------------------
li a7, 1024 # System call for open file
la a0, filename # Address of null-terminated string
# containing filename
li a1, 0 # Flags: 0 for read-only
ecall # Execute open
bltz a0, file_error # If a0 is negative, the open failed
mv s0, a0 # Save the file descriptor returned in a0 to s0
# -------------------------------------------------------------
# STEP 2: Read from the file
# -------------------------------------------------------------
li a7, 63 # System call for read from file
mv a0, s0 # Pass the saved file descriptor
la a1, buffer # Address of the buffer to store characters
li a2, 2048 # Buffer length (maximum bytes to read)
ecall # Execute read
bltz a0, read_error # If a0 is negative, the read failed
mv s1, a0 # s1 now holds the actual number of bytes read
# -------------------------------------------------------------
# STEP 3: Close the file
# -------------------------------------------------------------
li a7, 57 # System call for close file
mv a0, s0 # Pass the file descriptor to close
ecall # Execute close
# Optional: Null-terminate the string in buffer to easily print it
la t0, buffer
add t0, t0, s1 # Find end of data (buffer address + bytes read)
sb zero, 0(t0) # Store null-byte at the end
# Optional: Print the buffer to the console to verify it worked
li a7, 4 # System call for print string
la a0, buffer # Load buffer address
ecall
# Exit the program successfully
li a7, 10 # System call for exit
ecall
# Error Handler Branches
file_error:
# Handle file opening failure (e.g., file not found)
li a7, 10
ecall
read_error:
# Handle read execution failure
li a7, 10
ecall