Assembler (Maskinkode) X86
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 proces 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 også i dag, 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 senere. 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 i dag, 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 vores 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 samtidig å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 i gang, så læs videre, 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 havde samme opfattelse, men opdagede hurtigt at man bliver nødt 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 i gang :)
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 indeholder 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.
Registrene i computeren
[redigér]Det er sikkert nu at du måske ikke gider at læse, men hellere komme i gang. 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 registre:
AX,BX,CX,DX
Det er alle de "generelle" 16-bit registre.
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 også 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 registrene.
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 også binær, som er et 2-talssystem.
Så er der også 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 videre 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 kopierer indholdet i en af CPU-registrene til en af de andre register.
Man kan fx også kopiere Hex- tal, ind i registeret.
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 kopiere indholdet i bx til ax.
Men der er stadig et par få "måder" tilbage, at bruge Mov på. Den kan nemlig også 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),
kopiere man ind i ax. Man kan også 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