Spørsmål:
Forståelse av grenforsinkelsesspor for reversering av MIPS
user25972
2018-10-12 20:16:10 UTC
view on stackexchange narkive permalink

Jeg reverserer statisk programvare som er samlet for en Atheros AR7161 ved hjelp av radare2. Denne prosessoren implementerer MIPS, og jeg husker at MIPS har en grenforsinkelsesspor. Dette merkes faktisk i demonteringen fordi jeg kan se instruksjoner som logisk skal utføres før grener blir plassert rett etter dem.

Imidlertid, mens jeg analyserte noe kode, kom jeg over en beqz-instruksjon som antar at instruksjonen etter at den skal utføres først gir ikke mening i sammenheng med programmet. Jeg må innrømme at analysen min kan være feil, noe som ikke er usannsynlig; Imidlertid har jeg noen tvil som jeg også vil fjerne:

  • Gjør alle gren- / hoppinstruksjoner alltid bruk grenforsinkelsessporet slik at instruksjonen rett etter skal logisk utføres først ? Hvis ikke, i hvilke tilfeller ville det ikke vært?

  • Er det noen måte å få radare2 til å vise den logiske kjøringsrekkefølgen i stedet for den som er kodet i binærfilen?

Edit : konkret, jeg har å gjøre med følgende sekvens:

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

Jeg har et veldig diffust bilde i hodet på meg om at denne instruksjonen går ut i rørledningen. Jeg kan se for meg at den andre instruksjonen blir hentet mens den første blir dekodet; Derfor skal utførelsen av grenforsinkelsessporet faktisk starte. Greninstruksjonen er imidlertid avhengig av at samme register blir endret av instruksjonen i grenforsinkelsessporet, så hva vil skje? Vil filialinstruksjonen evaluere tilstanden ved hjelp av den gamle registerverdien, eller den nye oppdatert av lb?

Takk

Du kan dra nytte av å lese MIPS-serien av Raymond Chen her: [link] (https://blogs.msdn.microsoft.com/oldnewthing/20180402-00/?p=98415) Det første svaret er nei (og se lenken for detaljer). Jeg kan ikke svare på det andre.
To svar:
ChrisG
2018-10-15 18:35:37 UTC
view on stackexchange narkive permalink

Instruksjonen i grenforsinkelsessporet evalueres etter greninstruksjonen (eller hopp). Utførelsen av instruksjonen i grenforsinkelsessporet påvirker ikke evalueringen av forgreningstilstanden.

Jeg har observert at grenforsinkelsessporet brukes til noen få ting:

  • Siste instruksjon av grunnleggende blokk som fører til greninstruksjon
    • Grenprøve vil ikke være avhengig av utdata fra beregningen av grenforsinkelses sporinstruksjon
    • Vanligvis sett med ubetingede hopp / grener som b , jal
  • Den første instruksjonen om fall gjennom blokken.
    • Ingen bivirkninger bør være til stede hvis filialen tas.
    • Analyse vil vise at det ikke er behov for registrer som påvirkes i tilfelle filialen tas
  • Den første instruksjonen om blokk hvis grenen tas
    • Hvis det er flere baner til grenmålet, vil denne instruksjonen sannsynligvis bli sett flere ganger med de forskjellige grenene
  • Belastningen av en betinget verdi, ofte for returverdier

Denne artikkelen går i detalj om grenforsinkelsesspor.

Som bemerket av Igor, holder den "sannsynlige" versjonen av greninstruksjonen kun effekten av instruksjonen i grenforsinkelsessporet hvis instruksjonen faktisk blir tatt.

Igor Skochinsky
2018-10-13 02:15:42 UTC
view on stackexchange narkive permalink
  1. Det er variasjoner av betingede grener kalt "gren [på tilstand] sannsynlig", f.eks
    • bgezl - Gren på større enn eller lik null sannsynlig
    • beql - Gren på like sannsynlig

Disse instruksjonene har et forsinkelsesspor, men instruksjonen i forsinkelsessporet er utført bare hvis filialen er tatt. Hvis grenen ikke blir tatt, blir instruksjonen i forsinkelsessporet ikke utført ( opphevet ).

NB: disse instruksjonene er fjernet i Utgivelse 6 av MIPS Architecture. Det la også til kompakte varianter av grener som ikke har forsinkelsesspor

Når det gjelder kodebiten din, mistenker jeg sterkt at grenen bruker gamle registerverdien, men du kan sannsynligvis bare bekrefte det ved å kjøre det på en faktisk prosessor.



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 4.0-lisensen den distribueres under.
Loading...