Az elágazás késleltetési helyeinek megértése a MIPS megfordításához

Statikusan megfordítok néhány szoftvert, amelyet egy Atheros AR7161-hez fordítottam a radare2 segítségével. Ez a processzor valósítja meg a MIPS-t, és emlékeztetem arra, hogy a MIPS rendelkezik elágazási késleltetési résszel. Ez valóban észrevehető a szétszerelésnél, mert látok utasításokat, amelyeket logikusan végre kell hajtani, mielőtt az ágakat közvetlenül utánuk helyeznék.

Ugyanakkor egy kódrészlet elemzése közben egy beqz utasításra bukkantam, amelynek feltételezésével az első végrehajtás utáni utasításnak nincs értelme a program összefüggésében. Be kell vallanom, hogy elemzésem téves lehet, ami nem valószínű; van azonban kételyem, hogy én is szeretnék törölni:

  • Minden elágazási / ugrási utasítás mindig használja az elágazás késleltetési helyét, hogy az utána lévő utasításnak először logikusan végre kell hajtania ? Ha nem, akkor milyen esetekben nem?

  • Van valamilyen módja annak, hogy a radare2 a logikai végrehajtási sorrendet jelenítse meg, nem pedig a binárisban kódolva?

Szerkesztés : konkrétan a következő sorrenddel foglalkozom:

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

Nagyon diffúz kép van a fejemben arról, hogy ezek az utasítások a folyamatba mennek. Képes vagyok elképzelni, hogy a második utasítás beolvasása közben az első dekódolása folyamatban van; ezért , az elágazás késleltetési helyének végrehajtását ténylegesen el kell kezdeni. Azonban az elágazási utasítás attól függ, hogy ugyanazt a regisztert módosítja az elágazás késleltetési résében lévő utasítás, tehát mi fog történni? Az elágazási utasítás kiértékeli a feltételt a régi regiszter használatával lue, vagy az újat frissítette az lb?

Köszi

Megjegyzések

  • Előnyös lehet, ha elolvassa a MIPS sorozatot: Raymond Chen itt: link Az első válasz nemleges (a részletekért lásd a linket). ' nem tudom a másodikat megválaszolni.

Válasz

Az elágazás késleltetési helyében lévő utasítást az elágazás (vagy ugrás) utasítás után értékelik ki. Az utasítás végrehajtása az elágazás késleltetési résében nem befolyásolja az elágazás állapotának értékelését.

Megfigyeltem, hogy az elágazás késleltetési rés néhány dologra használható:

  • Az elágazási utasításhoz vezető alapblokk utolsó utasítása
    • Az elágazási teszt nem függ az elágazás késleltetési rés utasításának kiszámításának kimenetétől
    • Általában feltétel nélküli ugrások / elágazások esetén látható mint b, jal
  • Az átesés blokkjának első utasítása .
    • Ha az elágazás megtörténik, nem lehetnek mellékhatások.
    • Az elemzés megmutatja, hogy az érintett ágak létrehozása esetén nincs szükség semmilyen érintett nyilvántartásra.
  • A blokk első utasítása az elágazás esetén
    • Ha az elágazási célhoz több út vezet, akkor ez az utasítás valószínűleg többször lesz látható a különböző elágazásokkal
  • Feltételes érték betöltése, gyakran visszatérő értékek esetén

Ez a cikk részletesen ismerteti az elágazás késleltetési helyeit.

Amint Igor megjegyezte, az elágazási utasítás “valószínű” változata csak akkor tartja meg az utasítás hatásait az elágazás késleltetési helyében, ha az utasítást ténylegesen megtették.

Válasz

  1. A feltételes ágaknak “elágazás [feltétel szerint] valószínűnek” nevezett változatai vannak, pl.
    • bgezl – Fióktelep nagyobb, vagy egyenlő a nullával valószínűleg
    • beql – Fiók Egyenlő valószínű

Ezeknek az utasításoknak van egy késleltetési helye, de a késleltetési helyben lévő utasításokat csak ha az ágat felveszik. Ha az ág nem kerül elfogadásra, akkor a késleltetési helyben az utasítás nem lesz végrehajtva ( érvénytelenítve ) .

Megjegyzés: ezeket az utasításokat eltávolítottuk a MIPS Architecture 6. kiadásából. Ezenkívül olyan ágak kompakt változatát is hozzáadta, amelyek nem rendelkeznek késleltetési résszel.

A töredékét illetően erősen gyanítom, hogy az ág a régi regiszter értéket használja, de valószínűleg megerősítheti csak egy tényleges processzoron futtatva.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük