1. Mit Hochsprachen erreicht man schneller Ergebnisse und die Programmierung ist einfacher. Die Programme sind strukturierter und einfacher zu verstehen und zu warten; außerdem sind Syntax und Befehle z.B. in C auf jeder Architektur gleich und nur mit Erweiterungen für die jeweilige Architektur versehen, während jede Architektur eigene Assembler-Befehle hat. Dafür kann man in Assembler oft kleinere und schnellere Programme schreiben, die die Vorteile der Architektur voll ausnutzen; dazu ist aber viel Erfahrung nötig. Ein Anfänger wird in den seltensten Fällen eine Funktion in Assembler effizienter implementieren können als ein optimierender Compiler.
2. Mikrocontroller sind heutzutage in fast jedem elektronischen Gerät drinnen, weil sie billiger sind als die Realisierung auch sehr einfacher Funktionalität mit diskreten Bauteilen. Beispiele wären Waschmaschinen, Fernbedienungen, aber auch elektrische Zahnbürsten, usw. Bei Großserien werden aber oft auch anwendungsspezifische Chips verwendet. Signalprozessoren sind oft leistungsstärker als Mikrocontroller und für die schnelle Verarbeitung großer Datenmengen ausgelegt. Beispiele wären z.B. Video- und Bildverarbeitung, also Digitalkameras, etc.
3. Ein Assembler übersetzt die Anweisungen sozusagen 1:1 in Maschinencode; d.h. du programmierst nur mit den Befehlen, die die Hardware direkt anbietet. Assemblerbefehle sind nur leichter zu merkende Buchstabenkürzel für die binären Befehle im Programmcode. Die einzigen Erleichterungen sind oft Makros, sodass man z.B. sprechende Namen verwenden kann, als sich die Register direkt zu merken.
Ein Compiler dagegen erzeugt Maschinencode, der die Funktion erfüllt, die du in der Hochsprache geschrieben hast. Dabei verwendet er die Maschinenbefehle, die auf der jeweiligen Architektur verfügbar sind, und kann auch je nach Einstellung z.B. auf Codegröße oder Geschwindigkeit optimieren. Auch legt er automatisch die Verwendung von Registern etc. für Variablen fest.