This book is based on the premise that starting with a high level programming language is not the best approach. The reason most students are unsuccessful using a programming language when they encounter it in their first course is because they are forced to memorize a lot of technical details without having any idea why these details are necessary. That is, they do not understand the basic underpinnings of how a computer works. From this basic notion evolves the motivated bottom-up approach found in Patt/Patel'¬"s Introduction To Computing Systems, now in a second edition. The text starts with the logic structures and architecture of a computer and moves up to the application software that runs on it. Every treatment that purports to start at the bottom and work up begins with some abstraction. For Patt/Patel, that abstraction is the switch level behavior of an MOS transistor. From a very short treatment of that abstraction, the book covers in turn: Logic Gates, latches, logic structures (MUX, Decoder, Adder, gated latches), finally culminating in an implementation of memory.
From there, the book moves on to the Von Neumann model of execution, then a simple computer (the LC-3), machine language programming, assembly language and how an assembler works, and then assembly language programming of the LC-3. The LC-3 treatment concludes with a substantial treatment of Physical I/O, including both polling and interrupt-driven I/O, the nature of traps and subroutine calls/returns. The book then moves to the high-level language C, covering recursion, pointers, and finally elementary data structures. The book establishes a foundation that every subsequent course in the computer science or computer engineering curriculum can benefit from and build on.