Porozumění slotům pro zpoždění větví pro reverzi MIPS

Staticky obracím nějaký software kompilovaný pro Atheros AR7161 pomocí radare2. Tento procesor implementuje MIPS a vzpomínám si, že MIPS má slot pro zpoždění větví. To je při demontáži skutečně patrné, protože vidím instrukce, které by se měly logicky provést před umístěním větví hned za ně.

Při analýze nějakého kódu jsem však narazil na instrukci beqz, u které za předpokladu, že instrukce poté, co by se měla provést jako první, nemá v kontextu programu smysl. Musím připustit, že moje analýza může být špatná, což není nepravděpodobné; Mám však určité pochybnosti, že bych také chtěl vymazat:

  • Proveďte všechny instrukce větvení / skoku vždy pomocí slotu pro zpoždění větve tak, aby se instrukce hned poté logicky provedla jako první ? Pokud ne, v jakých případech by tomu tak nebylo?

  • Existuje nějaký způsob, jak radare2 ukázat logické pořadí provádění, spíše než ten, který je zakódován v binárním souboru?

Upravit : konkrétně mám na mysli následující posloupnost:

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

Mám v hlavě velmi rozptýlený obraz o tom, jak tato instrukce jde do potrubí. Dokážu si představit načítání druhé instrukce, zatímco první se dekóduje; proto , spuštění slotu pro zpoždění větve by mělo skutečně začít. Instrukce větvení však závisí na tom, aby byl stejný registr upraven instrukcí ve slotu zpoždění větve, tak co se stane? Bude instrukce větve hodnotit stav pomocí starého registru lue, nebo nový aktualizovaný lb?

Díky

Komentáře

  • Čtení série MIPS vám může pomoci Raymond Chen zde: odkaz První odpověď je ne (podrobnosti najdete v odkazu). Na druhý nemohu ' odpovědět.

Odpovědět

Pokyn ve slotu zpoždění větve je vyhodnocen po instrukci větvení (nebo skoku). Provedení instrukce ve slotu pro zpoždění větve nemá vliv na vyhodnocení stavu větve.

Pozoroval jsem, že se slot pro zpoždění větve používá pro několik věcí:

  • Poslední instrukce základního bloku vedoucí k instrukci větve
    • Test větvení nebude záviset na výstupu výpočtu instrukce slotu zpoždění větve
    • Běžně viditelný u bezpodmínečných skoků / větví jako b, jal
  • první instrukce bloku propadu .
    • Pokud je pobočka přijata, neměly by být přítomny žádné vedlejší účinky.
    • Analýza ukáže, že v případě přijetí pobočky nejsou potřebné žádné ovlivněné registry
  • První instrukce bloku, pokud je braná větev
    • Pokud existuje více cest k cíli větve, bude tato instrukce pravděpodobně vidět vícekrát s různými větvemi
  • Načtení podmíněné hodnoty, často pro návratové hodnoty

Tento článek jde do detailů o slotech pro zpoždění větví.

Jak poznamenal Igor, „pravděpodobná“ verze instrukce větve udržuje účinky instrukce ve slotu zpoždění větve, pouze pokud je instrukce skutečně přijata.

Odpověď

  1. Existují varianty podmíněných větví, které se nazývají „větev [za podmínky] pravděpodobné“, např.
    • bgezl – Pobočka s větší pravděpodobností nebo rovna nule
    • beql – Pobočka zapnutá Pravděpodobně stejné

Tyto pokyny mají slot pro zpoždění, ale instrukce ve slotu pro zpoždění se provádí pouze je-li větev přijata. Pokud větev není přijata, instrukce ve zpožďovacím slotu se ne provede ( nullified ) .

Pozn .: Tyto pokyny byly odstraněny ve verzi 6 MIPS Architecture. Přidala také kompaktní varianty větví, které nemají zpožďovací sloty.

Pokud jde o váš úryvek, silně mám podezření, že pobočka používá starou hodnotu registru, ale pravděpodobně ji můžete potvrdit pouze spuštěním na skutečném procesoru.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *