PEEK и POKE - PEEK and POKE

PEEK и POKE в строке 100 a Коммодор Базовый программа на CBM 3016

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

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

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

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

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

integer_variable=PEEK(адрес)POKEадрес,ценить

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

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

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

POKE53280,0

Похожий пример из Семейство 8-битных Atari говорит АНТИК драйвер дисплея, чтобы перевернуть весь текст вверх ногами:

POKE755,4

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

PEEK и POKE на других БЕЙСИКЕ

Компьютеры North Star, производитель с начала 1980-х, предложил свой собственный диалект BASIC с их NSDOS Операционная система. Обеспокоенные возможными юридическими проблемами, они переименовали команды ЭКЗАМЕН и НАПОЛНЯТЬ.[нужна цитата ] Были также BASIC диалекты, в которых вместо них использовались зарезервированные слова MEMW и MEMR.

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

>ТусклыйВт%4:REM зарезервировать 4 байта памяти, на которые указывает целочисленная переменная W%>?Вт%=42:REM константа хранения 42; эквивалент 'POKE W%, 42'>РАСПЕЧАТАТЬ?Вт%:REM вывести байт, на который указывает W%; эквивалент «ПЕЧАТЬ PEEK (W%)»42

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

>!Вт%=&12345678:REM амперсанд (&) задает шестнадцатеричный>РАСПЕЧАТАТЬ~?Вт%,~Вт%?3:REM тильда (~) печатает в шестнадцатеричном формате7812

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

>ТусклыйS%20:REM зарезервировать 20 байт памяти, на которые указывает S%>$S%="ПИРОГИ":REM сохранить строку "MINCE PIES", завершающуюся & 0D>РАСПЕЧАТАТЬ$(S%+6):REM получить строку, завершающуюся & 0D, начатую с S% + 6 байтовЧИСЛО ПИES

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

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

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

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

POKE как читы

В контексте игр для многих 8-битных компьютеров пользователи могут загружать игры в память и перед их запуском изменять определенные адреса памяти, чтобы изменять, получение неограниченного количества жизней, иммунитета, невидимости и т. д. Такие модификации производились с помощью операторов POKE. В Коммодор 64, ZX Spectrum и Амстрад КТК также разрешено игрокам с соответствующими патронами или Многогранность надстройка, чтобы заморозить работающую программу, ввести POKE и продолжить.

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

POKE47196,201

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

Журналы, такие как Ваш Синклер опубликовал списки таких POKE для игр. Такие коды обычно идентифицируются путем обратного проектирования машинного кода, чтобы найти адрес памяти, содержащий желаемое значение, связанное, например, с числом жизней, обнаружением коллизий и т. Д.

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

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

"POKE" иногда используется для обозначения любых прямых манипуляций с содержимым памяти, а не только через BASIC, особенно среди людей, которые учились вычислениям на 8 бит микрокомпьютеры конца 1970-х - начала 1980-х гг. BASIC часто был единственным языком, доступным на этих машинах (на домашние компьютеры, обычно присутствует в ПЗУ ) и, следовательно, очевидный и самый простой способ программирования на машинный язык было использовать БЕЙСИК, чтобы УЗНАТЬ код операции ценности в память. Подобное кодирование на низком уровне обычно происходило из-за отсутствия доступа к ассемблер.

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

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

Рекомендации

  1. ^ «ПЭЭК». Советник Microsoft QuickBasic 4.5. Microsoft. 1990. Архивировано с оригинал на 2011-05-16. Получено 2007-12-28.
  2. ^ "ТОЧИТЬ". Советник Microsoft QuickBasic 4.5. Microsoft. 1990. Архивировано с оригинал на 2011-05-16. Получено 2007-12-28.
  3. ^ "Какая самая старая ссылка на PEEK, POKE и USR?". Получено 15 августа 2020.
  4. ^ Altair 8800 BASIC Reference_Manual 1975 г., Страница 68 из PDF
  5. ^ Кюнель, Клаус (1987) [1986]. «4. Kleincomputer - Eigenschaften und Möglichkeiten» [4. Микрокомпьютер - Свойства и возможности. В Эрлекампфе, Райнер; Mönk, Hans-Joachim (ред.). Микроэлектроник в любительской практике [Микроэлектроника для практического любителя] (на немецком). 3 (1-е изд.). Берлин: Militärverlag der Deutschen Demokratischen Republik [де ], Лейпциг. С. 218, 232, 236. ISBN  3-327-00357-2. 7469332.