Texts
This course has no required textbook. See the Notes instead.
1 Background

How to Design Programs, Second Edition (On-line Draft) by Felleisen, Findler, Flatt, Krishnamurthi.
If you have never seen functional programming, particularly type-driven design in functional programming, you should read this book.
This text uses the Racket environment and Racket-like programming languages so it can also serve as a good introduction to the programming language we will be using throughout this course, even if you are familiar with the concepts the book covers.

Computer Systems: A Programmer’s Perspective, Third Edition by Bryant and O’Hallaron.
This book gives an excellent overview of computer systems from a programmer’s perspective. Chapter 3 "Machine-Level Representations of Programs" is particularly relevant, giving a (for our purposes) comprehensive description of the x86-64 architecture we target in this course.