Assembler (software)

Een assembler is een computerprogramma om een ander computerprogramma dat geschreven is in assembleertaal naar machinetaal om te zetten. De code in machinetaal kan direct door een processor worden uitgevoerd. De assembleertaal wordt zelf ook wel assembler genoemd, maar dat is eigenlijk verkeerd. Assembleren betekent vrijwel letterlijk samenstellen. De taak van de assembler is dan ook het samenstellen van instructies, die door de processor kunnen worden uitgevoerd: de opcodes met hun eventuele operanden aan de hand van de assembleertaal.

Een assembleertaal is een programmeertaal die maar weinig van de machinetaal verschilt, maar die door het gebruik van mnemonics in plaats van getalswaarden gemakkelijker is te begrijpen. De assembler is tegenwoordig meestal in een hogere programmeertaal geschreven, bijvoorbeeld in C++. Assemblers waren in het verleden over het algemeen in de assembleertaal van de doelmachine geschreven. Indien een programma op een andere machine werd geassembleerd met een ander type processor of in een hogere taal werd gesproken over een cross-assembler.

Uitvoerbare code 
De meeste assemblers geven als uitvoer een objectbestand. Gebruikelijke extensies daarbij zijn .obj en .o. Een objectbestand moet in een uitvoerbaar bestand worden omgezet, bijvoorbeeld een .exe of een ELF-executable onder Unix-varianten, voordat het kan worden uitgevoerd. Dit doet men door te linken. Met het linken kunnen ook twee of meer object-bestanden worden samengevoegd. Doordat compilers van hogere programmeertalen in het algemeen ook objectbestanden leveren, kan men zo een gemengd project maken. Het besturingssysteem, zoals Mac OS, Linux, DOS of Windows, schrijft voor hoe het objectformaat is en biedt dan ook de linker aan.

Programma's voor embedded processoren worden vaak direct in uitvoerbare vorm gegenereerd. Dit kan een zogenaamd image zijn, waar byte voor byte dezelfde code in zit als in de processor komt te staan. Het kan ook een leesbaar tekstbestand zijn, die de inhoud als hexadecimale codes bevat en verdere informatie, zoals het adres waar de code komt te staan. De twee bekendste bestandsformaten zijn het Motorola S-formaat en het Intel hex-formaat. Deze formaten worden ook wel vanuit een objectbestand gegenereerd.

Assembleren en disassembleren 
De begrippen assembler en disassembler horen bij elkaar. Assemblers en disassemblers worden vaak gecombineerd, zo bevatte bijvoorbeeld DEBUG.EXE, geleverd met MS-DOS en tot aan Windows 7 nog in elke Windowsversie aanwezig, beide. Ze zijn een onderdeel van elk pakket waarmee embedded systemen worden ontwikkeld, maar ook veel geïntegreerde ontwikkelsystemen voor hogere programmeertalen bevatten een disassembler.

Assemblers 
Enkele assemblers voor de Intel-x86-familie zijn:

 De Microsoft Macro Assembler (MASM) probeert assembly meer op een hogere programmeertaal te laten lijken en heeft daardoor een soms vreemde syntaxis. Deze assembler was een van de eerste assemblers voor de x86.
 De Turbo Assembler (TASM) van Embarcadero (vroeger van Borland) kent behalve de MASM-syntaxis ook een eigen syntaxis. Deze assembler was er ook vroeg bij en is daarom ook vaak de keuze van de oude garde.
 De Netwide Assembler (NASM), een assembler met een eenvoudige syntaxis. Deze opensourcesoftware is geschikt voor mensen die alles in de hand willen houden. Deze assembler is geschikt voor het schrijven van de bootloader van een besturingssysteem vanwege de perfecte controle over het resultaat.
 YASM, een compleet herschreven versie van NASM, wordt onder de BSD-licentie uitgebracht. Belangrijkste eigenschappen zijn de ondersteuning van de x86-64-instructieset en de bijbehorende uitvoer van PE COFF64 en ELF64-bestandsformaten, naast (PE) COFF(32), ELF32 en BIN.
 De Flat Assembler (FASM) is ook een opensource-assembler en ondersteunt de x86-64-instructieset ook.

Iedere familie van microprocessors heeft zijn assemblers. Dit geldt bijvoorbeeld voor Microchip (PIC), Freescale voorheen Motorola, Renesas voorheen onder andere Mitsubishu, Atmel, ARM.

De bekende GNU Compiler Collection GCC vertaalt altijd de hogere code, bijvoorbeeld C, eerst naar assembly, niet direct in objectcode. Dit betekent dat voor elke processor waarvoor GCC is geïmplementeerd, er een assembler ter beschikking moet staan.

Programmeerhulpmiddel