By Carl Burch, a professor for Hendrix College in Conway, Arkansas, USA. To contact the author, send e-mail to cburch at cburch dot c o m. [Other books by Carl Burch]

Table of Contents

1. Introduction
   1.1. Overview
   1.2. About this book

2. C: Introduction
   2.1. Basics
   2.2. The printf() function
   2.3. Boolean operators
   2.4. Function prototypes
   2.5. Header files
   2.6. Constants

3. C: Pointers
   3.1. The scanf() function
   3.2. Arrays
   3.3. Writing outside an array
   3.4. Strings
   3.5. Example: Tokenizing a string

4. C: Data structures
   4.1. Dynamic memory
   4.2. Example: Linked list
   4.3. Analysis: Language and library levels

5. Data representation: Integers
   5.1. Binary numbers
   5.2. Integer representation
   5.3. Bit operators
   5.4. Counting one bits

6. Data representation: Floating point
   6.1. Floating-point representation
   6.2. IEEE standard
   6.3. Analysis

7. Circuits: Basic logic
   7.1. Boolean algebra
   7.2. Algebraic laws
   7.3. Converting a truth table

8. Circuits: Simplifying
   8.1. Karnaugh maps
   8.2. A more complex Karnaugh map
   8.3. More logic gates and universality

9. Circuits: Components
   9.1. Adding
   9.2. Routing circuits

10. Circuits: Memory
   10.1. Latches
   10.2. Flip-flops
   10.3. Registers
   10.4. Memory

11. Assembly: Introduction
   11.1. ISA varieties
   11.2. A simple program
   11.3. Another assembly example
   11.4. Summary of instructions so far
   11.5. Another assembly language example

12. Assembly: Memory
   12.1. Basic memory instructions
   12.2. Addressing modes
   12.3. Initializing memory
   12.4. Multiple-register memory instructions

13. Assembly: Subroutines
   13.1. The link register
   13.2. The program stack
   13.3. Calling conventions

14. Caches
   14.1. Memory hierarchy
   14.2. Direct-mapped cache
   14.3. Other cache types
   14.4. Issues with writing
   14.5. Performance issues

15. OS: Introduction
   15.1. Exceptions
   15.2. System calls
   15.3. Handling files
   15.4. Library functions

16. OS: Processes
   16.1. Process table
   16.2. Context switching
   16.3. Preemption
   16.4. Process scheduling
   16.5. Managing processes under Linux

17. OS: Virtual memory
   17.1. Basics
   17.2. Replacement algorithms
   17.3. Implementation issues
   17.4. Analysis: Segments and virtual memory

18. Languages: Optimization
   18.1. Register allocation
   18.2. Peephole optimization
   18.3. Removing jumps
   18.4. Common subexpression elimination
   18.5. Strength reduction
   18.6. Loop unrolling
   18.7. Function inlining
   18.8. Tail recursion
   18.9. Analysis

19. Languages: Garbage collection

20. Languages: OOPS
   20.1. Basics
   20.2. Polymorphism
   20.3. Virtual methods
   20.4. Optimizing
   20.5. Casting
   20.6. Interfaces
   20.7. Analysis