Nobody writes programs in machine language any more, and the amount of assembly language programming done in industry is limited. However, learning those two languages is still the best way to learn about what's "under the hood" of a given microcontroller (ìC) and prepare one for good high-level language programming. Debugging is often performed at the assembly level even for high-level language programs (which is usually C for ìCs). All compilers will generate assembly listings for the code they generate so the programmer can see the details of the code they produce. Hard to find bugs usually require inspecting the program logic at that level. Therefore, any ìC programmer should be able to read and understand assembly language code. Many people (this author included) believe the best way (arguably the only way) to become good at reading assembly language is to program in it. The best introduction to assembly language is to first look at a few programs written in machine language. It helps provide a better understanding of the ìC architecture, and an understanding of the purpose of many of the features that exist in assembly.
What do I mean by the architecture of a ìC? It is the detailed functional description (what it does – not how it does it) of the ìC. It is not necessary to understand anything about how to build a ìC in order to understand its architecture. It is, however, necessary to understand its architecture in order to either design the hardware for it, or to program it in assembly. In fact, you have to know a lot about the architecture of the I / O, timer, and possibly the interrupt subsystems even to program a ìC in C. Designing computers is the subject of other courses. Programming a ìC (and interfacing it to the world) is the subject of this course. Learning our ìC's architecture is the first step. The main components of the architecture of a given ìC is the description of its CPU, its memory organization, its processor control registers, I / O registers, and timer subsystems registers that exist. These later three are usually memory-mapped registers.