stringtranslate.com

Mirar y tocar

PEEK y POKE en la línea 100 de un programa Commodore Basic en un CBM 3016

En informática , PEEK y POKE son comandos utilizados 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 COMAL tambié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 antigua, se encuentra en Altair BASIC . [4] Los comandos PEEK y POKE fueron concebidos en los primeros sistemas informáticos personales para servir a una variedad de propósitos, especialmente para modificar registros de hardware especiales mapeados en memoria para controlar funciones particulares de la computadora, como los periféricos de entrada/salida. Alternativamente, los programadores podrían usar estos comandos para copiar software o incluso para eludir la intención de una pieza particular de software (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 utilizando un lenguaje de alto nivel como BASIC. Como tal, las nociones de los comandos PEEK y POKE generalmente se consideran anticuadas.

Los términos peek y poke se utilizan a veces de forma coloquial en la programación informática para referirse al acceso a la memoria en general.

Sintaxis de la declaración

La función PEEK y los comandos POKE generalmente se invocan de la siguiente manera, ya sea en modo directo (ingresados ​​y ejecutados en el indicador BASIC ) o en modo indirecto (como parte de un programa ):

variable_entero = PEEK ( dirección )  Dirección POKE , valor  

Los parámetros de dirección y valor pueden contener expresiones , siempre que las expresiones evaluadas correspondan a direcciones de memoria válidas o valores, 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 (normalmente) un valor sin signo entre cero y el número máximo sin signo que la unidad mínima direccionable (celda de memoria) puede contener.

Celdas de memoria y registros de hardware

Las direcciones que se controlan con POKE o PEEK pueden referirse a celdas de memoria ordinarias o a registros de hardware asignados a la 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 asignados a la memoria de la propia CPU (lo que hace posible la implementación de software de potentes monitores de código de máquina y herramientas de depuración /simulación). Como ejemplo de un esquema de control de chip de soporte controlado por POKE, el siguiente comando POKE está dirigido a un registro específico del chip gráfico VIC-II integrado del Commodore 64 , lo que hará que el borde de la pantalla se vuelva negro:

POKE53280 , 0  

Un ejemplo similar de las computadoras 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 hicieron que los "mapas de memoria" de las distintas máquinas fueran documentos importantes. Un ejemplo es Mapping the Atari , que comienza en la ubicación cero y mapea la memoria completa de 64 kB de los sistemas Atari de 8 bits ubicación por ubicación.

PEEK y POKE en otros BASIC

North Star Computers , un proveedor de principios de los años 1980, ofreció su propio dialecto de BASIC con su sistema operativo NSDOS . Preocupados por posibles problemas legales, cambiaron el nombre de los comandos EXAMy FILL. [ cita requerida ] También hubo dialectos de BASIC que usaban las palabras reservadas MEMRy MEMWen su lugar.

El sistema BBC BASIC , utilizado en BBC Micro y otras máquinas Acorn Computers , no incluía las palabras clave PEEK y POKE , sino que utilizaba el símbolo de interrogación (?), conocido como consulta en BBC BASIC, para ambas operaciones, como función y como comando. Por ejemplo:

> DIM W% 4 : REM reserva 4 bytes de memoria, a los que apunta la variable entera W% > ? W% = 42 : REM almacena la constante 42; equivalente a 'POKE W%, 42' > PRINT ? W% : REM imprime el byte al que apunta W%; equivalente a 'PRINT PEEK(W%)' 42               

Los valores de 32 bits se pueden modificar mediante POKE y PEEK utilizando el símbolo de exclamación (!), conocido como pling , con el byte menos significativo primero ( little-endian ). Además, la dirección se puede desplazar especificando query o pling después de la dirección y siguiendo con el desplazamiento:

> ! W% = &12345678 : el ampersand (&) de REM especifica el formato hexadecimal > PRINT ~ ? W% , ~ W% ? 3 : la tilde (~) de REM imprime en formato hexadecimal 78 12            

Las cadenas de texto se pueden analizar mediante PEEK y POKE de forma similar utilizando el signo de dólar ($). El final de la cadena se marca 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 desplazamientos con el signo de dólar.

> DIM S% 20 : REM reserva 20 bytes de memoria apuntados por S% > $ S% = "MINCE PIES" : REM almacena la cadena 'MINCE PIES', terminada en &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 usaban procesadores de 8 bits, los valores PEEK o POKE están entre 0 y 255. Establecer o leer un valor de 16 bits en dichas máquinas requiere dos comandos, por ejemplo, para leer un entero de 16 bits en la dirección A, y seguido de almacenar un entero de 16 bits V en la dirección A.PEEK(A)+256*PEEK(A+1)POKE A,VPOKE 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 las computadoras Atari de 8 bits usa un prefijo "D" (de "doble"): DPEEKy DPOKE. Los "Kleincomputer" de Alemania del Este KC85/1 y KC87 los llaman DEEKy DOKE. [5]

El Sinclair QL tiene PEEK_Wy POKE_Wpara valores de 16 bits y PEEK_Ly POKE_Lpara valores de 32 bits. ST BASIC para Atari ST utiliza los nombres tradicionales pero permite definir segmentos de memoria de 8/16/32 bits y direcciones que determinan el tamaño.

Se ha desarrollado una utilidad de línea de comandos de Linux peekpoke [6]peekpoke principalmente para computadoras de placa única basadas en ARM. es una herramienta de línea de comandos de Linux para leer y escribir en la memoria del sistema. Su uso principal es comunicarse con los periféricos de hardware desde el espacio de usuario: para leer o manipular el estado y para volcar registros.

POKEs como trampas

En el contexto de los juegos para muchos ordenadores 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 , consiguiendo un número ilimitado de vidas, inmunidad, invisibilidad, etc. Dichas modificaciones se realizaban mediante sentencias POKE. El Commodore 64 , el ZX Spectrum y el Amstrad CPC también permitían a los jugadores con uno de los cartuchos pertinentes (como Action Replay o Multiface ) congelar el programa en ejecución, introducir POKEs y reanudar.

Por ejemplo, en Knight Lore para ZX Spectrum , la inmunidad se puede lograr con el siguiente comando: [7]

POKE47196 , 201 

En este caso, el valor 201 corresponde a una instrucción RET , [8] para que el juego regrese de una subrutina antes de activar la detección de colisión .

Revistas como Your Sinclair publicaban listas de dichos POKEs para juegos. Estos códigos se identificaban generalmente mediante ingeniería inversa del código de la máquina para localizar la dirección de memoria que contenía el valor deseado relacionado, por ejemplo, con el número de vidas, la detección de colisiones, etc. [9]

El uso de un truco "POKE" es más difícil en los juegos modernos, ya que muchos incluyen medidas antitrampas o de protección contra copias que inhiben la modificación del espacio de memoria del juego. Los sistemas operativos modernos aplican 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 independientes para cada aplicación, lo que hace que los espacios de memoria sean inaccesibles).

