/ / Prístup k pamäti segmentu kódu pomocou SW a LW v MIPS - montáž, mips

Prístup k pamäti segmentu kódov pomocou SW a LW v MIPS - montáž, mips

Je možné získať prístup k pamäti segmentu kódu pomocou SW a LW pokyny v MIPS, vzhľadom na adresu pokynov?

Napríklad:

0x1000: ADDI $s1, $zero, 0x1000
0x1004: LW $s2, 4($s1)

Do čoho sa kód načíta $s2? 0x0000 (za predpokladu, že dátový segment je prázdny) alebo binárne znázornenie inštrukcie na 0x1004?

EDIT:

AFAIK, pipelining v procesore MIPS je možný kvôli oddeleniu pamäte inštrukcií a dátovej pamäte - opravte ma, ak sa mýlim.

EDIT 2:

Našiel som otázka, odpoveď na ktorú znamená, že k pokynom je možné pristupovať a meniť ich pomocou LW a SW, Odpoveď teda znie $s2 bude obsahovať binárnu reprezentáciu inštrukcie na 0x1004.

odpovede:

1 pre odpoveď č. 1

Načítate strojové kódovanie inštrukcie 0x1004.

MIPS má model s plochou pamäťou; rozdielny segmenty spustiteľného súboru sú mapované / načítané do rôznych častí jediného plochého pamäťového adresného priestoru; je to architektúra Von Neumanna kde sú bajty kódov a bajty inštrukcií rovnaké a zdieľajú rovnaký adresný priestor.

Kódové adresy používajú rovnaký priestor adries ako dátové adresy, Martinova odpoveď naznačuje, že to bude možnévytvoriť MIPS, kde sú minimálne povolenia odlišné, a samozrejme vložený MIPS s jeho kódom v ROM nemohol modifikovať svoje inštrukcie pomocou obchodov. Ale aj tak by sa kód a dáta museli mapovať do rôznych častí tej istej fyzickej adresy. priestor, aj keď je chybný ukladací priestor na kódové adresy. Možno by ste mohli vytvoriť MIPS, kde by mohlo dôjsť aj k chybám kódových adries, ale je to nepravdepodobné. Prechody na dátové adresy môžu byť tiež chybné, ak ste deaktivovali vykonanie povolenia pre danú oblasť / stránku.

Na normálnom MIPS s inštrukciami v RAM, je možný samoobslužný kód ak máte nakonfigurované oprávnenia na zápis a spustenie. (Pamätajte však, že pre správnosť by ste zvyčajne potrebovali vyprázdniť i-cache, čo kód v tejto otázke a odpovedi nerobí.)


A BTW, .data v zdroji ASM v skutočnosti znamená .data časť, ktorý linker nakoniec prepojí s údajmi segment spustiteľného súboru. vidieť Aký je rozdiel medzi sekciou a segmentom vo formáte súboru ELF.

Najdôležitejším bodom je, že segmenty spustiteľného súboru nie sú rovnaké ako segmentovaná pamäť v štýle x86. (Terminológia má však podobný pôvod).


0 pre odpoveď č. 2

Závisí od toho, čo máte na mysli pod pojmom „MIPS“:

  • Skutočný procesor MIPS, aký ste našli v niektorých smerovačoch WLAN?

  • Niektoré emulátory MIPS ako SPIM alebo MARS?

V prípade skutočného CPU MIPS záleží na tom, ako je nakonfigurovaná jednotka správy pamäte:

Ak jednotka správy pamäte umožňuje prístup na čítanie do segmentu kódu, skutočne dostanete binárnu reprezentáciu inštrukcie na adrese 0x1004.

(Mimochodom: Budete musieť použiť addi $s1, $0, 0x1004 na zabezpečenie $s1 naozaj obsahuje 0x1004 pretože $s1 môže obsahovať inú hodnotu ako 0.)

Ak jednotka správy pamäte neumožňuje prístup k segmentu kódu, program zlyhá. (Zdá sa, že väčšina CPU MIPS toto nastavenie nepovoľuje.)

Ak používate emulátor ako SPIM, MARS (alebo iný), záleží to na tom, ako emulátor funguje ...

Teoreticky by mohli existovať tri typy emulátorov:

  • Niektoré padajú
  • Niektoré z nich čítali binárne zobrazenie
  • Niektorí, ktorí čítajú nejakú „hlúpu“ hodnotu