Assemblersprog

Fra Wikipedia, den frie encyklopædi

Formatering
Denne artikel bør formateres (med afsnitsinddeling, interne links o.l.) som det anbefales i Wikipedias retningslinjer
Denne side virker ikke som en encyklopædisk artikel
En bruger mener ikke denne artikel er bygget op som en encyklopædisk artikel. Du kan hjælpe ved at omskrive til konkrete redegørelser af fakta.
Ellers kan det komme på tale med en sletning af artiklen.
Læs den relaterede bog
AssemblersprogWikibooks.

Assemblersprog (eller assembler-kode, assembly-kode) er i praksis en symbolsk måde at udtrykke maskinkode på, eventuelt kombineret med et simpelt makrosystem. Oversættelsen fra assemblersprog til maskinkode varetages af en assembler. Da maskinkoden og dermed assemblersproget afhænger af CPU'en, taler man eksempelvis om x86-assembler, PowerPC-assembler, etc. Assemblersprogets muligheder er også afhængigt af, hvilket styresystem, der bruges. Man snakker også tit om forskellige dialekter af assemblersprog, tit defineret af den benyttede assembler. Der findes flere forskellige assembler som eksempelvis FASM, TASM, MASM, og GAS mm.

Assemblersprog benævnes som et 2. niveau programmeringssprog, altså et lav-niveau sprog som ikke direkte understøtter abstrakte syntaks-konstruktioner som eksempelvis IF/ELSE- og SWITCH-forgreninger, FOR- og WHILE/DOWHILE-løkker og ikke mindst variabler, som alle er understøttet af syntaksen i langt de fleste høj-niveau sprog, som eksempelvis C, C++ og Java. Man kan sige at dette niveau beskriver et sprogs abstraktion-niveau. Et sprogs abstraktions-niveau betegner hvor langt væk syntaksen i et programmeringsprog gør det muligt for programmøren at abstrahere væk fra den underliggende hardware-nære logik. Jo mere dette er muligt, jo mere abstrakt er sproget og jo højere niveau kan et programmeringssprog siges at have. Assemblersprog har en lav abstraktion og maskinkode kan siges at have en endnu lavere abstraktion.

Den primære fordel ved assemblersproget er, at man kan lave hardware-nære optimeringer, der ikke er mulige i langt de fleste høj-niveau sprog. Ulempen er at det kan synes besværligt at skrive i, grundet sprogets lave abstraktions-niveau. En assembler-programmør skal have en dybdegående teknisk forståelse for hvordan den benyttede CPU fungerer internt, samt hvordan problemet der forsøges løst, bedst bør fortolkes som små bider af meget specifik logik. Assemblersprogets opbygning vil for det meste have den effekt at den skrevne kode vil fylde betydelig mere i antal linier end kode med samme funktionalitet, skrevet i eksempelvis C, C++ eller Pascal. Typisk skrives selve programmet i et høj-niveau sprog, og hvis det derefter er nødvendigt kan kritiske dele omskrives i assemblersprog.

Indholdsfortegnelse

[redigér] To slags instruktioner

Assemblersproget omfatter to typer instruktioner. Der er de instruktioner, der direkte oversættes til maskinkode og der er pseudoinstruktioner, som fortæller assembleren, hvordan koden overordnet skal laves. Man bruger blandt andet pseudoinstruktioner til at definere, hvilke funktioner og variabler, der skal udstilles for andre moduler.

[redigér] Eksempel

Et Hello world-program skrevet i GNU-assembler til Intels CPUer kunne se sådan ud:

# Simpelt Hello world! program

.data
msg:
        .string "Hello world!\n" # Meddelelse, der skal vises
len = . - msg # Længden på beskeden

.text
.global _start # ld bruger denne label som start
_start:
        # Vis besked
        xorl    %eax,%eax       # Ryd eax, per definition er tal= (tal XOR tal) altid nul.
        movb    $4,%al          # Kopier værdien 4 til register al
        xorl    %ebx,%ebx
        incb    %bl             # bx = 1 
        movl    $msg,%ecx       # Kopier adresen på msg til ecx
        xorl    %edx,%edx
        movb    $len,%dl
        int     $0x80           # Alt i Linux sker via INT 80H

        # Afslut med returkode 0
        xorl    %eax,%eax
        incb    %al
        xorl    %ebx,%ebx 
        int     $0x80

Assemblersprog anvendes ikke så meget på PC, men anvendes stadig i mikrocontrollere. Men da computerne var ganske små, brugte man det, da man ikke forventede at portere det til andre processorarkitekturer.

Assemblersprog er godt til at konvertere data, det tager ikke så lang tid at køre. Problemet eller omkostningen ved assemblersprog er at det tager længere tid at skrive - ca. en faktor 10 mere end højere niveausprog.

Men hvorfor er der så nogle, der overhovedet gider at bruge tid på at programmere i assemblersprog, jo det er fordi, at man kan alt forstået på den måde, at man normalt har direkte adgang til hardware-chipsene. Man er ikke bundet til et højere sprogs compiler eller fortolker, men til systemets hardware-arkitektur og dermed CPU’en og chipsene. I undervisningsøjemed og selvlæring giver assemblerprogrammering et godt indblik i, hvordan en computersystem virker. Men det er svært at forstå, og som sagt tidligere - det tager tid.

[redigér] Segment og registrene

Eftersyn
Dette afsnit bør gennemlæses af en person med fagkendskab for at sikre den faglige korrekthed.

Registrene: i de fleste computere, (de har pt.2006 typisk 32-36 bit adressebus) er der registrene eax, ebx, ecx og edx. Deres bitfunktioner kan deles op i mindre dele,

eax kan deles op i ax, som så kan deles op i ah og al. sådan gælder det alle registrene. Ebx kan deles op i bx og derefter op i bh og bl. Bogstavet "h" betyder high, og i denne sammenhæng er det i CPU'en. hvorimod bogstav "L" betyder low.

Segment: segment er noget der ligner en register, men den kan ikke gøre de samme ting. Segmenterne bruges til at hold informationer i. Der er SS ES DS CS SS= har ikke et navn segment, es= ekstrasegment, ds=datasegment, cs=codesegment. syntaksen er : mov register, segment Eller mov segment register.

[redigér] Nogle kommandoer

Eftersyn
Dette afsnit bør gennemlæses af en person med fagkendskab for at sikre den faglige korrekthed.

I Asm er der mange kommandoer at holde styr på dem og er ikke nemt. Men der er nogle som man skal kunne, for at bruge det til noget.

HUSK altid at man gøre det om vendte af hvad der står(mov ax,cx betyder faktisk at CPU’en skal flytte cx ind i ax).

Den vigtigste er MOV kommandoen, Dens syntaks er:

MOV register, tal/register/segment

Med MOV kommandoen kan du gøre næsten alt, men det tager meget tid. Så man skal være glad for at CPUer i dag understøtter mange flere kommandoer. En anden vigtig kommandotype, er de matematiske, som består af: inc = læg til(+) dec = at trække fra(-) mul = gange(*) og til sidst div = dividere(:) syntaksen for disse kommandoer er:

(eks) inc register/tal/register/segment. 

En anden vigtig kommando er INT, INT betyder interrupt, som på dansk betyder afbrydelse. Den skal forstået som en handle, men som bruges af systemet, (en handle er faktisk det samme som en INT, bare hvor den ikke er defineret) en god liste over INT kommandoerne er her.

Hvis du syntes dette er svært så skal du ikke tro, at du har set det værste. Det bliver meget mere forvirrende. Det er derfor at hvis man vil vide noget om brug af Ram’ene, så skal man gå ind på min hjemmeside.

En anden type kommando, der er god at kunne, er CMP = compare, som oversat betyder, at sammenligne. Den syntaks er CMP register, register/tal

(et eks.) CMP AX,CX

Derefter er der mange ting man kan gøre, eks jne, som betyder jump if not equal, "hop ikke hvis?? ikke er lige" man kan også bruge dens modsætning, nemlig je=hop hvis lige syntaksen for disse "hop" er jne/ placering den skal hoppe til. Med disse kommandoer kan man lave mange sjove programmer. Du kan lave ét, der kigger om du taster enter eller mellemrum.

