stringtranslate.com

ПОДСМОТРЕТЬ И ТАКНУТЬ

PEEK и POKE в строке 100 программы Commodore Basic на CBM 3016

В вычислительной технике PEEK и POKE — это команды, используемые в некоторых языках программирования высокого уровня для доступа к содержимому определенной ячейки памяти, на которую ссылается ее адрес памяти . PEEK получает байт, расположенный по указанному адресу памяти. [1] POKE устанавливает байт памяти по указанному адресу. [2] Эти команды возникли вместе с мониторами машинного кода , такими как монитор DECsystem-10 ; [3] эти команды особенно связаны с языком программирования BASIC , хотя некоторые другие языки, такие как Pascal и COMAL, также имеют эти команды. Эти команды по своей роли сопоставимы с указателями в языке C и некоторых других языках программирования.

Одно из самых ранних упоминаний этих команд в BASIC, если не самое раннее, находится в Altair BASIC . [4] Команды PEEK и POKE были задуманы в ранних персональных вычислительных системах для различных целей, особенно для изменения специальных аппаратных регистров, отображенных в памяти, для управления определенными функциями компьютера, такими как периферийные устройства ввода/вывода. В качестве альтернативы программисты могли использовать эти команды для копирования программного обеспечения или даже для обхода намерений определенной части программного обеспечения (например, манипулировать игровой программой, чтобы позволить пользователю мошенничать). Сегодня необычно управлять памятью компьютера на таком низком уровне с помощью языка высокого уровня, такого как BASIC. Таким образом, понятия команд PEEK и POKE обычно считаются устаревшими.

Термины «peek» и «poke» иногда используются в разговорной речи в компьютерном программировании для обозначения доступа к памяти в целом.

Синтаксис оператора

Функция PEEK и команды POKE обычно вызываются следующим образом, либо в прямом режиме (вводятся и выполняются в командной строке BASIC ), либо в косвенном режиме (как часть программы ):

целая_переменная = PEEK ( адрес )  POKE- адрес , значение  

Параметры адреса и значения могут содержать выражения , пока вычисленные выражения соответствуют допустимым адресам памяти или значениям соответственно. Допустимый адрес в этом контексте — это адрес в адресном пространстве компьютера , тогда как допустимое значение — это (обычно) беззнаковое значение между нулем и максимальным беззнаковым числом, которое может содержать минимальная адресуемая единица (ячейка памяти).

Ячейки памяти и аппаратные регистры

Адресные ячейки, которые POKE или PEEKed, могут относиться либо к обычным ячейкам памяти, либо к отображенным в памяти аппаратным регистрам устройств ввода- вывода или вспомогательных микросхем, таких как звуковые микросхемы и видеографические микросхемы, или даже к отображенным в памяти регистрам самого ЦП (что делает возможными программные реализации мощных мониторов машинного кода и инструментов отладки /симуляции). В качестве примера схемы управления поддерживающей микросхемой, управляемой POKE, следующая команда POKE направлена ​​на определенный регистр встроенной графической микросхемы VIC-II Commodore 64 , что сделает границу экрана черной:

ТОК 53280 , 0  

Похожий пример из 8-битных компьютеров Atari сообщает драйверу дисплея ANTIC о необходимости перевернуть весь текст вверх ногами:

ТОК 755 , 4  

Разница между машинами, а также важность и полезность жестко зашитых ячеек памяти означали, что «карты памяти» различных машин были важными документами. Примером является Mapping the Atari , который начинается с нулевой ячейки и отображает всю память Atari 8-битных систем размером 64 КБ, ячейка за ячейкой.

PEEK и POKE в других BASIC

North Star Computers , поставщик с начала 1980-х годов, предложил свой собственный диалект BASIC с их операционной системой NSDOS . Обеспокоенные возможными юридическими проблемами, они переименовали команды EXAMи FILL. [ необходима цитата ] Были также диалекты BASIC, которые использовали зарезервированные слова MEMRи MEMWвместо этого.

BBC BASIC , используемый на BBC Micro и других компьютерах Acorn Computers , не содержал ключевых слов PEEK и POKE , но использовал символ вопросительного знака (?), известный как запрос в BBC BASIC, для обеих операций, как функции и команды. Например:

> DIM W% 4 : REM зарезервировать 4 байта памяти, на которые указывает целочисленная переменная W% > ? W% = 42 : REM сохранить константу 42; эквивалент 'POKE W%, 42' > PRINT ? W% : REM распечатать байт, на который указывает W%; эквивалент 'PRINT PEEK(W%)' 42               

32-битные значения можно было бы POKE и PEEK с помощью символа восклицательного знака (!), известного как pling , с наименее значимым байтом первым ( little-endian ). Кроме того, адрес можно было бы сместить, указав query или pling после адреса и за ним смещение:

> ! W% = &12345678 : REM амперсанд (&) указывает шестнадцатеричное число > PRINT ~ ? W% , ~ W% ? 3 : REM тильда (~) печатает в шестнадцатеричном формате 78 12            

Строки текста можно PEEKed и POKEd аналогичным образом, используя знак доллара ($). Конец строки помечается символом возврата каретки (&0D в ASCII ); при обратном чтении этот завершающий символ не возвращается. Смещения не могут использоваться со знаком доллара.

> DIM S% 20 : REM зарезервировать 20 байт памяти, на которую указывает S% > $ S% = "MINCE PIES" : REM сохранить строку 'MINCE PIES', завершенную &0D > PRINT $( S% + 6 ) : REM извлечь строку, исключая терминатор &0D и начиная с S% + 6 байт PI ES                

