Assembleertaal
Assembleertaal of assembly is een low-level programmeertaal die nauwelijks meer dan een symbolische weergave van machinetaal is. Elke instructie in de assembleertaal komt overeen met één enkele instructie in machinecode, zij het dat de vertalende assembler nog wel ondersteuning biedt in de vorm van symbolische namen (mnemonics) voor geheugenlocaties die gebruikt worden voor de opslag van variabelen, en voor labels voor sprongopdrachten, in plaats van absolute of relatieve adressen.
Elke processorsoort heeft een eigen machinetaal, denk aan bijvoorbeeld de Pic's, de 8051's, de Renesas (voorheen Mitsubishi), de Arm, de Z80, PowerPC, Motorola 68000 en DEC Alpha. Ze hebben dus ook een eigen assembleertaal. Van belang, omdat hij in de IBM-compatibele pc's voorkomt, is de x86 (x86 staat voor 8086, 186, 286, 386, 486, de Pentium-familie en de AMD-familie). Tegenwoordig bevatten ook de Apple-computers processors uit die familie.
Inhoud |
[bewerken] Instructies
Een regel van een assemblyprogramma heet een instructie. Er zijn verschillende soorten instructies:
- machine-instructies die worden vertaald naar een instructie 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 bestand waarin instructies staan, die dan op de plaats van de macro-instructie worden ingevoegd.
Een instructie in een assemblyprogramma bestaat over het algemeen uit:
- de mnemonic (symbolische naam van een instructie)
- de eventuele argumenten voor de instructie
- eventueel commentaar
Soms is het eerste deel van de instructie of de instructie zelf een label, d.w.z. de symbolische naam van een geheugenadres, die door de assembler wordt geconverteerd naar het werkelijke adres.
[bewerken] 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 'spaties' staat moet minstens een spatie staan):
IBM: label spaties mnemonic spaties argumenten spaties commentaar (spaties binnen de argumenten niet toegestaan)
x86: label: mnemonic spaties 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.
[bewerken] Compatibiliteit
Een assembler vertaalt de assemblycode naar machinetaal. Een disassembler doet het tegenovergestelde, en vertaalt dus machinetaal terug naar assembly.
Omdat iedere instructie in een assemblyprogramma één op één 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' 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.
[bewerken] 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 processoren (zie boven) terwijl programma's in hogere programmertalen 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.
[bewerken] Zie ook
[bewerken] Externe link
- (en) Intel.com, een website met veel informatie over x86-assembly.
| Programmeertalen |
|---|
|
ActionScript · Ada · ALGOL · APL · AWK · Assembleertalen · BASIC · C · C++ · C# · Clean · COBOL · D · Eiffel · F♯ · Fortran · Haskell · J♯ · Java · JavaScript · Lisp · Logo · ML · Modula-2 · Oberon · Object Pascal · Ocaml · Pascal · Perl · PHP · PL/I · Prolog · Python · Ruby · Scheme · Simula · Smalltalk · Visual Basic |