Uso genérico de POKE

"POKE" se utiliza a veces para referirse a cualquier manipulación directa de los contenidos de la memoria, en lugar de sólo a través de BASIC, particularmente entre las personas que aprendieron informática en los microordenadores de 8 bits de finales de los años 1970 y principios de los años 1980. BASIC era a menudo el único lenguaje disponible en esas máquinas (en los ordenadores domésticos , normalmente presente en la ROM ), y por tanto la forma obvia y más sencilla de programar en lenguaje de máquina era utilizar BASIC para introducir los valores del código de operación en la memoria mediante POKE. Hacer mucha codificación de bajo nivel como esta normalmente se debía a la falta de acceso a un ensamblador .

Un ejemplo del uso genérico de POKE y PEEK se encuentra en Visual Basic para Windows , donde DDE se puede lograr con la palabra clave LinkPoke .

Véase también

Referencias

  1. ^ "PEEK". Microsoft QuickBasic 4.5 Advisor . Microsoft. 1990. Archivado desde el original el 16 de mayo de 2011. Consultado el 28 de diciembre de 2007 .
  2. ^ "POKE". Microsoft QuickBasic 4.5 Advisor . Microsoft. 1990. Archivado desde el original el 16 de mayo de 2011. Consultado el 28 de diciembre de 2007 .
  3. ^ "¿Cuál es la referencia más antigua a PEEK, POKE y USR?". Archivado desde el original el 14 de agosto de 2020. Consultado el 15 de agosto de 2020 .
  4. ^ Altair 8800 BASIC Reference_Manual 1975, página 68 del PDF
  5. ^ Kühnel, Claus (1987) [1986]. "4. Kleincomputer - Eigenschaften und Möglichkeiten" [4. Microcomputadora - 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). vol. 3 (1 ed.). Berlín: Militärverlag der Deutschen Demokratischen Republik  [de] , Leipzig. págs.218, 232, 236. ISBN 3-327-00357-2.7469332.
  6. ^ peekpoke https://github.com/apritzel/peekpoke
  7. ^ Steven Goodwin (2023). 20 Ir a 10: 10101001 Datos sobre las computadoras retro . ISBN 978-1800182745.
  8. ^ Steven Vickers; Robin Bradbeer (1982). Programación BASIC en Sinclair ZX Spectrum. pág. 197.
  9. ^ Véase, por ejemplo, "Pokerama". Your Sinclair . No. 66. Junio ​​de 1991.{{cite magazine}}: Mantenimiento CS1: año ( enlace )