KIKA och POKA
Inom datorer är PEEK och POKE kommandon som används i vissa högnivåprogrammeringsspråk för att komma åt innehållet i en specifik minnescell som refereras av dess minnesadress . PEEK får byten som ligger på den angivna minnesadressen. POKE ställer in minnesbyten på den angivna adressen. Dessa kommandon har sitt ursprung med maskinkodmonitorer såsom DECsystem-10 monitor; dessa kommandon är särskilt förknippade med BASIC , även om vissa andra språk som Pascal och COMAL också har dessa kommandon. Dessa kommandon är i sina roller jämförbara med pekare i C-språket och vissa andra programmeringsspråk.
En av de tidigaste referenserna till dessa kommandon i BASIC, om inte den tidigaste, finns i Altair BASIC . PEEK- och POKE-kommandona skapades i tidiga persondatorsystem för att tjäna en mängd olika syften, speciellt för att modifiera speciella minnesmappade hårdvaruregister för att styra speciella funktioner hos datorn, såsom in-/utmatningsutrustning. Alternativt kan programmerare använda dessa kommandon för att kopiera programvara eller till och med för att kringgå avsikten med en viss mjukvara (t.ex. manipulera ett spelprogram för att låta användaren fuska). Idag är det ovanligt att styra datorminne på en så låg nivå med ett högnivåspråk som BASIC. ses begreppen PEEK- och POKE -kommandon i allmänhet som föråldrade.
Termerna peek och poke används ibland i vardagsspråk i datorprogrammering för att hänvisa till minnesåtkomst i allmänhet.
Uttalandets syntax
PEEK-funktionen och POKE-kommandon anropas vanligtvis enligt följande, antingen i direktläge (inmatas och körs vid BASIC- prompten ) eller i indirekt läge (som en del av ett program ):
integer_variable = PEEK ( adress ) POKE- adress , värde
Adress- och värdeparametrarna kan innehålla komplexa uttryck , så länge som de utvärderade uttrycken motsvarar giltiga minnesadresser respektive värden . En giltig adress i detta sammanhang är en adress inom datorns adressutrymme , medan ett giltigt värde (vanligtvis) är ett osignerat värde mellan noll och det maximala osignerade antalet som den minsta adresserbara enheten (minnescellen) kan ha.
Minnesceller och hårdvaruregister
Adressplatserna som POKAS eller PEKAS på kan hänvisa antingen till vanliga minnesceller eller till minnesmappade hårdvaruregister för I/O -enheter eller stödchips som ljudchips och videografikchips, eller till och med till minnesmappade register för CPU:n sig (vilket gör mjukvaruimplementationer av kraftfulla maskinkodsmonitorer och felsöknings- /simuleringsverktyg möjliga). Som ett exempel på ett POKE-drivet chipkontrollschema riktar sig följande POKE-kommando till ett specifikt register för Commodore 64 :s inbyggda VIC-II- grafikchip, vilket gör att skärmkanten blir svart:
POKE 53280 , 0
Ett liknande exempel från Atari 8-bitarsfamiljen säger till ANTIC- displaydrivrutinen att vända upp och ner på all text:
POKE 755 , 4
Skillnaden mellan maskiner, och vikten och användbarheten av de fastanslutna minnesplatserna, gjorde att "minneskartor" över olika maskiner var viktiga dokument. Ett exempel är Mapping the Atari , som börjar på plats noll och kartlägger hela 64 kB minnet i Atari 8-bitars system plats för plats.
PEEK och POKE i andra BASICs
North Star Computers , en leverantör från tidigt 1980-tal, erbjöd sin egen dialekt av BASIC med sitt NSDOS- operativsystem . Bekymrade över möjliga juridiska frågor döpte de om kommandona EXAM
och FILL
. [ citat behövs ] Det fanns också BASIC dialekter som använde de reserverade orden MEMW och MEMR istället.
BBC BASIC , som används på BBC Micro och andra Acorn Computers- maskiner, innehöll inte nyckelorden PEEK och POKE utan använde frågetecknet (?), känd som fråga i BBC BASIC, för båda operationerna, som en funktion och som kommando. Till exempel:
> DIM W% 4 : REM- reserv 4 byte minne, pekad på av heltalsvariabeln W% > ? W% = 42 : REM- lagringskonstant 42; motsvarande 'POKE W%, 42' > SKRIV UT ? W% : REM -skriv ut byten som W% pekar på; motsvarighet till "PRINT PEEK(W%)" 42
32-bitars värden kan POKAS och PEKAS med hjälp av utropstecken (!), känd som pling , med den minst signifikanta byten först ( little-endian ). Dessutom kan adressen förskjutas genom att ange antingen fråga eller pling efter adressen och följa den med offset:
> ! W% = &12345678 : REM -tecken (&) anger hexadecimal > PRINT ~ ? W% , ~ W% ? 3 : REM tilde (~) skriver ut i hexadecimal 78 12
Textsträngar kan kikas och POKEs på liknande sätt med hjälp av dollartecknet ($). Slutet på strängen är markerat med Carriage return (&0D i ASCII ); vid tillbakaläsning returneras inte detta avslutande tecken. Offset kan inte användas med dollartecknet.
> DIM S% 20 : REM- reserv 20 byte minne pekade på av S% > $ S% = "MINCE PIES" : REM- lagringssträng 'MINCE PIES', avslutas av &0D > PRINT $( S% + 6 ) : REM- hämtning sträng, exklusive &0D terminator, och börjar vid S% + 6 byte PI ES
16- och 32-bitarsversioner
Eftersom de flesta tidiga hemdatorer använde 8-bitars processorer är PEEK- eller POKE-värdena mellan 0 och 255. Att ställa in eller läsa ett 16-bitarsvärde på sådana maskiner kräver två kommandon, som PEEK ( A ) + 256 * PEEK ( A + 1 )
för att läsa ett 16-bitars heltal på adress A, och POKE A , V
följt av POKE A + 1 , V / 256
och för att lagra ett 16-bitars heltal V på adress A.
Vissa BASICs, även på 8-bitars maskiner, har kommandon för att läsa och skriva 16-bitars värden från minnet. BASIC XL för Atari 8-bitarsfamiljen använder ett "D" (för "dubbel") prefix: DPEEK
och DPOKE
Den östtyska "Kleincomputer" KC85/1 och KC87 kallar dem DEEK
och DOKE
.
Sinclair QL har PEEK_W
och POKE_W
för 16-bitars värden och PEEK_L
och POKE_L
för 32-bitars värden. ST BASIC för Atari ST använder de traditionella namnen men tillåter att definiera 8/16/32 bitars minnessegment och adresser som bestämmer storleken.
POKER som fusk
I samband med spel för många 8-bitars datorer kunde användare ladda spel i minnet och, innan de startade dem, ändra specifika minnesadresser för att fuska, få ett obegränsat antal liv, immunitet, osynlighet, etc. Sådana ändringar utfördes använder POKE-satser. Commodore 64 , ZX Spectrum och Amstrad CPC gjorde det också möjligt för spelare med relevanta kassetter eller Multiface -tillägg att frysa det pågående programmet, ange POKEs och återuppta.
Till exempel, i Knight Lore för ZX Spectrum , kan immunitet uppnås med följande kommando:
POKE 47196 , 201
I det här fallet motsvarar värdet 201 en RET-instruktion , så att spelet återvänder från en subrutin tidigt innan det utlöser kollisionsdetektering .
Tidningar som Your Sinclair publicerade listor över sådana POKEs för spel. Sådana koder identifierades i allmänhet genom att omvända maskinkoden för att lokalisera minnesadressen som innehöll det önskade värdet som hänförde sig till till exempel antalet liv, upptäckt av kollisioner etc.
Att använda ett "POKE"-fusk är svårare i moderna spel, eftersom många inkluderar anti-fusk eller kopieringsskyddsåtgärder som förhindrar modifiering av spelets minnesutrymme. Moderna operativsystem tillämpar virtuellt minne för att neka externa programåtkomst till icke-delat minne (till exempel separata sidtabeller för varje applikation, därav otillgängliga minnesutrymmen).
Generisk användning av POKE
"POKE" används ibland för att hänvisa till all direkt manipulation av innehållet i minnet, snarare än bara via BASIC, särskilt bland personer som lärde sig datoranvändning på 8-bitars mikrodatorer i slutet av 1970-talet och början av 1980-talet. BASIC var ofta det enda språket som var tillgängligt på dessa maskiner (på hemdatorer , vanligtvis närvarande i ROM ), och därför var det uppenbara och enklaste sättet att programmera på maskinspråk att använda BASIC för att POKA in opcode -värdena i minnet. Att göra mycket lågnivåkodning som detta kom vanligtvis från bristande tillgång till en assembler .
Ett exempel på allmän användning av POKE och PEEK är i Visual Basic för Windows , där DDE kan uppnås med nyckelordet LinkPoke .