Microcontrollers have evolved and expanded into rather
complex and large devices. Complex with respect to integrating
more and more features on chip, and large in the amount of
memory available for program storage. Embedded system
designers were (and are) faced with designing systems that are
feature rich while minimizing time to market. Migrating away
from assembly language to a high-level language was needed.
Assembly language programming is the lowest level approach
to programming microcontrollers. Each microcontroller contains
a set of instructions available to the software engineer to
design and implement programs to meet certain requirements.
Assembly language programming has both good and bad features.
Programs written in assembly language can be small and
fast. Talented software engineers can take advantage of
internal microcontroller resources to optimize memory
utilization and fine tune processor throughput. Many embedded
systems in the past, constrained by cost, have required
microcontrollers with less than adequate memory space. This
takes both time and relies on the software engineers level of
expertise.
Tightly coupled programs can be tremendously difficult to
debug when a defect is present in the software. Not to
mention, maintenance of the software or changing the software
can be a nightmare if the original author of the software
decides to leave.