PEEK i POKE - PEEK and POKE

PEEK i POKE w linii 100 programu Commodore Basic na CBM 3016

W obliczeniowej , PEEK i POKE są polecenia używane w niektórych językach programowania wysokiego poziomu dostępu do zawartości komórki pamięci wskazywanej przez specyficzne jego adresu pamięci . PEEK pobiera bajt znajdujący się pod określonym adresem pamięci. POKE ustawia bajt pamięci pod podanym adresem. Polecenia te pochodzą z monitorów kodu maszynowego, takich jak monitor DECsystem-10 ; polecenia te są szczególnie związane z językiem programowania BASIC , chociaż niektóre inne języki, takie jak Pascal i COMAL, również mają te polecenia. Te polecenia są porównywalne w swoich rolach do wskaźników w języku C i niektórych innych językach programowania.

Jednym z najwcześniejszych odniesień do tych poleceń w BASIC, jeśli nie najwcześniejszym, jest Altair BASIC . Polecenia PEEK i POKE zostały opracowane we wczesnych systemach komputerów osobistych, aby służyć różnym celom, zwłaszcza do modyfikowania specjalnych rejestrów sprzętowych mapowanych w pamięci w celu sterowania określonymi funkcjami komputera, takimi jak urządzenia peryferyjne wejścia/wyjścia. Alternatywnie programiści mogą używać tych poleceń do kopiowania oprogramowania, a nawet do obejścia intencji określonego fragmentu oprogramowania (np. manipulowania programem gry, aby umożliwić użytkownikowi oszukiwanie). W dzisiejszych czasach sterowanie pamięcią komputera na tak niskim poziomie za pomocą języka wysokiego poziomu, takiego jak BASIC, jest rzadkością. W związku z tym pojęcia poleceń PEEK i POKE są ogólnie postrzegane jako przestarzałe.

Terminy peek i poke są czasami używane potocznie w programowaniu komputerowym w odniesieniu do ogólnego dostępu do pamięci.

Składnia instrukcji

Funkcja PEEK i polecenia POKE są zwykle wywoływane w następujący sposób, albo w trybie bezpośrednim (wprowadzanym i wykonywanym w wierszu BASIC ), albo w trybie pośrednim (jako część programu ):

integer_variable = PEEK(address)

POKE address, value

Parametry adresu i wartości mogą zawierać złożone wyrażenia , o ile oceniane wyrażenia odpowiadają odpowiednio poprawnym adresom pamięci lub wartościom. Prawidłowy adres w tym kontekście jest adresem w przestrzeni adresowej komputera , podczas gdy prawidłowa wartość jest (zazwyczaj) wartością bez znaku od zera do maksymalnej liczby bez znaku, jaką może posiadać minimalna adresowalna jednostka (komórka pamięci).

Komórki pamięci i rejestry sprzętowe

Lokalizacje adresowych, które są szturchnął lub zajrzał na może odnosić się zarówno do zwykłych komórek pamięci lub pamięci odwzorowany rejestrów sprzętowych z I / O jednostki lub żetonów pomocniczych, takich jak chipsy dźwiękowych i układów graficznych wideo, a nawet pamięci odwzorowany rejestrów CPU (co umożliwia implementacje oprogramowania potężnych monitorów kodu maszynowego i narzędzi do debugowania /symulacji). Jako przykład schematu sterowania układem wspomagania opartego na POKE, następujące polecenie POKE jest skierowane do określonego rejestru wbudowanego układu graficznego VIC-II Commodore 64 , co spowoduje, że obramowanie ekranu stanie się czarne:

POKE 53280, 0

Podobny przykład z rodziny Atari 8-bitowych mówi sterownikowi ekranu ANTIC , aby odwrócił cały tekst do góry nogami:

POKE 755, 4

Różnica między maszynami oraz znaczenie i użyteczność lokalizacji pamięci przewodowej oznaczały, że „mapy pamięci” różnych maszyn były ważnymi dokumentami. Przykładem jest Mapping the Atari , który zaczyna się od lokalizacji zero i mapuje całą 64 kB pamięci 8-bitowych systemów Atari lokalizacja po lokalizacji.

PEEK i POKE w innych BASIC

Firma North Star Computers , producent z wczesnych lat osiemdziesiątych, oferowała własny dialekt języka BASIC z systemem operacyjnym NSDOS . Zaniepokojeni możliwymi kwestiami prawnymi zmienili nazwy komend EXAMi FILL. Istniały również dialekty BASIC, które zamiast tego używały zastrzeżonych słów MEMW i MEMR.

BBC BASIC , używany w BBC Micro i innych komputerach Acorn Computers , nie zawierał słów kluczowych PEEK i POKE, ale używał symbolu znaku zapytania (?), znanego jako zapytanie w BBC BASIC, dla obu operacji, jako funkcji i polecenia. Na przykład:

