The ability to understand assembly language is a difficult but essential skill for developers of embedded applications. Even developers who write their applications in a high level language like C will sometimes need to examine assembly code for debugging or performance tuning. Assembly language for the IA-32 and Intel 64 architectures is especially challenging to read and understand due to the size and variety of the instruction sets. This paper will impart a basic understanding of assembly language and the IA-32 and Intel 64 instruction sets so that the reader will feel comfortable diving down to the assembly level when necessary.