Assembler (Maskinkode) X86

Fra Wikibooks, den frie samling af lærebøger
(Omdirigeret fra Assembler (Maskinkode))

Hvad er Assembly?[redigér]

Assembly (eller ASM) er et programmerings sprog, det er et af de sværeste sprog, i Datalogi. For at være helt præcis, er det et niveau 2 sprog. Hvor binær er niveau 1, det Laveste "level" og det sværeste sprog. Der er forskellige typer af ASM, men den der vil blive diskuteret her er Intel's x86'er.

Hvornår bruges det?[redigér]

ASM blev mest brugt, i den tid hvor computere ikke havde særligt hurtige CPUer, og af den simple grund,
De var ikke hurtige nok, til at beregne et højniveau-sprog som f.eks. Java. For det kræver at man converter en type kode, om til binær.
Og denne process kræver meget i forhold til et sprog som ASM.
Men hvis jeg skal give et årstal, hvornår asm blev brugt så er vi i den tid hvor hjemme computeren kom , og det var jo ca i 1980.
Det bruges osse idag, men ikke i samme omfang. Dette omfang er meget lille, fordi vi har andre nemmere mulighedere.
Fx For at kunne skabe et styresystem, kræver det ASM, eller binær. Fordi at man ikke bare sådan kan bruge andet.
Men det vil jeg komme tilbage til senerer. Når vi snakker om bootloader

Hvorfor bruge ASM?[redigér]

Det er jo et spørgsmål om flere ting. Men en af grundende er at det bliver ikke hurtigere end ASM.
Men så kan man jo så spørge om det så er nødvendigt idag, til det vil jeg svare, ja af flere grunde.
Men som sagt så har jeg 3 gode grunde til at lære ASM:
1: Selv om vorese computer er meget hurtige, så kan man stadig godt gøre dem hurtigere, dvs at udnytte dem bedre.
2: Selv om det i starten tager lang tid at skrive programmer, så bliver man meget hurtigere med tiden.
3: Det giver en meget god forståelse af hvordan en computer virker, og sammentidige åbner det for en helt ny verden.

CPU typer[redigér]

Der er flere forskellige typer CPU'er. Der er de gamle, (den mest omtalte x86, som er en af Intel's). Der er også en masse nye, men dem kan du selv studere. For det er x86 der vil blive snakket om her.


En hurtig start[redigér]

Hvis du virkelig vil igang, så læs vidre, men husk en ting: Du kan godt glemme alt om at lave avancerede ting i Starten.
Og grunden er meget simple, DU KAN IKKE, fordi du skal først lære en masse inden du kan noget rigtig.
Jeg havede samme opfattelse, men opdagede hurtigt at man bliver nød til at lære noget, inden du kan bruge det i praktisk.
Men eftersom at ASM ikke længere er så udbredt, er det ikke nemt at finde viden om det. Det er derfor jeg skriver dette her.
Men skal vi så ikke se at komme igang :)

Assembler[redigér]

Der er mange programmer, du kan skrive ASM i, fx NASM, men dem vil jeg ikke skrive om før vi er ved bootloader.
Først skal du kende den som ligger på alle windows styresystemer, den hedder DEBUG.EXE.
Debug er en 16 bit assembler, som har en god dissasembler, men allerede her støder vi på et problem,
DEBUG indholder ikke alle kommandoer, men kun de mest brugte. (Det er derfor vi vil snakke om NASM)
Men det skal du først tage højde for senere.

Registerne i computeren[redigér]

Det er sikkert nu at du måske ikke gider at læse, men hellere komme igang. Men som sagt tidligere, du skal vide noget,
før du kan begynde at programmere.

Et register, er noget man kan kalde en "del" af cpu'en, som holder forskellige tal. Men Det er ikke helt hvad de gør. De styrer alt hvad computeren gør.

Der er følgende registere:

AX,BX,CX,DX

Det er alle de "generelle" 16-bit registere.
De kan alle deles op i 2 mindre dele,xh,xl (hvor x enten er a,b,c, eller d)
De er alle 8 bit. De kan ikke deles op i mere.

der er osse noget der hedder segment, og det er straks være.
der er ss,cs,ds,es cs:code segment, ds: data segment, es:extra segment, ss: stack segment. (og så nogle andre som vil blive nævnt senere)
Der er osse noget der hedder "pointers", De er ip,bp,sp, de kan ikke ændres, men gør det selv som de generale eller segmenterne.
Der er også nogen, som du senere vil bruge meget, de hedder di og si. De er Index registerne.
Til sidst er der noget der hedder "Flags", men dem vil jeg ikke forklare lige nu.

Tal systemer, og binær[redigér]

Der er flere talsystemer end blot det vi kender, 10 talssystemet. Der er osse binær, som er et 2 talssystem.
Så er der osse hex, som er et 16 talssystem. hex funger sådan
0,1,2,3,4,5,6,7,8,9,A, B, C, D, E,F, 10
i dec(10 talssystemet)
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
Bin(binær) fungerer sådan:
0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111,10000.

Et godt råd, kig grundigt på F(hex) og 1111(bin), og så læs vidre når du forstået hvad jeg vil have dig til at forstå.
Hvis du ikke kan finde ud af hvorfor så vil jeg sige det,
Hex bruger kun 1 cifre til at beskrive, 1111, hvorimod dec skal bruge 2.

De mest normale Instrukser[redigér]

I CPUen er der Mange Instrukser, men der er nogen som er mere brugt end andre. Fx MOV Instruktionen,
Den kopir indholdet i en af CPU registerne til en af de andre register.
Man kan fx også kopir Hex- tal, ind i registeren.
Fx:

Mov ax,000f


Det der sker ovenfor, er at man flytter hex værdien f (15 i dec), ind i ax. Som du nu sikkert
har bemærket, så er det omvendt, at man flytter "ax" ind i 000f. Det vil så sige,
at du skal altid tænke fra højre til venstre. et andet eks. med Mov kan være:

 Mov ax,bx


Nu sker der det at man kopir indholdet i bx til ax.
Men der er stadig et par få "måder" tilbage, at bruge Mov på. Den kan nemlig osse arbejde med ram'ene.
Ram betyder Random Access Memory, og bliver brugt til opbevaring af data.
Hvis du bruger Mov, så vil det fx se sådan her ud:

 mov ax,[1000] 


Dette betyder at man flytter det der "ligger" i hukommelsen på placering 1000 (hex),
kopir man ind i ax. Man kan osse gøre det omvendte, til at "lægge" noget ind i hukommelsen,
på placeringen 1000, fx:

 Mov [1000],ax 


Note: HUSK altid [], eftersom at det betyder hukommelse!
Ud over MOV er der også de logiske(and, or, xor, not) , og de matematiske(sådan noget som fx addere).
Men der er også nogle som skiller sig ud fra de 2 grupper, det er "bit rotation".
Og så er der de kommandoer som gør at man kan sige at en computer kan "tænke".

De logiske[redigér]

Der er følgende logiske instrukser:
XOR,OR,AND,NOT
Det der er fældes for dem alle er at de manipulere data'en. Xor er en udvidelse af Or.
Logisk operator