An Introduction to Assembly Programming with RISC-V

Link to project

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.

Edson Borin
Author: Edson Borin

Prof. Edson Borin is an associate professor at the Institute of Computing at the University of Campinas (Unicamp) and has been working there since 2010. Prior to joining Unicamp, he was a researcher at Intel Labs in California, where he developed dynamic compilation techniques to improve next-generation HW/SW co-designed microprocessors. He also used the microcode compression algorithms he had developed in his PhD thesis to enhance the manufacturing process of Intel microprocessors, earning four divisional recognition awards. At Unicamp, Prof. Borin applies his expertise in modern computer architecture and compilers to optimize the performance and cost of scientific and engineering computing. He leads the Discovery laboratory (https://discovery.ic.unicamp.br/), which is supported by government agencies such as Fapesp, CNPq and Capes, international technology companies like Intel, AMD, Samsung, Motorola, and Cadence/Tensilica, and major Brazilian corporations such as Petrobras. Prof. Borin has authored eight patents, a technical book on assembly programming, and over 100 papers in international conferences and journals. In addition to his research contributions, he has supervised over 22 doctoral and master’s students, many of whom have received recognition for their exceptional theses, dissertations, and papers.