The old, somehow abandoned Assembler programming comes to light again: “machine code to machine code and assembler to the assembler.” In the context of re-baselining electronics, particularly developing new CPUs in Europe, engineers and software developers need to familiarise themselves with this niche yet omnipresent technology: every code you write, compile, and execute goes directly or indirectly into machine code.
Besides developing new products and the related need for compilers and tools, the assembler language is essential to generating compact, rapid implementations of algorithms: it gives software developers a powerful tool of absolute control over the hardware, mainly the CPU. To put it a bit tongue-in-cheek, you never know what the future holds. If the machines take over, we should at least speak their language.
Assembler programming applies to specific groups of tasks and algorithms. Using pure assembler to implement, e.g., a user interface is possible but not advisable. Nowadays, assembler programming is commonly integrated with high-level languages and is part of the application's code, responsible for rapid, efficient data processing without higher-level language overhead. This applies even to applications that do not run directly on the hardware but rather use virtual environments and frameworks (either interpreted or hybrid) such as Java, .NET languages, and Python.
It is a rule of thumb that the simpler and more constrained the device is, the closer the developer is to the hardware. An excellent example of this rule is development for an ESP32 chip: it has 2 cores that can easily handle Python apps, but when it comes to its energy-saving modes, when only the ultra-low power coprocessor is running, the only programming language available is assembler; it is compact enough to run in very constrained environments, using microamperes of current and fitting only a few hundred bytes.
This book is divided into four main chapters:
The following chapters present the contents of the coursebook: