Assembleertaal of assembly is een low-level programmeertaal die een mnemonische weergave (afkorting, of verkorting van een computerinstructie) van machinetaal is. Elke regel in de assembleertaal komt overeen met één enkele instructie, zij het dat de vertalende assembler nog wel ondersteuning biedt in de vorm van symbolische namen (labels) voor geheugenlocaties die gebruikt worden voor constanten of variabelen, en voor sprongopdrachten, in plaats van fysieke adressen. Voor de instructiecode gebruikt men mnemonics: zo kan de instructie "load accumulator" weergegeven worden door de mnemonic LDA, "store accumulator" door STA en "optellen" door ADD. De eenvoudigste mnemonic is NOP, namelijk No OPeration - er wordt niets gedaan.
Elke processorsoort heeft een eigen instructieset en registerset (Programming Model), voorbeelden zijn de Pic's, de 8051's, de Renesas (voorheen Mitsubishi), de Arm, de Z80, 6502, PowerPC, Motorola 68000 en DEC Alpha. Juridisch is bepaald dat de binaire code tot het intellectuele eigendom van de chipontwerper behoort. De mnemonics mogen door iedere partij gebruikt worden. Zo gebruikt Renesas de mnemonics van Motorola. Zilogs Z80 heeft echter andere mnemonics dan de Intel 8080, hoewel hij compatibel is met deze processor.
Een belangrijke instructieset is de instructieset voor de x86-familie, omdat deze in de IBM-compatibele pc's voorkomt (x86 staat voor 8086, 186, 286, 386, 486, de Pentium- en de AMD-familie). Tegenwoordig gebruikt ook Apple processors uit die familie.
Instructies
Een regel van een assemblyprogramma heet een instructie. Er zijn verschillende soorten instructies:
- machine-instructies die worden vertaald naar opcodes met eventuele operanden van de uiteindelijke machinecode.
- assembleraanwijzingen, opdrachten die de assembler moet uitvoeren, zoals het reserveren van geheugen
- macro-aanroepen, die zorgen voor het openen van een tekstbestand waarin instructies staan, die dan op de plaats van de macro-instructie worden ingevoegd.
- commentaar, er is een mogelijkheid voor de programmeur om zijn bedoeling woordelijk te kunnen noteren. Dit voor documentatiedoeleinden.
Een instructie in een assemblyprogramma bestaat over het algemeen uit:
- de mnemonic (naam van een instructie)
- de eventuele operand (argument) voor de instructie
Soms is het eerste deel van de instructie of de instructie zelf een label, dat wil zeggen de symbolische naam van een geheugenlocatie, die door de assembler wordt geconverteerd naar een getal voor het werkelijke adres.
Syntaxis
Hoewel er variaties zijn in de vorm van assembly (vooral AT&T of Intel syntaxis), 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 'spatie(s)' staat moet minstens één spatie staan):
IBM: label spatie(s) mnemonic spatie(s) argumenten spatie(s) commentaar (spaties binnen de argumenten niet toegestaan)
x86: label: mnemonic spatie(s) argumenten ;commentaar (spaties toegestaan aan het 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.
Compatibiliteit
Een assembler vertaalt de assemblycode naar machinetaal. Een disassembler doet het tegenovergestelde, en vertaalt dus machinetaal terug naar assembly.
Doordat iedere instructie in een assemblyprogramma een-op-een overeenkomt met een instructie van de processor, is een assemblyprogramma niet overdraagbaar van de ene processorfamilie naar een uit een andere familie; de instructieset van verschillende processorfamilies verschilt totaal en dus wijken de corresponderende assembleertalen sterk af. Zogenaamde 'compatibele' processors delen (grotendeels) de instructieset.
Voorbeelden van processorfamilies zijn de Intel Pentium en verwante types van AMD, de Motorolaprocessors in Applecomputers tot 2005, en de IBM 370-mainframefamilie.
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. Vergeleken met programmeren in hogere talen zoals C++ en Java, waarmee beginners al snel een eenvoudig programmaatje kunnen schrijven, is programmeren in assembly veel moeilijker en niet weggelegd voor beginnende programmeurs. Ook zijn programma's geschreven in assembly niet overdraagbaar tussen verschillende processors (zie boven) terwijl programma's in hogere programmeertalen dat, in ieder geval op broncodeniveau, wel (kunnen) zijn.
De belangrijkste toepassing van assembly is het programmeren van embedded computers, verder soms het optimaliseren van code. Bij compilers en het opstarten van besturingssystemen is het onvermijdelijk dat delen in assembler geprogrammeerd worden, omdat hogere talen gewoon niet in alles voorzien.
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. De beschermende maatregelen tegen illegaal gebruik van de software gaan zover, dat soms kraken de enige mogelijkheid is waarmee kopers van gebruiksrechten voor software deze wettelijke rechten volledig kunnen uitoefenen. De Europese wetgeving staat bijvoorbeeld uitdrukkelijk toe dat een gebruiker op deze manier fouten uit de software verwijdert. Natuurlijk kan het ook gebruikt worden om beveiligingsmechanismen te omzeilen, wat vaak illegaal is.
Zie ook
Externe link
- (en) Intel.com, met informatie over x86-assembly.