Et assemblagesprog (ofte blot kaldet assembler) er et programmeringssprog, der bruges til at beskrive direkte, hvad en computer skal gøre på maskinens eget niveau. Et assemblagesprog svarer tæt til den maskinkode, som processoren forstår, men i stedet for lange talstrenge (bits og bytes) bruger det kortere, menneskelige læsbare ord og symboler kaldet mnemonics. En computer kan ikke køre assemblagekode direkte; et program kaldet en assembler oversætter (assemblerer) disse mnemonics til de binære tal, processoren kræver.

Hvordan fungerer assemblersprog?

Et program skrevet i assemblersprog består typisk af mange instruktioner. Hver instruktion repræsenterer en enkelt, simpel handling, som processoren kan udføre — fx flyt data mellem registre, udfør en aritmetisk operation eller hop til en anden del af koden. Den del af computeren, der udfører instruktionerne, er processoren.

Assemblersprog er et lavniveausprog: det betyder, at du som programmør selv skal beskrive alle små trin, der tilsammen udfører en større opgave. For eksempel kan en enkel kommando i et højniveausprog som PRINT "Hello, world!" i assembler blive mange instruktioner, der sætter tegn ind i en buffer, kalder et operativsystemskald og håndterer output til skærmen.

Kernebegreber i assembler

  • Mnemonic: Et kort ord som MOV, ADD eller JMP, der repræsenterer en maskininstruktion.
  • Operand: De værdier eller steder (registre, hukommelsesadresser) som instruktionen arbejder med.
  • Register: Små, hurtige lagringspladser i processoren, ofte navngivet som AX, BX, R0, R1 osv.
  • Adresse- og adresseringsmåder: Hvordan en instruktion refererer til data (direkte, indirekte, immediat værdi osv.).
  • Etiketter (labels): Navne, der bruges til at markere steder i koden til hop og kontrolflow.
  • Direktiver: Instruktioner til assembleren (ikke til processoren) som f.eks. at reservere hukommelse eller inkludere filer.
  • Makroer: Genbrugelige kodesnitstykker, som assembleren kan udvide i koden for at gøre udvikling nemmere.

Eksempel (forenklet)

Et meget enkelt eksempel (på x86-lignende assembly) kan se således ud i tekstform:

MOV AX, 1 ; sæt register AX til 1
ADD AX, 2 ; læg 2 til AX
INT 0x80 ; kald til operativsystemet (eksempel på systemkald)

Hver linje svarer til én maskininstruktion efter assembleren har oversat mnemonics til opcodes (de egentlige tal, som CPU'en udfører).

Assembler vs. compiler

  • Assembler: Oversætter én-til-én mnemonics til maskinkode. Typisk meget tæt på hardware og afhængig af CPU-arkitektur.
  • Compiler: Oversætter højniveausprog (f.eks. C, Java) til maskinkode eller mellemtrin. En compiler kan optimere kode og skjule mange lavniveau-detaljer for programmøren.

Fordele og ulemper

  • Fordele: Meget præcis kontrol over hardware, mulighed for maksimal ydelse og lavt ressourceforbrug, nyttigt ved tidskritiske rutiner eller hardware-nære opgaver.
  • Ulemper: Svært at skrive og vedligeholde, tidskrævende, ikke-portabelt (assembler er normalt specifikt for en processorfamilie) og fejl kan være svære at finde.

Hvor anvendes assembler i dag?

Selvom de fleste applikationer i dag er skrevet i højniveausprog, bruges assembler stadig i situationer hvor kontrol og ydeevne er kritisk, for eksempel:

  • Indlejrede systemer (microcontrollere)
  • Enhedsdrivere og realtidskomponenter i operativsystemer
  • Højtydende biblioteker og krypteringsrutiner
  • Reverse engineering og sikkerhedsanalyse

Praktiske bemærkninger

Der findes forskellige typer assemblere og syntakser (fx AT&T vs Intel for x86). Mange udviklere kombinerer i dag højniveausprog med små assemblerblokke, når de har brug for ekstra hastighed eller hardwareadgang. Moderne udviklingsværktøjer og kompileringsmuligheder gør det ofte muligt at skrive de fleste dele i højniveau og kun optimere kritiske sektioner i assembler.

Samlet set er assemblagesprog et kraftfuldt, men lavniveau værktøj til at beskrive præcis, hvordan en CPU skal arbejde. Det kræver forståelse for processorarkitektur, registre, hukommelse og instruktioner, men giver også den mest direkte vej fra kode til maskinkode.