Forståelse af grenforsinkelsesslots til reversering af MIPS

Jeg vender statisk noget software, der er kompileret til en Atheros AR7161 ved hjælp af radare2. Denne processor implementerer MIPS, og jeg husker, at MIPS har en grenforsinkelsesslot. Dette bemærkes faktisk ved adskillelsen, fordi jeg kan se instruktioner, der logisk skal udføres, inden grene placeres lige efter dem.

Imidlertid, mens jeg analyserede et stykke kode, stødte jeg på en beqz-instruktion, som antages at instruktionen efter den skal udføres først giver ikke mening i forbindelse med programmet. Jeg må indrømme, at min analyse kunne være forkert, hvilket ikke er usandsynligt; Jeg er dog i tvivl om, at jeg også gerne vil rydde:

  • Brug altid alle gren- / springinstruktioner grenforsinkelsessporet, så instruktionen lige efter skal logisk udføres først ? Hvis ikke, i hvilke tilfælde ville det ikke være?

  • Er der nogen måde at få radare2 til at vise den logiske eksekveringsrækkefølge i stedet for den, der er kodet i binær?

Rediger : konkret har jeg at gøre med følgende sekvens:

beqz v0, <some address> lb v0, 0x40(sp) 

Jeg har et meget diffust billede i mit hoved om, at denne instruktion går ud i rørledningen. Jeg kan forestille mig, at den anden instruktion bliver hentet, mens den første afkodes; derfor , skal udførelsen af grenforsinkelsesslotten faktisk starte. Afdelingens instruktion afhænger dog af, at det samme register ændres af instruktionen i grenforsinkelsesslotten, så hvad vil der ske? Vil greninstruktionen evaluere tilstanden ved hjælp af det gamle register va lue eller den nye opdateret af lb?

Tak

Kommentarer

  • Du kan muligvis have gavn af at læse MIPS-serien ved Raymond Chen her: link Det første svar er nej (og se linket for detaljer). Jeg kan ' ikke besvare det andet.

Svar

Instruktionen i forgreningens forsinkelsesslot evalueres efter forgrenings- (eller spring) instruktionen. Udførelsen af instruktionen i grenforsinkelsesslotten påvirker ikke evalueringen af grenens tilstand.

Jeg har observeret, at grenforsinkelsesslotten bruges til et par ting:

  • Sidste instruktion af grundlæggende blok op til greninstruktion
    • Grenprøve vil ikke være afhængig af output fra beregningen af instruktion for grenforsinkelsesspalte
    • Almindeligvis set med ubetingede spring / grene som b, jal
  • Den første instruktion om fald gennem blokken .
    • Ingen bivirkninger bør være til stede, hvis filialen tages.
    • Analyse viser, at der ikke er behov for registre, der påvirkes, hvis grenen tages
  • Den første instruktion for blok, hvis grenen tages
    • Hvis der er flere stier til grenmål, vil denne instruktion sandsynligvis ses flere gange med de forskellige grene
  • Belastningen af en betinget værdi, ofte for returværdier

Denne artikel går i detaljer om grenforsinkelsesslots.

Som bemærket af Igor holder den “sandsynlige” version af greninstruktionen kun virkningerne af instruktionen i grenforsinkelsesslotten, hvis instruktionen faktisk er taget. p>

Svar

  1. Der er variationer af betingede grene kaldet “gren [på betingelse] sandsynlig”, f.eks.
    • bgezl – Forgrening større end eller lig med nul sandsynligt
    • beql – Forgrening til Lige sandsynligt

Disse instruktioner har et forsinkelsesslot, men instruktionen i forsinkelsesslotten udføres kun div id = “2d4d52c568″>

hvis grenen er taget. Hvis grenen ikke tages, er instruktionen i forsinkelsesslotten ikke udført ( ophævet ) .

NB: disse instruktioner er blevet fjernet i udgivelse 6 af MIPS Architecture. Det tilføjede også kompakte variationer af grene, der ikke har forsinkelsesslots

Hvad angår dit uddrag, formoder jeg stærkt, at grenen bruger den gamle registerværdi, men du kan sandsynligvis bekræfte det kun ved at køre det på en faktisk processor.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *