An Introduction to Assembly Programming with RISC-V is a textbook for programmers that want to learn how to program in assembly language. It leverages the RISC-V ISA to guide the reader through the main concepts of assembly programming and the assembly process.
The book is divided into three parts: I) Fundamental concepts, II) User-level programming, and III) System-level programming.
The first part, “fundamental concepts”, starts by providing a brief overview of how computers are organized and how programs are executed by computers. Then, it discusses how data is represented on modern computers, including how numbers and text are represented, how data is organized on the main memory, and how computer instructions are encoded. Next, it discusses how native programs are generated, the assembly process, and the main elements of object (binary) files, including symbols, labels, and references. Finally, it introduces the main elements of the assembly language and some of the most common assembly directives. It is worth noting that most of the concepts introduced in this part are orthogonal to the RISC-V ISA, i.e., they do not change when programming in assembly language for other ISAs.
The second part, user-level programming, focuses on the implementation of user software, i.e., software that performs operations with data that is located on CPU registers and the main memory. It starts by presenting the basic elements of the RISC-V ISA, including the data types, registers, and instructions. Then, it shows how to use RISC-V instructions to implement basic control-flow sentences, such as conditionals and loops. Finally, it introduces the program stack, shows how to implement routines, and discusses the elements of the ABI and how it facilitates software composition. All examples in this part of the book rely on system calls to perform I/O operations.
The third part focus on system-level programming, including interacting with peripherals and securing the system against faulty or malicious user programs. It starts by presenting how to write code to directly interact with input and output hardware devices and the concept of busy waiting. Then, it motivates the need for hardware interrupts and shows how to program them on RISC-V ISAs. Finally, it discusses privilege levels and how software interrupts and exceptions may be used to protect RISC-V systems from faulty or malicious user programs.