16 и 32-битные версии

Поскольку большинство ранних домашних компьютеров использовали 8-битные процессоры, значения PEEK или POKE находятся в диапазоне от 0 до 255. Установка или чтение 16-битного значения на таких машинах требует двух команд, например, чтения 16-битного целого числа по адресу A, а затем сохранения 16-битного целого числа V по адресу A.PEEK(A)+256*PEEK(A+1)POKE A,VPOKE A+1,V/256

Некоторые BASIC, даже на 8-битных машинах, имеют команды для чтения и записи 16-битных значений из памяти. BASIC XL для 8-битных компьютеров Atari использует префикс "D" (для "double"): DPEEKи DPOKE. Восточногерманские "Kleincomputer" KC85/1 и KC87 называют их DEEKи DOKE. [5]

Sinclair QL имеет PEEK_Wи POKE_Wдля 16-битных значений и PEEK_Lи POKE_Lдля 32-битных значений. ST BASIC для Atari ST использует традиционные имена, но позволяет определять 8/16/32-битные сегменты памяти и адреса, которые определяют размер.

Утилита командной строки Linux peekpoke [6] была разработана в основном для одноплатных компьютеров на базе ARM. peekpoke— это инструмент командной строки Linux для чтения и записи в системную память. Ее основное применение — взаимодействие с периферийными устройствами из пользовательского пространства: чтение или манипулирование состоянием, а также сброс регистров.

POKE как читы

В контексте игр для многих 8-битных компьютеров пользователи могли загружать игры в память и, перед их запуском, изменять определенные адреса памяти, чтобы обмануть , получив неограниченное количество жизней, иммунитет, невидимость и т. д. Такие изменения выполнялись с помощью операторов POKE. Commodore 64 , ZX Spectrum и Amstrad CPC также позволяли игрокам с одним из соответствующих картриджей (таких как Action Replay или Multiface ) замораживать запущенную программу, вводить POKE и возобновлять игру.

Например, в Knight Lore для ZX Spectrum иммунитет можно получить с помощью следующей команды: [7]

ТОК 47196 , 201 

В этом случае значение 201 соответствует инструкции RET [8] , так что игра возвращается из подпрограммы раньше, чем срабатывает обнаружение столкновений .

Журналы, такие как Your Sinclair, публиковали списки таких POKE для игр. Такие коды обычно идентифицировались путем обратного проектирования машинного кода для нахождения адреса памяти, содержащего желаемое значение, которое относилось, например, к количеству жизней, обнаружению столкновений и т. д. [9]

Использование чит-кода 'POKE' в современных играх сложнее, так как многие из них включают в себя меры защиты от читов или копирования, которые запрещают модификацию пространства памяти игры. Современные операционные системы применяют схемы защиты виртуальной памяти , чтобы запретить внешним программам доступ к неразделяемой памяти (например, отдельные таблицы страниц для каждого приложения, следовательно, недоступные пространства памяти).

Общее использование POKE

«POKE» иногда используется для обозначения любой прямой манипуляции содержимым памяти, а не только через BASIC, особенно среди людей, которые учились вычислительной технике на 8-битных микрокомпьютерах конца 1970-х и начала 1980-х годов. BASIC часто был единственным языком, доступным на этих машинах (на домашних компьютерах , обычно присутствующим в ПЗУ ), и поэтому очевидным и самым простым способом программирования на машинном языке было использование BASIC для POKE значений кодов операций в память. Выполнение такого низкоуровневого кодирования обычно происходило из-за отсутствия доступа к ассемблеру .

Примером общего использования POKE и PEEK является Visual Basic для Windows , где DDE может быть реализовано с помощью ключевого слова LinkPoke .

Смотрите также

Ссылки

  1. ^ "PEEK". Microsoft QuickBasic 4.5 Advisor . Microsoft. 1990. Архивировано из оригинала 2011-05-16 . Получено 2007-12-28 .
  2. ^ "POKE". Microsoft QuickBasic 4.5 Advisor . Microsoft. 1990. Архивировано из оригинала 2011-05-16 . Получено 2007-12-28 .
  3. ^ «Какое самое старое упоминание PEEK, POKE и USR?». Архивировано из оригинала 14 августа 2020 г. . Получено 15 августа 2020 г. .
  4. ^ Altair 8800 BASIC Reference_Manual 1975, стр. 68 PDF
  5. ^ Кюнель, Клаус (1987) [1986]. «4. Кляйнкомпьютер — Eigenschaften und Möglichkeiten» [4. Микрокомпьютер - Свойства и возможности. В Эрлекампфе, Райнер; Монк, Ханс-Иоахим (ред.). Mikroelektronik in der любительской практики [ Микроэлектроника для практического любителя ] (на немецком языке). Том. 3 (1-е изд.). Берлин: Militärverlag der Deutschen Demokratischen Republik  [de] , Лейпциг. стр. 218, 232, 236. ISBN. 3-327-00357-2. 7469332.
  6. ^ пикпок https://github.com/apritzel/peekpoke
  7. ^ Стивен Гудвин (2023). 20 Перейти к 10: 10101001 факты о ретро-компьютерах . ISBN 978-1800182745.
  8. ^ Стивен Викерс; Робин Брэдбир (1982). Программирование Sinclair ZX Spectrum BASIC. стр. 197.
  9. ^ См., например, «Pokerama». Ваш Синклер . № 66. Июнь 1991 г.{{cite magazine}}: CS1 maint: год ( ссылка )