PEEK e POKE - PEEK and POKE

PEEK e POKE na linha 100 de um programa Commodore Basic em um CBM 3016

Na computação , PEEK e POKE são comandos usados ​​em algumas linguagens de programação de alto nível para acessar o conteúdo de uma célula de memória específica referenciada por seu endereço de memória . PEEK obtém o byte localizado no endereço de memória especificado. POKE define o byte de memória no endereço especificado. Esses comandos foram originados de monitores de código de máquina , como o monitor DECsystem-10 ; esses comandos estão particularmente associados à linguagem de programação BASIC , embora algumas outras linguagens, como Pascal e COMAL, também tenham esses comandos. Esses comandos são comparáveis ​​em suas funções a ponteiros na linguagem C e em algumas outras linguagens de programação.

Uma das primeiras referências a esses comandos no BASIC, se não a primeira, está no Altair BASIC . Os comandos PEEK e POKE foram concebidos nos primeiros sistemas de computação pessoal para servir a uma variedade de propósitos, especialmente para modificar registros de hardware mapeados em memória especial para controlar funções específicas do computador, como os periféricos de entrada / saída. Alternativamente, os programadores podem usar esses comandos para copiar software ou até mesmo para contornar a intenção de uma parte específica do software (por exemplo, manipular um programa de jogo para permitir que o usuário trapaceie). Hoje é incomum controlar a memória do computador em um nível tão baixo usando uma linguagem de alto nível como o BASIC. Como tal, as noções de comandos PEEK e POKE são geralmente vistas como antiquadas.

Os termos espiar e cutucar às vezes são usados ​​coloquialmente na programação de computadores para se referir ao acesso à memória em geral.

Sintaxe de instrução

A função PEEK e os comandos POKE são geralmente invocados da seguinte forma, tanto no modo direto (inserido e executado no prompt do BASIC ) ou no modo indireto (como parte de um programa ):

integer_variable = PEEK(address)

POKE address, value

Os parâmetros de endereço e valor podem conter expressões complexas , desde que as expressões avaliadas correspondam a endereços ou valores de memória válidos, respectivamente. Um endereço válido neste contexto é um endereço dentro do espaço de endereço do computador , enquanto um valor válido é (normalmente) um valor não assinado entre zero e o número não assinado máximo que a unidade endereçável mínima (célula de memória) pode conter.

Células de memória e registros de hardware

As localizações de endereço que são POKEd ou PEEKed podem referir-se a células de memória comuns ou a registros de hardware mapeados em memória de unidades de E / S ou chips de suporte, como chips de som e chips gráficos de vídeo, ou mesmo a registros mapeados em memória da CPU em si (o que torna possível as implementações de software de poderosos monitores de código de máquina e ferramentas de depuração / simulação). Como um exemplo de um esquema de suporte de controlo de apara POKE-accionado, o comando seguinte POKE é dirigido a um registo específico do Commodore64 é embutido vic-II chip gráfico, que fará com que a sua vez preto borda da tela:

POKE 53280, 0

Um exemplo semelhante da família Atari de 8 bits diz ao driver de exibição ANTIC para virar todo o texto de cabeça para baixo:

POKE 755, 4

A diferença entre as máquinas e a importância e utilidade dos locais de memória com fio significava que os "mapas de memória" de várias máquinas eram documentos importantes. Um exemplo é o Mapeamento do Atari , que começa na localização zero e mapeia toda a memória de 64 kB da localização dos sistemas Atari de 8 bits por localização.

PEEK e POKE em outros BASICs

North Star Computers , um fornecedor do início dos anos 1980, ofereceu seu próprio dialeto do BASIC com seu sistema operacional NSDOS . Preocupados com possíveis questões legais, eles renomearam os comandos EXAMe FILL. Havia também dialetos BASIC que usavam as palavras reservadas MEMW e MEMR.

BBC BASIC , usado na BBC Micro e em outras máquinas da Acorn Computers , não apresentava as palavras-chave PEEK e POKE, mas usava o símbolo de ponto de interrogação (?), Conhecido como consulta no BBC BASIC, para ambas as operações, como função e comando. Por exemplo:

