Assembler (software): verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Richardw (overleg | bijdragen)
tweemaal dezelfde link zo vlak na elkaar is onnodig
Geen bewerkingssamenvatting
Regel 1:
Een '''assembler''' is een vertaalprogramma dat een [[computerprogramma|programma]], geschreven in ee [[assembleertaal]], kan omzetten naar de [[machinetaal|machinecode]] die een [[processor (computer)|processor]] kan uitvoeren. De assembleertaal wordt zelf ook wel (verkeerdelijk) assembler of assembly genoemd. Assembleren betekent vrijwel letterlijk ''samenstellen''. De "taak" van de ''assembler'' is dan ook het samenstellen (vertalen of omzetten) van een machinecode vanuit de assembleertaal waarin het programma geschreven is naar een taal die door de processor kan worden begrepen.
 
==Compileren==
== Assembleertaal (assembly) ==
De begrippen assembler en disassembler horen bij elkaar. Assemblers en disassemblers worden vaak gecombineerd, bijvoorbeeld DEBUG.EXE in MS-DOS bevatte beide en was tot aan [[Windows 7]] nog aanwezig in elke Windows-distributieWindowsversie. Ze zijn een onderdeel van elk pakket waarmee embedded systemen ontwikkeld worden, maar ook veel geïntegreerde ontwikkelsystemen voor hogere programmeertalen bevatten een disassembler.
Assembleertaal of assembly is een low-level [[programmeertaal]] die nauwelijks meer dan een symbolische weergave van [[machinetaal]] is. Bij deze taal is het zo dat iedere [[instructie (computer)|instructie]] in de programmeertaal overeenkomt met één enkele instructie in machinecode, 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.
 
Het assembleerprogramma zelf is tegenwoordig meestal geschreven in een hogere programmeertaal (bijvoorbeeld [[C++]]). In het verleden waren deze programma’s over het algemeen geschreven in de assembleertaal van de doelmachine. Indien een programma geassembleerd werd op een andere machine met een ander type processor of in een hogere taal werd gesproken over een cross-assembler.
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|Motorola 68k]] en [[DEC Alpha]]. Ze hebben dus ook een eigen assembleertaal.
Van belang omdat hij in de IBM-compatible PC's voorkomt is de [[X86-instructieset|x86]] (x86 staat voor 8086, 186, 286, 386, 486, de [[Pentium]]-familie en de [[AMD]]-familie). Tegenwoordig bevatten ook de Apple-computers processors van die familie.
 
Een regel van een assemblyprogramma heet een ''instructie''. Er zijn verschillende soorten instructies:
*machine-instructies die worden vertaald naar een instructie van het uiteindelijke programma.
*assembleraanwijzingen, opdrachten die de assembler moet uitvoeren, zoals het reserveren van geheugen
*macro-aanroepen 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 er variaties zijn in de vorm van assembly, (vooral [[AT&T]] of [[Intel]] [[Syntaxis (informatica)|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: <font color=red>label</font> spaties mnemonic spaties argumenten <font color=red>spaties commentaar</font> (spaties binnen de argumenten niet toegestaan)
 
x86: <font color=red>label''':'''<font color=orange> </font> </font> mnemonic spaties argumenten <font color=red>''';'''commentaar</font> (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 [[Registergeheugen|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&nbsp;3,ADRES (L van ''LOAD'') stopt de inhoud van ADRES in register 3, en de instructie ST&nbsp;3,ADRES (ST van ''STORE'') doet het omgekeerde.
 
Voorbeeld:
<pre>
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'
</pre>
De [[processor (computer)|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 assemblyprogramma 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 [[Advanced Micro Devices|AMD]], de Motorolaprocessoren in Applecomputers tot 2005, en de IBM 370-[[mainframe]]familie.
 
==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 dus 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 [[besturingssysteem|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.
 
De begrippen assembler en disassembler horen bij elkaar. Assemblers en disassemblers worden vaak gecombineerd, bijvoorbeeld DEBUG.EXE in MS-DOS bevatte beide en was tot aan Windows 7 nog aanwezig in elke Windows-distributie. Ze zijn een onderdeel van elk pakket waarmee embedded systemen ontwikkeld worden, maar ook veel geïntegreerde ontwikkelsystemen voor hogere programmeertalen bevatten een disassembler.
 
Het assembleerprogramma zelf is tegenwoordig meestal geschreven in een hogere programmeertaal (bijvoorbeeld C++). In het verleden waren deze programma’s over het algemeen geschreven in de assembleertaal van de doelmachine. Indien een programma geassembleerd werd op een andere machine met een ander type processor of in een hogere taal werd gesproken over een cross-assembler.
 
==Assemblers ==
Regel 81 ⟶ 30:
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 formaten zijn het Motorola S-formaat, en het Intel hex-formaat. Deze formaten worden ook wel vanuit een objectbestand gegenereerd.
 
== Zie ook ==
* [[Lijst van programmeertalen]]
 
==Externe links==
* {{en}}[http://www.intel.com www.intel.com], site met zeer veel informatie over x86 assembly.
* {{en}}[http://www.ctyme.com/rbrown.htm www.ctyme.com/rbrown.htm], Ralf Browns interrupt lijstinterruptlijst]
* [http://alink.sourceforge.net/ alink] linker
 
{{Appendix}}