PEEK a POKE - PEEK and POKE

PEEK a POKE v řádku 100 programu Commodore Basic na CBM 3016

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 EXAMa 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,VPOKE 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é“): DPEEKa DPOKEvýchodoněmecký „Kleincomputer“ KC85/1 a KC87 je nazývá DEEKa DOKE.

Sinclair QLPEEK_Wi POKE_Wpro 16-bitové hodnoty a PEEK_La POKE_Lpro 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 .

Viz také

Reference