Men der er stadig en formu af andre kommandoer, men det kræver at man har erfaring med de andre. Jeg vil nævne en anden kommando som man nok godt kunne tænke sig at bruge. Den hedder db. Db betyder definer byte. Man bruger den til at skrive tekst i, men man kan også skrive andet i den. Dens syntaks er:

db,0d,0a,"tekst","$"

Grunden til at man har $ er, at den definerer, at her stopper teksten. Men der er også andre af denne type, dw, som betyder definer Word. I de nyre systemer er der også en kommando, som hedder dd, definer dobbelt Word.

Her er et program jeg selv har lavet.

debug
a
jmp 13c  
db 0d,0a,"                         programmet er lavet af Kasper Tvede",a9," KEY.COM V.1,00 ""$" 
mov dx,102 
mov ah,09 
int 21 
jmp 152 
db 0d,0a,"du trykkede:","$" 
mov dx,145 
mov ah,09 
int 21 
mov ah,07 
int 21 
cmp al,0d;enter 
je 1aa 
cmp al,09;tab 
je 177 
cmp al,1b;esc 
je 186  
cmp al,20;mellemrum  
je 195 
mov dl,al  
mov ah,02  
int 21 
jmp 143 
jmp 17d 
db "tab","$" 
mov dx,179 
mov ah,9 
int 21 
jmp 143 
jmp 18c 
db "esc","$" 
mov dx,188 
mov ah,9 
int 21 
jmp 143 
jmp 1a1 
db "mellemrum","$" 
mov dx,197 
mov ah,9 
int 21 
jmp 143 
jmp 1c8 
db "enter, klik for at afslutte","$" 
mov dx, 1ac 
mov ah,09 
int 21 
mov ax,0000 
int 16 
mov ah,4c 
int 21 
rcx  
1d8 
n c:\key.com 
w 
q 

Som du kan se tager det meget lang tid at skrive Assemblersprogsprogrammer, men det er det værd i nogle situationer.

I dette program har jeg brugt en masse int’er, og en masse cmp’er. Hvis jeg var ekspert i asm, ville det ikke kræve det halve, men så ville det også være mere svært at forstå.

I starten får jeg den til at skrive, hvem der har lavet programmet. Derefter får jeg den til at skrive "du trykkre:" , det næste der så sker er at jeg kigger hvad du trykker, det gør jeg med 'int 21 ah 07 ' og 'int 21 ah 02'. Grunden til at jeg ikke bruger 'int 21 ah 01' er, at der skriver den bare hvad du taster, alt ser du har ingen mulighed for, at lave noget som i programmet. Men nok om det, det næste der sker er, at jeg CMP'er om det er enter eller mellemrum, esc, eller tab. Grunden til at jeg gør det er, at ellers vil den bare skrive tegnet, ikke gøre det man er vant til. Eks: hvis du trykker esc uden, at man gør noget, vil der komme en pil (←), og det er jo ikke tanken - vel? Så man bliver nødt til at lave en ændring, så det ikke sker. Nu tænker du vel, hvad med i spil, osv. jo, der laver man bare så der sker noget, eks. en menu. Til sidst laver jeg så hvis du taster enter, så springer den til afslutningen. Dette program er skrevet i Debug.exe (et windows program, jeg vil forklar det senere). Kan du følge mig, ellers skal du lige læse det engang til.

[redigér] Debug.exe

Debug.exe er en 16-bit debugger som kan benyttes til at kigge i forskellige områder i hukommelsen, samt at dissassemble (unassembly) og assemble. Debug.exe er tilgængelig på MS-DOS og Windows-platformen. Debug har et par kommandoer: a, (assembly), w (write), til den skal man huske at man skal skrive størelsen i cx, r er for registerne, og du kan osse ændre deres værdi. og så er der u, (unassembly), den bruger man til at debuge koden til asm. Debug.exe benævnes her da den kan være nyttig i forbindelse med fejl-søgning af programmer skrevet i 16-bit assemblersprog.

Denne it-artikel er kun påbegyndt. Hvis du ved mere om emnet, kan du hjælpe Wikipedia ved at udvide den.
organisation