This page collects together all of the “outcomes” associated with individual modules. Outcomes identify what students will know and be able to do if they master the material.

The course-specific student learning outcomes (SLOs) this this course are:

- Students understand the underlying principle behind machine-level data representations, computing, and programming.
- Students are proficient with assembly programming for the x86 architecture, including register operations, control structures, bitwise operations, and subprograms.
- Students understand the underlying principles behind compiling, linking, loading, and debugging.
- Students gain some hands-on experience with developing a small compiler.

The student learning outcomes (SLOs) for this course that are part of the SLOs for the entire Computer Science program, are:

- [A] Students can apply knowledge of computing and mathematics appropriate to the discipline.
- [B] Students can analyze a problem, and identify and define the computing requirements appropriate to its solution
- [C] Students can design, implement, and evaluate a computer-based system, process, component, or program to meet desired needs
- [I] Students can use current techniques, skills, and tools necessary for computing practice

- Develop a sense of the historical developments that have led to the computers we have today
- Understand the principle of the Von Neuman architecture
- Understand the concept of an Instruction Set Architecture (ISA)

*Referencing modules:*
Computer Architecture

- Master conversions between bases and additions in different bases
- Understand how integers are stored in computers, differentiating unsigned and signed numbers
- Understand how to do size conversions of numbers
- Understand numerical overflow

*Referencing modules:*
Data Size & Arithmetic,
Integers & Computers

*Assessed by:*

- Understand the history and significance of the X86 architecture
- Know the X86 registers
- Understand the concept of segmenting

*Referencing modules:*
X86 & NASM

- Understand the directives to define .data and .bss segments with NASM
- Understand Endianness
- Be able to trace programs with arbitrary memory/arithmetic operations
- Understands the basics of assembly instructions mov, add, sub, inc, and dec

*Referencing modules:*
X86 & NASM

- Be able to develop assembly programs using a main classes of instructions and programming idioms.

*Referencing modules:*
Bit Operations,
Control Structures,
Data Size & Arithmetic,
First NASM Program,
Subprograms

*Assessed by:*

- Understand some of the relations between high-level programming languages and assembly language

*Referencing modules:*
Bit Operations,
Compiling,
Data Size & Arithmetic,
Subprograms

*Assessed by:*

- Understand how the stack is used to implement subprograms and structured as activation records and how it is managed at runtime

*Referencing modules:*
Subprograms

*Assessed by:*

- Understand the general goals and principle of a compiler, including the lexer and the parse.
- Understasnd the principles of regular languages (as described by finite automata and regular expressions) and of context-free languages (as described by context-gree grammars).
- Gain some basic experience developing a compiler with ANTLR.

*Referencing modules:*
Compiling

- Understand the basic principle of linking and the format of object file (in particular the relocation table and the symbol table)
- Understand the basic principle of loading

*Referencing modules:*
Linking & Loading

- Understand how a debugger works and how it is useful
- Be familiar with standard debuggers like gdb and tools like valgrind

*Referencing modules:*
Debugging