> 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

Os valores de 32 bits podem ser POKEd e PEEKed usando o símbolo de exclamação (!), Conhecido como pling , com o byte menos significativo primeiro ( little-endian ). Além disso, o endereço pode ser deslocado especificando-se a consulta ou colocando-o após o endereço e seguindo-o com o deslocamento:

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

Strings de texto podem ser PEEKed e POKEd de maneira semelhante usando o sinal de dólar ($). O final da string é marcado com o caractere de retorno de carro (& 0D em ASCII ); quando lido de volta, este caractere de terminação não é retornado. Os deslocamentos não podem ser usados ​​com o cifrão.

> 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

Versões de 16 e 32 bits

Como a maioria dos primeiros computadores domésticos usa processadores de 8 bits, os valores de PEEK ou POKE estão entre 0 e 255. Definir ou ler um valor de 16 bits nessas máquinas requer dois comandos, como ler um número inteiro de 16 bits no endereço A, e seguido por e para armazenar um inteiro V de 16 bits no endereço A. {{{1}}}POKE A,VPOKE A+1,V/256

Alguns BASICs, mesmo em máquinas de 8 bits, têm comandos para ler e gravar valores de 16 bits da memória. O BASIC XL para a família Atari de 8 bits usa um prefixo "D" (para "duplo"): DPEEKe DPOKEo alemão oriental "Kleincomputer" KC85 / 1 e KC87 os chama de DEEKe DOKE.

O Sinclair QL tem PEEK_We POKE_Wpara valores de 16 bits e de PEEK_Le POKE_Lpara valores de 32 bits. ST BASIC para o Atari ST usa os nomes tradicionais, mas permite definir segmentos de memória de 8/16/32 bits e endereços que determinam o tamanho.

POKEs como cheats

No contexto de jogos para muitos computadores de 8 bits, os usuários podiam carregar jogos na memória e, antes de iniciá-los, modificar endereços de memória específicos para trapacear , obtendo um número ilimitado de vidas, imunidade, invisibilidade, etc. Tais modificações foram realizadas usando instruções POKE. O Commodore 64 , ZX Spectrum e Amstrad CPC também permitiam que jogadores com os cartuchos relevantes ou add-on Multiface congelassem o programa em execução, entrassem em POKEs e continuassem.

Por exemplo, em Knight Lore for the ZX Spectrum , a imunidade pode ser alcançada com o seguinte comando:

POKE 47196,201

Neste caso, o valor 201 corresponde a uma instrução RET , de forma que o jogo retorna de uma sub-rotina antes de acionar a detecção de colisão .

Revistas como Your Sinclair publicaram listas de POKEs para jogos. Esses códigos foram geralmente identificados por engenharia reversa do código de máquina para localizar o endereço de memória contendo o valor desejado relacionado a, por exemplo, o número de vidas, detecção de colisões, etc.

Usar um truque 'POKE' é mais difícil em jogos modernos, pois muitos incluem medidas anti-cheat ou de proteção contra cópia que inibem a modificação do espaço de memória do jogo. Os sistemas operacionais modernos impõem esquemas de proteção de memória virtual para negar o acesso do programa externo à memória não compartilhada (por exemplo, tabelas de página separadas para cada aplicativo, portanto, espaços de memória inacessíveis).

Uso genérico de POKE

"POKE" às vezes é usado para se referir a qualquer manipulação direta do conteúdo da memória, ao invés de apenas via BASIC, particularmente entre pessoas que aprenderam computação em microcomputadores de 8 bits no final dos anos 1970 e início dos anos 1980. O BASIC costumava ser a única linguagem disponível nessas máquinas (em computadores domésticos , geralmente presentes na ROM ) e, portanto, a maneira óbvia e mais simples de programar em linguagem de máquina era usar o BASIC para POKE os valores do opcode na memória. Fazer muita codificação de baixo nível como essa geralmente vinha da falta de acesso a um montador .

Um exemplo do uso genérico de POKE e PEEK está no Visual Basic para Windows , onde DDE pode ser obtido com a palavra-chave LinkPoke .

Veja também

Referências