# Programmeren in x86 assembler/Inleiding
## Waarom assembler leren ?

Assembler is het meest primitieve gereedschap in het arsenaal van de programmeur. Volledige softwareprojecten kunnen geschreven worden zonder ooit een enkele regel in assembler te programmeren. De vraag is dus: waarom assembler leren?
Middels assembler kan de programmeur op een zeer laag (dicht bij de hardware) niveau communiceren met een computer. Het geeft de programmeur zeer precieze controle over flow-van-data en uitvoering van een programma. Een ander voordeel dat kennis van assembler biedt is het volgende. Als een in een hogere taal (zoals C) geschreven programma eenmaal gecompileerd is is het zeer moeilijk -zo niet onmogelijk- om het weer te decompileren. Dat houdt in dat reeds gecompileerde programma's slechts onderzocht kunnen worden indien kennis van assembler aanwezig is. Debuggers tonen programmacode doorgaans ook in assembler. Zodoende biedt het kunnen lezen en schrijven van assemblercode grote voordelen aan de programmeur.
Voor specifieke zaken zoals bootloaders en low-level kernelcomponenten is assembler de te prefereren - zo niet de enig mogelijke - optie. In assembler geschreven code heeft doorgaans minder overhead dan in hogere talen geschreven code en zal daarom vaak (veel) sneller draaien. Assembler wordt regelmatig gebruikt om gecompileerde programma's geschreven in hogere talen handmatig te optimaliseren (tweaken). Ook zijn nieuwe functies in hardware (zoals die van Intel of AMD) slechts benaderbaar door assembler routines totdat de grote compiler-fabrikanten ondersteuning voor de nieuwe routines inbouwen.
Het ontwerpen van programma's in assembler kan echter een behoorlijk tijdsintensief proces zijn. Hoewel het doorgaans geen goed idee is om complete projecten in assembler te schrijven, kan het zeker geen kwaad om er kennis van te hebben.

## Voor wie is dit boek geschreven?

Dit boek is geschreven als introductie in assembler. Het is tevens een goede bron voor mensen die reeds bekend zijn met dit onderwerp, maar meer informatie over x86-systeemarchitectuur nodig hebben of meer geavanceerde gebruiken willen leren kennen. Hoewel geen voorkennis verondersteld wordt is een fundamentele kennis van programmeerconcepten zeker een voordeel.

## Hoe is dit boek georganiseerd?

Het eerste deel zal de x86 chipfamilie bespreken en de basis instructieset introduceren. Het tweede deel zal ingaan op de verschillen in syntax voor verschillende assemblers. Het derde deel zal een aantal additionele instructiesets bespreken waaronder floating-point-operations, MMX-operations en SSE-operations. Het vierde deel zal ingaan op wat geavanceerde x86assembler onderwerpen waaronder low-level programmeer onderwerpen zoals het schrijven van bootloaders. Er zijn verscheiden taken die niet op eenvoudige wijze in hogere programmeertalen als C of C++ te verwezenlijken zijn. Bijvoorbeeld: functies voor het in- en uitschakelen van interrupts, het inschakelen van protected mode, toegang verkrijgen tot Control Registers, het creëren van een Global Descriptor Table enzovoort. Het vierde deel zal ook het 'interfacing' van assembler met C en andere hogere talen behandelen. Zodra een functie in assembler is geschreven (zoals het inschakelen van protected mode) kunnen we een 'interface' naar een grotere (op C of C++ gebaseerde) kernel maken. Het vijfde deel zal de standaard x86-chipset, de basis x86-computer-architectuur en in het algemeen de hardwarekant van de zaak behandelen.
De huidige lay-out is ontworpen om lezer te voorzien van alle informatie die die nodig heeft zonder daarbij overweldigend te worden. Lezers die assembler op een specifieke assembler (bijvoorbeeld nasm) willen leren hoeven slechts het eerste deel en het de sectie van het tweede deel dat over die specifieke assembler te lezen. Programmeurs die op zoek zijn naar informatie over MMX of SSE kunnen deel 3 raadplegen. Voor diegenen die bootloaders en kernels willen implementeren is deel 4 genoeg.