Assembler
Uit Wikipedia, de vrije encyclopedie
Een assembler is een programma dat een programma in assembleertaal omzet naar machinecode die een processor kan uitvoeren. De assembleertaal wordt zelf ook wel assembler, of assembly, genoemd.
Assembly is een low-level programmeertaal die nauwelijks meer dan een symbolische weergave van machinetaal is. Bij deze taal is het zo dat iedere regel van een assembly-instructie naar een enkele machinecode-instructie wordt vertaald, waarbij de vertalende assembler nog wel wat ondersteuning biedt in de vorm van symbolische namen (mnemonics) voor geheugenlocaties die gebruikt worden voor de opslag van variabelen en labels voor sprongopdrachten in plaats van absolute of relatieve adressen.
De meest voorkomende machinetaal is momenteel die voor de x86 (x86 staat voor 8086, 186, 286, 386, 486 en de Pentium familie). Elke processorsoort heeft een eigen machinetaal, denk aan bijvoorbeeld de Z80, PowerPC, Motorola 68k en DEC Alpha processoren, en dus ook een eigen assembleertaal.
Een regel van een assemblerprogramma heet een instructie. Er zijn verschillende soorten instructies:
- machine-instructies die worden vertaald naar een instructie van het uiteindelijke programma.
- assemblerinstructies zijn aanwijzingen voor de assembler.
- macro-instructies zorgen voor het openen van een bestand waarin instructies staan, die dan op de plaats van de macro-instructie worden ingevoegd.
Een instructie in een assemblyprogramma bevat over het algemeen:
- soms een label (de symbolische naam van een geheugenadres, die door de assembler wordt geconverteerd naar het werkelijke adres)
- de mnemonic (symbolische naam van een instructie)
- de eventuele argumenten voor de instructie
- eventueel commentaar
Hoewel assembly ook in verschillende vormen komt, (vooral AT&T of Intel Syntax), is deze notatie universeel. De precieze syntaxis kan enigszins verschillen. Zo worden bij de assembleertaal van IBM de delen gescheiden door spaties. Is er geen label, dan moet er een spatie (of een reeks opeenvolgende spaties) aan het begin staan. Bij x86 worden label en mnemonic gescheiden door een dubbele punt. Is er geen label, dan is er ook geen dubbele punt. Bij IBM begint het commentaar weer na een spatie, terwijl bij x86 het commentaar wordt voorafgegaan door een puntkomma.
De syntaxis is dus als volgt (de gekleurde delen zijn facultatief, waar 'spaties' staat moet minstens een spatie staan):
IBM: label spaties mnemonic spaties argumenten spaties commentaar (meer spaties niet toegestaan)
x86: label: mnemonic spaties argumenten ;commentaar (spaties toegestaan aanhet begin en voor en na leestekens)
Ook de "richting" van de operanden kan verschillen. Bijvoorbeeld: "MOV EAX,EBX" betekent in Intel assembly "stop de inhoud van register ebx in register eax" maar in AT&T "stop de inhoud van eax in register ebx".
Het komt zelfs voor dat een enkele assembleertaal hierin niet consequent is. De assembleertaal van de IBM 360 vermeldt de operanden als regel in dezelfde volgorde als in de machine-instructie. De instructie L 3,ADRES (L van LOAD) stopt de inhoud van ADRES in register 3, en de instructie ST 3,ADRES (ST van STORE) doet het omgekeerde.
Voorbeeld:
MOV cx,10 ;plaats (MOVe) de waarde 10 in register CX
hierzo: ;label
DEC cx ;trek van register CX het getal 1 af (DECrement)
JNZ hierzo ;spring (Jump) indien cX nog geen nul (Not Zero) naar label 'hierzo'
De processor zal dit lusje 10 keer doorlopen en dan verdergaan met de erop volgende instructie.
Een assembler vertaalt de assemblycode naar machinetaal. Een disassembler doet het tegenovergestelde, en vertaalt dus machinetaal terug naar assembly. De labels zijn hierbij natuurlijk niet zo informatief.
Omdat iedere instructie in een assemblyprogramma één op één overeenkomt met een instructie van de processor, is een programma geschreven in assembly niet overdraagbaar van de ene processor naar een uit een andere familie; de instructieset van verschillende processorfamilies verschilt totaal en dus wijken de corresponderende assembleertalen sterk af. Zogenaamde 'compatibele' processoren delen (grotendeels) de instructieset.
Voorbeelden van processorfamilies zijn de Intel Pentium en verwante types van AMD, de Motorolaprocessoren in Applecomputers tot 2005, en de IBM 370-mainframefamilie.
Inhoud |
[bewerk] Programmeren in assembly
Het voordeel van programmeren in assembly is dat de code zeer compact kan zijn. Het nadeel is dat zelfs voor eenvoudige programmaatjes zoveel code nodig is dat de programmeur snel het overzicht verliest. De belangrijkste toepassing van assembly is het optimaliseren van binnenste programmalussen in zeer rekenintensieve programma's, en het opstarten van operating systems
Daarnaast is kennis van assembly onontbeerlijk voor programmeurs die software willen "kraken". "Kraken" (in het Engels "cracking"), is het veranderen van de code van bestaande software met behulp van een disassembler. Meestal wordt een programma gekraakt om beveiligingsinstellingen van shareware te omzeilen. Overigens is programmeren in assembly (en daardoor dus ook het kraken van software) niet weggelegd voor beginnende programmeurs. Vergeleken met programmeren in hogere talen zoals C++ en Java waarmee beginners al snel een eenvoudig programmaatje kunnen schrijven is programmeren in assembly bijzonder ingewikkeld.
[bewerk] Assemblers
De assembler is zoals gezegd het programma waarmee voor mensen begrijpelijke assembleertaal wordt omgezet in voor processoren begrijpbare code. Enkele assemblers zijn bijvoorbeeld:
MASM, de Microsoft assembler, probeert assembly meer op een hogere programmeertaal te laten lijken. Deze heeft daardoor een soms vreemde syntaxis. Deze assembler was een van de eerste assemblers voor de x86.
TASM, de Borland Turbo assembler, heeft een duidelijkere syntaxis dan MASM, maar kan ook de MASM syntaxis begrijpen. Ook deze assembler was er vroeg bij en is daarom ook vaak de keuze van de oude garde.
NASM, de Netwide assembler, een redelijk nieuwe assembler met een zeer simpele syntaxis waarin alles duidelijk gezegd moet worden en niks wordt aangenomen. Deze open-sourcesoftware is perfect voor mensen die alles in de hand willen houden. Dit is ook de assembler die meestal gebruikt wordt bij het schrijven van de bootloader van een operating system omwille van de perfecte controle over het uiteindelijke resultaat.
YASM, deze assembler is een compleet herschreven versie van de NASM assembler en wordt onder de BSD-licentie uitgebracht. Belangrijkste eigenschappen zijn de ondersteuning van de x86-64 instructieset, en de uitvoer van PE COFF64 en ELF64 bestandsformaten naast (PE) COFF(32), ELF32 en BIN.
FASM, de Flat assembler, is ook open-source assembler. Ook FASM ondersteunt de x86-64 instructieset. Kijk op de website voor meer informatie.
[bewerk] Linkers
De meeste assemblers geven na uitvoering een .obj of .o bestand terug. Dit moet omgezet worden in een uitvoerbaar bestand (bijvoorbeeld een .exe of een ELF executable onder Unix-varianten) voordat het uitgevoerd kan worden. Dit doet men door deze te linken. Met het linken kunnen ook twee of meer .obj bestanden samengevoegd worden. Omdat sommige compilers van hogere programmeertalen ook .obj bestanden leveren, kan men zo een gemixt project maken. Meestal zit de linker al bij de assembler.
[bewerk] Externe links
- www.intel.com, site met zeer veel informatie over x86 assembly.
- www.ctyme.com/rbrown.htm, Ralf Browns interrupt lijst
- web.textfiles.com/hacking/asm.txt, een nog zeer incomplete introductie tot assembly
- alink linker
| Overzicht van programmeertalen |
|---|
|
Industrieel: Ada · AWK · Assembler · C · C++ · C# · COBOL · F# · Fortran · J# · Java · JavaScript · Lisp · Object Pascal · Pascal · Perl · PHP · Python · Rexx · Visual Basic |

