PEEK a POKE - PEEK and POKE
Ve výpočetní technice jsou PEEK a POKE příkazy používané v některých programovacích jazycích vyšší úrovně pro přístup k obsahu konkrétní paměťové buňky odkazované její adresou paměti . PEEK získá bajt umístěný na zadané adrese paměti. POKE nastaví paměťový bajt na zadanou adresu. Tyto příkazy pocházejí z monitorů strojového kódu , jako je monitor DECsystem-10 ; tyto příkazy jsou spojeny zejména s programovacím jazykem BASIC , ačkoli některé další jazyky, jako například Pascal a COMAL, tyto příkazy také mají. Tyto příkazy jsou svými rolemi srovnatelné s ukazateli v jazyce C a některých dalších programovacích jazycích.
Jeden z prvních odkazů na tyto příkazy v BASIC, ne -li nejdříve, je v Altair BASIC . Příkazy PEEK a POKE byly navrženy v raných osobních výpočetních systémech, aby sloužily různým účelům, zejména pro úpravu speciálních hardwarových registrů mapovaných v paměti pro ovládání určitých funkcí počítače, jako jsou vstupní/výstupní periferie. Alternativně mohou programátoři použít tyto příkazy ke kopírování softwaru nebo dokonce k obejití záměru konkrétního softwaru (např. Manipulovat s herním programem, aby mohl uživatel podvádět). Dnes je neobvyklé ovládat paměť počítače na tak nízké úrovni pomocí jazyka na vysoké úrovni, jako je BASIC. Pojmy příkazů PEEK a POKE jsou obecně považovány za zastaralé.
Výrazy peek a poke se někdy v počítačovém programování používají hovorově pro přístup k paměti obecně.
Syntaxe příkazu
Funkce PEEK a příkazy POKE se obvykle vyvolávají následovně, a to buď v přímém režimu (zadává se a provádí se na výzvu BASIC ), nebo v nepřímém režimu (jako součást programu ):
integer_variable = PEEK(address)
POKE address, value
Parametry adresy a hodnoty mohou obsahovat složité výrazy , pokud vyhodnocené výrazy odpovídají platným adresám nebo hodnotám paměti. Platná adresa v tomto kontextu je adresa v adresním prostoru počítače , zatímco platná hodnota je (obvykle) hodnota bez znaménka mezi nulou a maximálním číslem bez znaménka, které může obsahovat minimální adresovatelná jednotka (paměťová buňka).
Paměťové buňky a hardwarové registry
Tyto adresy místa, která jsou tropil nebo nakoukla při může odkazovat buď na běžné paměťové buňky nebo paměťově mapované hardwarových registrů pro I / O jednotek nebo podpůrné čipy, jako jsou zvukové čipy a video grafických čipů, nebo dokonce paměťově mapované registry v procesoru sám (což umožňuje softwarové implementace výkonných monitorů strojového kódu a nástrojů pro ladění /simulaci). Jako příklad schématu řízení podpůrných čipů řízených POKE je následující příkaz POKE nasměrován na konkrétní registr vestavěného grafického čipu VIC-II Commodore 64 , který ohraničí obrazovku černou barvou:
POKE 53280, 0
Podobný příklad z 8bitové rodiny Atari říká ovladači displeje ANTIC, aby obrátil celý text vzhůru nohama:
POKE 755, 4
Rozdíl mezi stroji a důležitost a užitečnost pevně zapojených paměťových míst znamenaly, že „paměťové mapy“ různých strojů byly důležitými dokumenty. Příkladem je mapování Atari , které začíná na nulovém místě a mapuje celou 64 kB paměť 8bitových systémů Atari podle umístění.
PEEK a POKE v dalších ZÁKLADECH
North Star Computers , prodejce z počátku 80. let minulého století, nabízel se svým operačním systémem NSDOS vlastní dialekt BASIC . Z obav z možných právních problémů přejmenovali příkazy EXAM
a FILL
. Existovaly také ZÁKLADNÍ dialekty, které místo toho používaly vyhrazená slova MEMW a MEMR.
BBC BASIC , používaný na BBC Micro a dalších počítačích Acorn Computers , neobsahoval klíčová slova PEEK a POKE, ale jako funkci a příkaz používal symbol otazníku (?), Známý jako dotaz v BBC BASIC, pro obě operace. Například:
> DIM W% 4 : REM reserve 4 bytes of memory, pointed to by integer variable W%
> ?W% = 42 : REM store constant 42; equivalent of 'POKE W%, 42'
> PRINT ?W% : REM print the byte pointed to by W%; equivalent of 'PRINT PEEK(W%)'
42
32bitové hodnoty by mohly být POKEd a PEEKed pomocí symbolu vykřičníku (!), Známého jako pling , s nejméně významným bajtem jako prvním ( little-endian ). Kromě toho je adresa, kterou lze kompenzovat zadáním buď dotaz nebo Pling po adresy a pokud by následovalo posun:
> !W% = &12345678 : REM ampersand (&) specifies hexadecimal
> PRINT ~?W%, ~W%?3 : REM tilde (~) prints in hexadecimal
78 12
Řetězce textu lze PEEKOVAT a POKEd podobným způsobem pomocí znaku dolaru ($). Konec řetězce je označen návratovým znakem Carriage (& 0D v ASCII ); při zpětném čtení se tento ukončovací znak nevrací. Offsety nelze použít se znakem dolaru.
> DIM S% 20 : REM reserve 20 bytes of memory pointed to by S%
> $S% = "MINCE PIES" : REM store string 'MINCE PIES', terminated by &0D
> PRINT $(S% + 6) : REM retrieve string, excluding &0D terminator, and starting at S% + 6 bytes
PIES
16 a 32bitové verze
Protože většina raných domácích počítačů používá 8bitové procesory, hodnoty PEEK nebo POKE se pohybují mezi 0 a 255. Nastavení nebo čtení 16bitové hodnoty na těchto počítačích vyžaduje dva příkazy, jako je čtení 16bitového celého čísla na adrese A, a následuje a uloží 16bitové celé číslo V na adresu A.
{{{1}}}
POKE A,V
POKE A+1,V/256
Některé BASICy, dokonce i na 8bitových počítačích, mají příkazy pro čtení a zápis 16bitových hodnot z paměti. BASIC XL pro 8bitovou rodinu Atari používá předponu „D“ (pro „dvojité“): DPEEK
a DPOKE
východoněmecký „Kleincomputer“ KC85/1 a KC87 je nazývá DEEK
a DOKE
.
Sinclair QL má PEEK_W
i POKE_W
pro 16-bitové hodnoty a PEEK_L
a POKE_L
pro 32-bitové hodnoty. ST BASIC pro Atari ST používá tradiční názvy, ale umožňuje definovat 8/16/32 bitové segmenty paměti a adresy, které určují velikost.
POKE jako podvodníci
V kontextu her pro mnoho 8bitových počítačů mohli uživatelé načítat hry do paměti a před jejich spuštěním upravit konkrétní adresy paměti, aby podváděli , získali neomezený počet životů, imunitu, neviditelnost atd. Takové úpravy byly provedeny pomocí příkazů POKE. The Commodore 64 , ZX Spectrum a Amstrad CPC také dovoleno hráči s příslušnými kazetami nebo Multiface add-on zmrazit běžící program, zadejte tropí a resumé.
Například v Knight Lore pro ZX Spectrum lze imunity dosáhnout pomocí následujícího příkazu:
POKE 47196,201
V tomto případě hodnota 201 odpovídá instrukci RET , takže se hra vrátí z podprogramu brzy před spuštěním detekce kolize .
Časopisy, jako je Your Sinclair, publikovaly seznamy takových POKE pro hry. Takové kódy byly obecně identifikovány reverzním inženýrstvím strojového kódu k vyhledání adresy paměti obsahující požadovanou hodnotu, která se týkala například počtu životů, detekce kolizí atd.
Použití cheatu „POKE“ je v moderních hrách obtížnější, protože mnoho z nich obsahuje opatření proti podvádění nebo ochraně proti kopírování, která brání úpravě paměťového prostoru hry. Moderní operační systémy vynucují schémata ochrany virtuální paměti k odepření přístupu externích programů k nesdílené paměti (například samostatné tabulky stránek pro každou aplikaci, tedy nepřístupné paměťové prostory).
Obecné použití POKE
„POKE“ se někdy používá k označení jakékoli přímé manipulace s obsahem paměti, nikoli pouze prostřednictvím BASIC, zejména u lidí, kteří se naučili pracovat s osmibitovými mikropočítači na konci sedmdesátých a na začátku osmdesátých let. BASIC byl často jediným jazykem dostupným na těchto strojích (na domácích počítačích , obvykle přítomných v ROM ), a proto bylo zjevným a nejjednodušším způsobem programování ve strojovém jazyce použití BASIC k POKE ulošení hodnot operačního kódu do paměti. Dělat hodně nízkoúrovňového kódování tímto způsobem obvykle pochází z nedostatku přístupu k assembleru .
Příklad obecného použití POKE a PEEK je v jazyce Visual Basic pro Windows , kde lze DDE dosáhnout pomocí klíčového slova LinkPoke .