> 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

32-bitowe wartości można POKEd i PEEKed za pomocą symbolu wykrzyknika (!), znanego jako pling , z najmniej znaczącym bajtem na początku ( little-endian ). Dodatkowo adres może zostać przesunięty przez podanie zapytania lub pling po adresie i następującego po nim przesunięcia:

> !W% = &12345678   : REM ampersand (&) specifies hexadecimal
> PRINT ~?W%, ~W%?3 : REM tilde (~) prints in hexadecimal
        78        12

Ciągi tekstu mogą być sprawdzane i szperane w podobny sposób za pomocą znaku dolara ($). Koniec ciągu oznaczony jest znakiem powrotu karetki (&0D w ASCII ); przy odczycie ten znak kończący nie jest zwracany. Przesunięć nie można używać ze znakiem dolara.

> 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

Wersje 16 i 32-bitowe

Ponieważ większość wczesnych komputerów domowych korzysta z procesorów 8-bitowych, wartości PEEK lub POKE mieszczą się w zakresie od 0 do 255. Ustawienie lub odczyt 16-bitowej wartości na takich maszynach wymaga dwóch poleceń, takich jak odczyt 16-bitowej liczby całkowitej pod adresem A i a następnie i do przechowywania 16-bitowej liczby całkowitej V pod adresem A. {{{1}}}POKE A,VPOKE A+1,V/256

Niektóre BASIC-y, nawet na 8-bitowych maszynach, mają polecenia do odczytywania i zapisywania 16-bitowych wartości z pamięci. BASIC XL dla rodziny Atari 8-bitowych używa prefiksu "D" (dla "podwójnego"), DPEEKa DPOKEwschodnioniemiecki "Kleincomputer" KC85/1 i KC87 nazywa je DEEKi DOKE.

Sinclair QL ma PEEK_Wi POKE_Wdla wartości 16-bitowych i PEEK_Li POKE_Ldla wartości 32-bitowych. ST BASIC dla Atari ST używa tradycyjnych nazw, ale pozwala na zdefiniowanie 8/16/32-bitowych segmentów pamięci i adresów, które określają rozmiar.

POKE jako kody

W kontekście gier na wiele komputerów 8-bitowych użytkownicy mogli wczytywać gry do pamięci i przed ich uruchomieniem modyfikować określone adresy pamięci w celu oszukiwania , uzyskania nieograniczonej liczby żyć, odporności, niewidzialności itp. Takie modyfikacje zostały wykonane za pomocą instrukcji POKE. The Commodore 64 , ZX Spectrum i Amstrad CPC dozwolone również gracze z odpowiednich wkładów lub Multiface add-on do zamrożenia programu działa, wprowadź wyśmiewa i wznowić.

Na przykład w Knight Lore dla ZX Spectrum odporność można uzyskać za pomocą następującego polecenia:

POKE 47196,201

W tym przypadku wartość 201 odpowiada instrukcji RET , tak że gra powraca z podprogramu wcześniej przed wyzwoleniem wykrywania kolizji .

Czasopisma takie jak Your Sinclair publikowały listy takich POKE do gier. Takie kody były generalnie identyfikowane poprzez inżynierię wsteczną kodu maszynowego w celu zlokalizowania adresu pamięci zawierającego pożądaną wartość, która dotyczyła np. liczby żyć, wykrywania kolizji itp.

Korzystanie z cheatów „POKE” jest trudniejsze we współczesnych grach, ponieważ wiele z nich zawiera środki zapobiegające oszustwom lub ochronę przed kopiowaniem, które uniemożliwiają modyfikację przestrzeni pamięci gry. Nowoczesne systemy operacyjne wymuszają schematy ochrony pamięci wirtualnej , aby odmawiać zewnętrznemu programowi dostępu do pamięci niewspółdzielonej (na przykład oddzielne tabele stron dla każdej aplikacji, a więc niedostępne obszary pamięci).

Ogólne użycie POKE

„POKE” jest czasem używane w odniesieniu do jakiejkolwiek bezpośredniej manipulacji zawartością pamięci, a nie tylko przez BASIC, szczególnie wśród ludzi, którzy uczyli się obsługi komputera na 8-bitowych mikrokomputerach z końca lat 70. i na początku lat 80. XX wieku. BASIC był często jedynym językiem dostępnym na tych maszynach (na komputerach domowych , zwykle obecny w ROM ), a zatem oczywistym i najprostszym sposobem programowania w języku maszynowym było użycie BASICa do WKŁADANIA wartości opcode do pamięci. Takie kodowanie niskopoziomowe zwykle wynikało z braku dostępu do asemblera .

Przykład ogólnego użycia POKE i PEEK znajduje się w Visual Basic for Windows , gdzie DDE można uzyskać za pomocą słowa kluczowego LinkPoke .

Zobacz też

Bibliografia