CS 350: Computer Organization & Assembly Language Programming


Instructor: Kyle C. Hale
  Office Hours: M 9:00-11:00AM, or by appointment. (I will use Gather)
  E-mail: khale [at] cs [dot] iit [dot] edu


Andrew Neth (L01/05)
  Office Hours: Friday 11:35AM-3:35PM (Discord)
  E-mail: aneth [at] hawk [dot] iit [dot] edu

Grace Arnold (L02/03)
  Office Hours: TTR 7PM-9PM (Zoom)
  E-mail: garnold [at] hawk [dot] iit [dot] edu

Yuezhi Che (L04)
  Office Hours: W 2PM-4PM (Zoom)
  E-mail: yche3 [at] hawk [dot] iit [dot] edu

Course Info

Course number: CS 350

Semester: Spring 2021

Lecture Time: TTR 3:35PM - 4:50PM

Lecture Location:Zoom

Lab 01 Time: Fri 3:35PM - 4:25PM

Lab 01 Location:Stuart 112J

Lab 02 Time: Fri 3:35PM - 4:25PM

Lab 02 Location:SB 112E

Lab 03 Time: Fri 3:35PM - 4:25PM

Lab 03 Location:SB 112F

Lab 04 Time: Fri 3:35PM - 4:25PM

Lab 04 Location:SB 108

Lab 05 Time: TBD

Lab 05 Location:TBD


This course will be your entry into the world of computer systems. This is where you will begin to see the "nuts and bolts" of computers—how they're designed, how they're implemented, how they're programmed at the lowest levels, and how the whole system fits together. As such, this is a "bottom-up" course. By the end, when you write your high-level programs, whether they're in C, Python, Ruby, Node.js, or brainfuck, you should be able to reason about how the code you write turns into low-level operations on the hardware. You will be able to cut through levels of abstraction to gain a deeper understanding of how computer systems work. After finishing this course, you will no longer take for granted the mesmerizing array of languages and tools that "just work." The path will be open for you to become a practitioner of the dark arts of systems programming who shuns Clarke's third law and who, when in need of a Linux machine, writes it in C.

Note that CS 350 is a required core course for both the CS and CIS undergraduate curriculums


Please do not hesitate to interact with the instructor, the TAs, and your classmates. Do not wait until the last minute to come see your instructor! We will be primarily using Diderot as a course communication mechanism. The lecture schedule, slides, homeworks, quizzes, and exams will be administered through Diderot. In addition, we will be using it as a course communication mechanism.


The following book is the only required textbook for this course. Note that it is also available in a cheaper, e-book form.

Introduction to Computing Systems: From Bits & Gates to C & Beyond (3rd Edition), by Yale Patt and Sanjay Patel, 2020 McGraw-Hill. The text's Student Resources website contains links to the LC-3 Simulator and lab manual.

A classic book on introductory computer architecture. If you'd like to learn more about processor architecture, and would like to learn how to design your own control and datapaths (this book uses MIPS), this is a great resource:

Computer Organization and Design: RISC-V Edition (2nd Edition), by David Patterson and John Hennessy, 2020 Morgan Kauffmann.

A good book dedicated to logic design, which we cover in the first half of this course.

Fundamentals of Logic Design (Enhanced 7th Edition) by Charles Roth and Larry Kinney, 2013 CL Engineering.

This is also a useful book to have on your shelf. It is a bit newer. It does not go into quite as much detail, but does guide you through building your own virtual computer:

The Elements of Computing Systems: Building a Modern Computer from First Principles (2nd Edition), by Noam Nisan and Shimon Schocken, 2021 MIT Press.

This course takes a "bottom-up" approach to programming, in that we start from the principles of digital logic design and computer organization. You'll soon be taking CS 351, which is closely related and complementary to this course. If you want to get ahead, you should consider purchasing this book (you'll need it anyway) and skimming. There is a good deal of overlap, but from a slightly different perspective:

Computer Systems: A Programmer's Perspective (3rd Edition), by Randal Bryant and David O'Hallaron, 2015 Pearson.

Learning the UNIX Environment

At this point, you are probably still used to using a Mac or a Windows system. In the CS world however, if you want to have any hope of being productive, you absolutely must learn to work in a UNIX-like environment (e.g. Linux, FreeBSD). I encourage you to use a desktop hypervisor (such as Parallels, VMware, or VirtualBox ), download a Linux distribution of your choice (Ubuntu, Mint, Debian, Fedora, OpenSUSE, and Arch are good choices), and boot it as a VM to get the lay of the land. We will be using Vagrant extensively in this course. You can also get a UNIX environment on Mac and Windows using Docker. These days Windows 10 also incorporates Windows Subsystem for Linux, which is often more usable than Docker in my experience.

Probably the most useful skill you'll need to acquire is navigation at the UNIX command shell. Here is a good tutorial for that. Here is a nice reference that will allow you to look up commands that you encounter but do not know.

Here is a nice overview of UNIX programming, especially the design philosophies and common themes.

Here is a good book on programming in the UNIX environment, from the lowest levels:

Programming from the Ground Up by Jonathan Bartlett, 2016 CreateSpace Independent Publishing.

For more advanced shell usage and Linux system administration:

Linux Server Hacks: 100 Industrial-Strength Tips and Tools, by Rob Flickenger, 2003 O'Reilly Media.

Other Useful Links and Resources

This is a list of other resources that you might find useful for this class and for doing work in the systems area in general. Feel free to peruse them at your own convenience.


These books are not all technical, but are broadly applicaable to computer systems, science, engineering, and programming.

Programming Pearls (2nd Edition) by Jon Bentley, 1999 Addison-Wesley. A good reference for design patterns and common idioms used in C and C++ programming.
Feynman Lectures on Computation by Richard P. Feynman, 2000 Westview Press. A wonderful series of lectures given by the famous and brillian theoretical physicist. An unusual perspective on computing systems and computation in general. Highly recommended.
Racing the Beam: The Atari Video Computer System (Platform Studies), by Nick Montfort, 2009 MIT Press. A great book about the Atari console and the technical acheivements that made it possible. If you're interested in the intersection of computer systems and game programming, this is a book for you.
The Supermen: The Story of Seymour Cray and the Technical Wizards Behind the Supercomputer, by Charles J. Murray, 1997 Wiley. An engaging narrative about the development of the first supercomputers, from the Army Research Lab's code-breaking machines of WWII to the CDC6600 and the blazing machines from Seymour Cray. If you're interested in the history of computer science and engineering, this is a nice quick read.