It was back in July I first posted about my Nezha RISC-V SBC. At the time I was pleased to have a solid, reliable Debian build and excited with the ability to write native RV assembly programs and run them at the command line without the usual inconvenience of cross-compilation and loading.
I purchased Anthony Reis' (AR) beginners guide to RV assembly which provides a gentle learning curve for me. It starts with a chapter on machine language which is interesting as it describes the format of some types of instructions (). I am hoping not to do too much low level debugging but this info provides an insight into the RV design, in which instructions are standardised to facilitate their implementation on a variety of hardware platforms.
One of the problems with an instructional RV book is that people have a range of environments in which they write programs. Many would use a QEMU RV VM, some would have a smaller RV machine to load executables onto and a lucky few like me have an RV linux SBCfor native compilation. As AR starts on the assembly language tutorials he provides his own program which functions as an RV-32 assembler and simulation environment. This provides input output to the screen using his own bespoke functions. For example two instructions sin and sout are provided to input / output a string to / from a program. A lot of assembly programming deals with peripherals so this isn't very helpful (although it is the correct approach for a general purpose tutorial / textbook).
The first thing I need to do is to work out how to implement the same functionality in my linux / gcc environment so that I don't need to use AR's assembler / io functions. Previously I was able to use Stephen Smith's hello world example which uses a linux system call (ecall) to output a string. Instead of using ecall it is possible to to the call statement, so that you can use the C function name rather than a numeric syscall number. RV registers a0, a1, a2, ... registers are used for the parameters. I was very pleased with my first attempt, shown below, which calls printf to display a string containing an integer parameter. I needed to link it with a linker option "-no-pie" to include the necessary library modules for terminal output.