- Assemblersprog organiserer sine instruktioner efter formål: overførsel, beregning, flowkontrol og mere.
- Hver instruktion består af en opcode og operander med forskellige formater afhængigt af arkitekturen.
- Der er flere adresseringsmetoder til at få adgang til data, såsom umiddelbar, direkte og indirekte.
Assemblersprog har været en af grundpillerne i softwareudvikling siden computerens begyndelse. Selvom avancerede sprog dominerer scenen i dag, er assembler stadig meget udbredt og relevant i miljøer, hvor hardwarekontrol, optimering eller ressourcebegrænsninger er en prioritet.
I denne artikel vil vi dykke ned i de forskellige typer af instruktioner i assemblersprog, analysere deres struktur, formål, adresseringstilstande og hvordan de er organiseret på tværs af forskellige arkitekturer. Du finder også eksempler, formater og en omfattende oversigt, der giver dig mulighed for fuldt ud at forstå logikken bag disse instruktioner, som fungerer meget tæt sammen med hardwaren.
Hvad er en instruktion i assemblersprog?
En assemblerinstruktion er en kommando, som CPU'en kan forstå direkte (når den er oversat til maskinkode af et assemblerprogram). Hver instruktion har et specifikt formål og er normalt sammensat af en huskeregel , der repræsenterer operationen, og en eller flere operander , der angiver, hvor dataene hentes, og/eller hvor resultaterne gemmes.
Disse instruktioner er meget afhængige af processorarkitekturen, så hver type CPU (uanset om det er x86, ARM, MIPS osv.) har sit eget sæt instruktioner med specifik syntaks og funktioner.
Struktur af en instruktion
Instruktioner består normalt af to dele:
- Operationskode (opcode): Angiver den handling, der skal udføres, såsom at tilføje, flytte data, sammenligne osv.
Operander leverer den information, der er nødvendig for at udføre operationen, og kan gemmes i registre, hukommelse eller være konstanter. Ikke alle instruktioner kræver operander, og i nogle tilfælde kan disse være implicitte i instruktionen eller gemmes i foruddefinerede registre.
Typer af instruktioner i assemblersprog
Afhængigt af den funktionalitet, de udfører i et program, kan instruktioner i assemblersprog klassificeres i flere grupper. De mest relevante er beskrevet nedenfor:
1. Instruktioner for dataoverførsel
Disse instruktioner gør det muligt at kopiere data fra et sted til et andet uden at ændre indholdet ved kilden. De er afgørende for at flytte information mellem registre, hukommelse og periferiudstyr.
Nogle af de mest almindelige instruktioner i denne gruppe er:
- MOV: Kopierer indholdet af én operand til en anden. For eksempel,
MOV AX, BXKopier indholdet af BX til AX. - MOVS / MOVSB / MOVSW: Flytter strenge fra en kildeadresse (SI) til en destinationsadresse (DI) og automatiserer dermed overførselsprocessen.
- LODS / LODSB / LODSW: Indlæser en værdi fra den adresse, der er angivet af SI-registeret, i akkumulatoren (AL eller AX).
- LÆSE: Indlæser en effektiv adresse i stedet for værdien. Nyttig til at hente adressen på en variabel eller struktur.
2. Batterivejledning
Stakken er en LIFO-struktur (sidst ind, først ud), der bruges til midlertidigt at gemme data, overføre parametre eller gemme udførelseskonteksten.
- SKUBBE: Gemmer en værdi på stakken og reducerer SP-pointeren.
- POP: Henter den seneste værdi gemt på stakken, og øger SP.
- SKUB / POPF: De gemmer og henter status for CPU-flag på stakken.
3. Aritmetiske og logiske instruktioner
De tillader udførelse af beregninger og operationer på bits. Disse instruktioner er afgørende for at manipulere numeriske data og træffe beslutninger i programflowet.
Blandt de mest brugte finder vi:
- TILFØJ / SUB: Addition og subtraktion.
- MUL / IMUL: Binære multiplikationer.
- DIV / IDIV: Division (heltal eller med fortegn).
- OG / ELLER / XELLER / IKKE: Bitvise logiske operationer.
- SHL / SHR / ROL / ROR: Bitskift og rotationer.
4. Instruktioner til flowkontrol
De giver dig mulighed for at ændre programmets udførelsessekvens ved at introducere hop eller betingede og ubetingede kald til andre instruktioner.
- JMP: Springer ubetinget til en anden adresse i programmet.
- RING / RET: Kald til en subrutine og returner.
- JE/JNE/JG/JL/JZ/JNZ: Betingede spring, de udføres, hvis visse betingelser er opfyldt (efter en sammenligning).
5. Instruktioner for input/output (I/O)
De muliggør kommunikation mellem processoren og eksterne enheder. Disse instruktioner gør det muligt at læse og skrive data til/fra porte (hardware).
- I: Læser data fra en inputport.
- UD: Sender data til en outputport.
6. Flydende komma-instruktioner
Mange CPU'er har matematiske coprocessorer (eller særlige instruktioner) dedikeret til at arbejde med decimaltal (flydende kommatal). Disse instruktioner tillader operationer som:
- Addition, subtraktion, multiplikation og division af reelle tal.
- Trigonometriske operationer (sinus, cosinus, tangent).
- Logaritmiske, eksponentielle og rodoperationer.
Disse instruktioner overholder typisk IEEE 754-standarden for numerisk præcision.
Adresseringstilstande
En fundamental del af instruktionsdesign er, hvordan operandernes placering identificeres. Adresseringstilstande definerer, hvordan CPU'en tilgår data.
1. Øjeblikkelig adressering
Dataene er inkluderet direkte i instruktionen. Det er hurtigt, men det tillader ikke at ændre værdier uden at ændre instruktionen.
MOV AX, 5
2. Direkte adressering
Hukommelsesadressen, der indeholder dataene, er eksplicit angivet.
MOV AX,
3. Indirekte adressering
Den effektive adresse hentes fra indholdet af en post. Meget fleksibel og bruges til strukturer og linkede lister.
MOV AX,
4. Indekseret adressering
Adressen beregnes ved at tilføje en base og et indeks (for eksempel for at gennemløbe arrays). Den bruger specielle registre såsom SI, DI eller base + offset-registre.
MOV AX,
Instruktionsformater: forskellige typer afhængigt af arkitekturen
Strukturen af en instruktion kan variere afhængigt af arkitekturen. Almindelige formater inkluderer:
4-vejsformat
Den indeholder to operander, en resultatplacering og adressen på den næste instruktion. Den er nu forældet på grund af dens kompleksitet.
3-vejsformat
Den specificerer to operander og en destinationsadresse. Det er almindeligt i moderne RISC-arkitekturer.
2-vejsformat
Brug en kildeoperand og en destinationsoperand (destinationen kan også bidrage med værdi). Populær på x86 og andre CISC-arkitekturer.
1-vejsformat
Kun én operand er angivet; den anden antages at være akkumulatoren. Almindelig i ældre processorer og simple systemer.
0-adresseformat (stakbaseret)
Operationerne bruger stakken til at hente og gemme operander og resultater. Meget effektivt for stakbaserede maskiner, såsom nogle programmerbare regnemaskiner.
Makroinstruktioner og pseudo-opcodes
For at forbedre produktiviteten tilbyder mange assemblere makroinstruktioner , som udvider en enkelt linje til flere faktiske instruktioner. Disse er nyttige til at undgå gentagelse af komplekse mønstre eller til at oprette strukturer på højt niveau såsom løkker eller betingede sætninger.
masse pseudo-opkoder Det er instruktioner, som assembleren internt oversætter til en reel instruktionerækkefølge. For eksempel, NOP (ingen operation) kan oversættes til XCHG AX, AX på x86 CPU.
Assembler-direktiver
Direktiver ( også kaldet pseudo-operationer ) er ikke instruktioner i ordets egentlige forstand. De tjener til at styre assembly-processen, definere data, kodeafsnit, makroer, kompileringsbetingelser osv.
Almindelige eksempler omfatter:
- .data / .kode: De angiver data- eller kodeafsnittet.
- .org: Angiver den adresse, hvorfra samlingen starter.
- .ligning: Definerer symbolske konstanter.
Brugssager til assemblersprog
Trods fremkomsten af højniveausprog er assemblersprog fortsat nøglen på flere områder:
- Udvikling af indlejrede systemer og mikrocontrollere.
- Programmering af drivere, bootloadere og BIOS.
- Ekstrem optimering i applikationer som videospil eller kryptografi.
- Reverse engineering, debugging og lavniveau-hacking.
Derudover indtager træning i assemblersprog stadig en vigtig plads inden for datalogi og elektronik, da det giver en dyb forståelse af, hvordan en processor fungerer, hvordan data lagres og manipuleres, og hvordan instruktioner udføres på binært niveau.
Forståelse af alle typer monteringsinstruktioner, deres struktur, funktionalitet og adresseringstilstande giver et solidt fundament for enhver programmør, der ønsker at fordybe sig i lavniveauprogrammering eller forstå, hvordan højniveausprog i sidste ende oversættes til maskinkode. Selvom brugen er blevet mere specifik, er det fortsat et vigtigt værktøj inden for flere kritiske områder af software- og systemudvikling.