From the course catalog:
CSE 351: The Hardware/Software Interface (4) - Examines key computational abstraction levels below modern high-level languages; number representation, assembly language, introduction to C, memory management, the operating-system process model, high-level machine architecture including the memory hierarchy, and how high-level languages are implemented. Prerequisite: CSE 143.
This course should develop students’ sense of “what really happens” when software runs — and that this question can be answered at several levels of abstraction, including the hardware architecture level, the assembly level, the C programming level, and the Java programming level. The core around which the course is built is C, assembly, and low-level data representation, but this is connected to higher levels (roughly how basic Java could be implemented), lower levels (the general structure of a processor), and the role of the operating system (but not how the operating system is implemented).
For (computer science) students wanting to specialize at higher levels of abstraction, this could in the extreme be the only course they take that considers the “C level” and below. However, most students will take a subset of Systems Programming (CSE333), Operating Systems (CSE451), Compilers (CSE401), Computer Networks (CSE461), etc.
For students interested in hardware, embedded systems, computer engineering, computer architecture, etc., this course is an introductory course along with the hardware courses Digital Design (CSE369) and Digital Circuits (EE371). More advanced courses of particular interest are Software for Embedded Systems (CSE474, formerly CSE466), Computer Architecture I (CSE469), Computer Architecture II CSE470, etc.
Note that even more important than the topics at various levels of abstraction is the connection between them: students should get an informal sense of how Java could be translated to C, C to assembly, and assembly to binary.