En informática , PEEK y POKE son comandos que se utilizan en algunos lenguajes de programación de alto nivel para acceder al contenido de una celda de memoria específica referenciada por su dirección de memoria . PEEK obtiene el byte ubicado en la dirección de memoria especificada. [1] POKE establece el byte de memoria en la dirección especificada. [2] Estos comandos se originaron con monitores de código de máquina como el monitor DECsystem-10 ; [3] estos comandos están particularmente asociados con el lenguaje de programación BASIC , aunque algunos otros lenguajes como Pascal y COMALtambién tienen estos comandos. Estos comandos son comparables en sus funciones a los punteros en el lenguaje C y algunos otros lenguajes de programación.
Una de las primeras referencias a estos comandos en BASIC, si no la más temprana, está en Altair BASIC . [4] Los comandos PEEK y POKE fueron concebidos en los primeros sistemas de computación personal para servir una variedad de propósitos, especialmente para modificar registros especiales de hardware mapeados en memoria para controlar funciones particulares de la computadora como los periféricos de entrada / salida. Alternativamente, los programadores pueden usar estos comandos para copiar software o incluso para eludir la intención de una pieza de software en particular (por ejemplo, manipular un programa de juego para permitir que el usuario haga trampa). Hoy en día es inusual controlar la memoria de la computadora a un nivel tan bajo usando un lenguaje de alto nivel como BASIC. Como tal, las nociones de comandos PEEK y POKE generalmente se consideran anticuadas.
Los términos peek y poke a veces se usan coloquialmente en la programación de computadoras para referirse al acceso a la memoria en general.
Sintaxis de declaración
La función PEEK y los comandos POKE generalmente se invocan de la siguiente manera, ya sea en modo directo (ingresado y ejecutado en el indicador BASIC ) o en modo indirecto (como parte de un programa ):
integer_variable = PEEK ( dirección ) Dirección de POKE , valor
Los parámetros de dirección y valor pueden contener expresiones complejas , siempre que las expresiones evaluadas correspondan a direcciones o valores de memoria válidos, respectivamente. Una dirección válida en este contexto es una dirección dentro del espacio de direcciones de la computadora , mientras que un valor válido es (típicamente) un valor sin signo entre cero y el número máximo sin signo que puede contener la unidad mínima direccionable (celda de memoria).
Celdas de memoria y registros de hardware
Las ubicaciones de dirección que están POKEd o PEEKed en pueden referirse a celdas de memoria ordinarias o a registros de hardware asignados en memoria de unidades de E / S o chips de soporte como chips de sonido y chips de gráficos de video, o incluso a registros de la CPU asignados en memoria en sí mismo (lo que hace posibles las implementaciones de software de potentes monitores de código de máquina y herramientas de depuración / simulación). Como un ejemplo de un sistema de apoyo de control de chip impulsado por el empuje, el siguiente comando POKE se dirige a un registro específico de la Commodore 64 que está incorporado en VIC-II chip de gráficos, lo que hará que el giro negro borde de la pantalla:
POKE 53280 , 0
Un ejemplo similar de la familia Atari de 8 bits le dice al controlador de pantalla ANTIC que ponga todo el texto al revés:
POKE 755 , 4
La diferencia entre las máquinas y la importancia y utilidad de las ubicaciones de memoria cableadas significaban que los "mapas de memoria" de varias máquinas eran documentos importantes. Un ejemplo es Mapping the Atari , que comienza en la ubicación cero y mapea toda la memoria de 64 kB de los sistemas Atari de 8 bits ubicación por ubicación.
PEEK y POKE en otros BÁSICOS
North Star Computers , un proveedor de principios de la década de 1980, ofreció su propio dialecto de BASIC con su sistema operativo NSDOS . Preocupados por posibles problemas legales, cambiaron el nombre de los comandos EXAM
y FILL
. [ cita requerida ] También hubo dialectos BÁSICOS que usaban las palabras reservadas MEMW y MEMR en su lugar.
BBC BASIC , utilizado en BBC Micro y otras máquinas Acorn Computers , no incluía las palabras clave PEEK y POKE, pero usaba el símbolo de interrogación (?), Conocido como consulta en BBC BASIC, para ambas operaciones, como función y comando. Por ejemplo:
> DIM W% 4 : REM reserva 4 bytes de memoria, señalados por la variable entera W% > ? % En peso = 42 : constante de almacenamiento REM 42; equivalente a 'POKE W%, 42' > IMPRIMIR ? W% : REM imprime el byte al que apunta W%; equivalente a 'PRINT PEEK (W%)' 42
Los valores de 32 bits pueden ser POKEd y PEEKed usando el símbolo de exclamación (!), Conocido como pling , con el byte menos significativo primero ( little-endian ). Además, la dirección podría compensarse especificando una consulta o pling después de la dirección y siguiéndola con el desplazamiento:
> ! W% = & 12345678 : REM ampersand (&) especifica hexadecimal > IMPRIMIR ~ ? W% , ~ W% ? 3 : La tilde REM (~) se imprime en hexadecimal 78 12
Las cadenas de texto se pueden PEEKed y POKEd de forma similar utilizando el signo de dólar ($). El final de la cadena está marcado con el carácter de retorno de carro (& 0D en ASCII ); cuando se vuelve a leer, este carácter de terminación no se devuelve. No se pueden utilizar compensaciones con el signo de dólar.
> DIM S% 20 : REM reserva 20 bytes de memoria señalados por S% > $ S% = "MINCE PIES" : Cadena de almacenamiento REM 'MINCE PIES', terminada por & 0D > PRINT $ ( S% + 6 ) : REM recupera la cadena, excluyendo el terminador & 0D, y comenzando en S% + 6 bytes PI ES
Versiones de 16 y 32 bits
Como la mayoría de las primeras computadoras hogareñas usan procesadores de 8 bits, los valores de PEEK o POKE están entre 0 y 255. Establecer o leer un valor de 16 bits en tales máquinas requiere dos comandos, como leer un entero de 16 bits en la dirección A, y seguido de y para almacenar un entero V de 16 bits en la dirección A.PEEK A+256*PEEK(A+1)
POKE A,V
POKE A+1,V/256
Algunos BASIC, incluso en máquinas de 8 bits, tienen comandos para leer y escribir valores de 16 bits desde la memoria. BASIC XL para la familia Atari de 8 bits utiliza un prefijo "D" (para "doble"): DPEEK
y DPOKE
el "Kleincomputer" de Alemania Oriental KC85 / 1 y KC87 los llama DEEK
y DOKE
. [5]
El Sinclair QL tiene PEEK_W
y POKE_W
para valores de 16 bits y PEEK_L
y POKE_L
para valores de 32 bits. ST BASIC para Atari ST usa los nombres tradicionales pero permite definir segmentos de memoria de 8/16/32 bits y direcciones que determinan el tamaño.
POKES como trampas
En el contexto de los juegos para muchas computadoras de 8 bits, los usuarios podían cargar juegos en la memoria y, antes de iniciarlos, modificar direcciones de memoria específicas para hacer trampas , obtener un número ilimitado de vidas, inmunidad, invisibilidad, etc. utilizando declaraciones POKE. El Commodore 64 , ZX Spectrum y Amstrad CPC también permitieron a los jugadores con los cartuchos relevantes o el complemento Multiface congelar el programa en ejecución, ingresar POKE y reanudar.
Por ejemplo, en Knight Lore para ZX Spectrum , la inmunidad se puede lograr con el siguiente comando:
POKE 47196 , 201
En este caso, el valor 201 corresponde a una instrucción RET , de modo que el juego regresa de una subrutina antes de activar la detección de colisión .
Revistas como Your Sinclair publicaron listas de dichos POKE para juegos. Dichos códigos generalmente se identificaron mediante ingeniería inversa del código de la máquina para ubicar la dirección de memoria que contiene el valor deseado que se relaciona con, por ejemplo, el número de vidas, detección de colisiones, etc.
Usar un truco 'POKE' es más difícil en los juegos modernos, ya que muchos incluyen medidas anti-trampas o de protección contra copias que inhiben la modificación del espacio de memoria del juego. Los sistemas operativos modernos imponen esquemas de protección de memoria virtual para denegar el acceso de programas externos a la memoria no compartida (por ejemplo, tablas de páginas separadas para cada aplicación, por lo tanto, espacios de memoria inaccesibles).
Uso genérico de POKE
"POKE" se usa a veces para referirse a cualquier manipulación directa de los contenidos de la memoria, en lugar de simplemente a través de BASIC, particularmente entre las personas que aprendieron a computar en microcomputadoras de 8 bits de finales de la década de 1970 y principios de la de 1980. BASIC era a menudo el único lenguaje disponible en esas máquinas (en las computadoras domésticas , generalmente presente en ROM ) y, por lo tanto, la forma obvia y más simple de programar en lenguaje de máquina era usar BASIC para introducir los valores del código de operación en la memoria. Hacer mucha codificación de bajo nivel como esta generalmente proviene de la falta de acceso a un ensamblador .
Un ejemplo del uso genérico de POKE y PEEK está en Visual Basic para Windows, donde DDE se puede lograr con la palabra clave LinkPoke .
Ver también
- Golpe asesino
- Programa de escritura
- Código auto modificable
- Puntero (programación de computadoras)
Referencias
- ^ "PEEK" . Asesor de Microsoft QuickBasic 4.5 . Microsoft. 1990. Archivado desde el original el 16 de mayo de 2011 . Consultado el 28 de diciembre de 2007 .
- ^ "POKE" . Asesor de Microsoft QuickBasic 4.5 . Microsoft. 1990. Archivado desde el original el 16 de mayo de 2011 . Consultado el 28 de diciembre de 2007 .
- ^ "¿Cuál es la referencia más antigua a PEEK, POKE y USR?" . Consultado el 15 de agosto de 2020 .
- ^ Altair 8800 BASIC Reference_Manual 1975 , página 68 del PDF
- ^ Kühnel, Claus (1987) [1986]. "4. Kleincomputer - Eigenschaften und Möglichkeiten" [4. Microordenador - Propiedades y posibilidades]. En Erlekampf, Rainer; Mönk, Hans-Joachim (eds.). Mikroelektronik in der Amateurpraxis [ Microelectrónica para el aficionado práctico ] (en alemán). 3 (1 ed.). Berlín: Militärverlag der Deutschen Demokratischen Republik , Leipzig. págs. 218, 232, 236. ISBN 3-327-00357-2. 7469332.