Usually, I prefer to start with an overview explanation of the responsibilities of hardware vs the responsibilities of software. Then, typically, I'll briefly go over the structure of the software environment and how services are provided. Sometimes it's useful to make small notes about differences between different platforms & architectures. To actually begin the programming lessons, I try to start with binary and move into conversions, bitwise operations, basic arithmetic, etc. Moving forward, I cover basic CPU & memory structure and the execution process. Next begins a quick overview of assembly, minus syntax. The purpose is primarily to go over the important sections, e.g. .data, .code, .text, etc. Afterward, I talk about the compilation process and provide a few interactive examples. Finally, I begin teaching the C language.
I find this process & method works phenomenally well with the majority of people who are actually willing to learn. Covering the early foundation information means that there are far fewer surprises when getting to specific sections like pointers, pointer arithmetic, structures & unions, etc. As well, the more 'complete' foundation lets them move quickly onto any other language that they desire with ease.
Hope this helps. Let me know if there are any other questions.