
コンピューティングにおいて、PEEK と POKE は、一部の高級プログラミング言語で使用されるコマンドで、メモリ アドレスで参照される特定のメモリセルの内容にアクセスするために使われます。PEEK は、指定されたメモリ アドレスにあるバイトを取得します。[ 1 ] POKE は、指定されたアドレスにあるメモリ バイトを設定します。[ 2 ]これらのコマンドは、DECsystem-10モニタなどのマシン コード モニタに由来します。 [ 3 ] これらのコマンドは特にBASICプログラミング言語に関連付けられていますが、 PascalやCOMALなどの他の言語にもこれらのコマンドがあります。これらのコマンドは、C 言語や他のプログラミング言語のポインタと役割が似ています。
BASIC におけるこれらのコマンドへの最も初期の言及の 1 つはAltair BASICにあります。[ 4 ] PEEK コマンドと POKE コマンドは、特に入出力周辺機器などのコンピュータの特定の機能を制御するために、メモリ マップされた特別なハードウェア レジスタを変更するなど、さまざまな目的のために初期のパーソナル コンピューティング システムで考案されました。あるいは、プログラマはこれらのコマンドを使用してソフトウェアをコピーしたり、特定のソフトウェアの意図を回避したりすることさえありました (たとえば、ゲーム プログラムを操作することでユーザーが不正行為をできるようにしました)。今日では、BASIC のような高水準言語を使用して、このような低レベルでコンピュータ メモリを制御することはまれです。そのため、PEEK コマンドとPOKEコマンドの概念は一般的に時代遅れと見なされています。
コンピュータプログラミングにおいて、 「peek」や「poke」といった用語は、一般的にメモリへのアクセスを指す口語表現として用いられることがある。
PEEK関数とPOKEコマンドは通常、直接モード(BASICプロンプトで入力および実行)または間接モード(プログラムの一部として)のいずれかで呼び出されます。
integer_variable = PEEK ( address )POKEアドレス、値アドレスおよび値のパラメータには式を含めることができますが、評価された式はそれぞれ有効なメモリ アドレスまたは値に対応している必要があります。この文脈における有効なアドレスとは、コンピュータのアドレス空間内のアドレスを指し、有効な値とは(通常)0から最小アドレス指定可能単位(メモリセル)が保持できる最大符号なし数値までの間の符号なし値を指します。
POKEまたはPEEKの対象となるアドレス位置は、通常のメモリセル、I/Oユニットやサウンドチップ、ビデオグラフィックスチップなどのサポートチップのメモリマップドハードウェアレジスタ、あるいはCPU自体のメモリマップドレジスタ(これにより、強力なマシンコードモニタやデバッグ/シミュレーションツールのソフトウェア実装が可能になる)のいずれかを指す場合があります。POKE駆動のサポートチップ制御方式の例として、次のPOKEコマンドはCommodore 64の内蔵VIC-IIグラフィックスチップの特定のレジスタを対象としており、画面の境界線を黒くします。
POKE 53280、0Atari 8ビットコンピュータの同様の例として、ANTICディスプレイドライバにすべてのテキストを上下逆さまにするように指示するものがあります。
ポーク755、4マシン間の違い、そしてハードワイヤードされたメモリ位置の重要性と有用性から、様々なマシンの「メモリマップ」は重要な資料となった。例えば、『Mapping the Atari』は、アドレス空間のゼロ位置から始まり、64kBのアドレス空間全体を位置ごとにマッピングしている。
1980年代初頭のベンダーであるノーススター・コンピュータは、NSDOSオペレーティングシステムとともに独自のBASIC方言を提供していました。法的な問題が発生する可能性を懸念し、コマンド名を と に変更しましたEXAM。FILLまた、予約語 と を使用するBASIC方言もありました。MEMRMEMW
BBC Microやその他のAcorn Computers製マシンで使用されていたBBC BASICには、キーワードPEEKとPOKEは存在せず、代わりにBBC BASICではクエリとして知られる疑問符記号(?)が、関数およびコマンドとして両方の操作に使用されていました。例:
> DIM W% 4 : REM整数変数 W% が指す 4 バイトのメモリを予約します> ? W% = 42 : REM定数 42 を格納します。'POKE W%, 42' と同等です> PRINT ? W% : REM W% が指すバイトを表示します。'PRINT PEEK(W%)' と同等です4232ビット値は、感嘆符記号(!)を使用してPOKEおよびPEEKすることができ、これはplingと呼ばれ、最下位バイトが最初に表示されます(リトルエンディアン)。さらに、アドレスの後にqueryまたはplingを指定し、その後にオフセットを指定することで、アドレスをオフセットすることもできます。
> ! W% = &12345678 : REMアンパサンド (&) は 16 進数を指定します> PRINT ~ ? W% , ~ W% ? 3 : REMチルダ (~) は 16 進数で出力します78 12ドル記号($)を使用することで、テキスト文字列をPEEKおよびPOKEすることができます。文字列の末尾はキャリッジリターン文字(ASCIIでは& 0D )で示されますが、読み戻した際にこの終端文字は返されません。ドル記号にはオフセットは使用できません。
> DIM S% 20 : REM S% が指すメモリ領域 20 バイトを予約します> $ S% = "MINCE PIES" : REM文字列 'MINCE PIES' を &0D で終端して格納します> PRINT $( S% + 6 ) : REM文字列を取得します。終端文字 &0D は除外し、S% + 6 バイト目から開始しますPI ES初期の家庭用コンピュータのほとんどは8ビットプロセッサを使用していたため、PEEKまたはPOKEの値は0から255の間になります。このようなマシンで16ビット値を設定または読み取るには、アドレスAにあるリトルエンディアンの16ビット整数を読み込むコマンドと、アドレスAに16ビット整数Vを格納するコマンドなど、2つのコマンドが必要です。PEEK(A)+256*PEEK(A+1)POKEA,VPOKEA+1,V/256
8ビットマシンであっても、一部のBASICにはメモリから16ビット値を読み書きするためのコマンドがあります。Atari 8ビットコンピュータ用のBASIC XLは、「D」(「double」の略)接頭辞を使用します。と。東ドイツの「Kleincomputer」KC85/1およびKC87では、これらをと と呼びます。[ 5 ]DPEEKDPOKEDEEKDOKE
Sinclair QL は16 ビット値用に と 、32PEEK_Wビット値用にと を備えています。Atari ST 用のST BASIC は従来どおりの名称を使用していますが、8/16/32 ビットのメモリ セグメントとサイズを決定するアドレスを定義できます。POKE_WPEEK_LPOKE_L
Linux コマンドラインpeekpoke[ 6 ]ユーティリティは、主に ARM ベースのシングルボードコンピュータ向けに開発されました。peekpokeは、システムメモリへの読み書きを行う Linux コマンドラインツールです。主な用途は、ユーザーランドからハードウェア周辺機器と通信し、状態を読み取ったり操作したり、レジスタをダンプすることです。
多くの8ビットコンピュータのゲームでは、ユーザーはゲームをメモリにロードし、起動前に特定のメモリ アドレスを変更することで、チート行為を行うことができました。これにより、ライフの無制限化、無敵状態、透明化などが可能になりました。このような変更は、POKE ステートメントを使用して行われました。Commodore 64、ZX Spectrum、Amstrad CPCでは、関連するカートリッジ ( Action Replayや Multifaceなど) を使用するプレイヤーは、実行中のプログラムを一時停止し、POKE を入力して再開することもできました。ただし、通常は、POKE は BASIC ローダーとともに入力され、ローダーを実行するとゲームがロードされ、ロード中に POKE が挿入されました。これらの POKES は、当時のコンピュータ雑誌のヒントやチートに関する記事でよく紹介されていました。
例えば、ZX SpectrumのKnight Loreでは、次のコマンドで無敵状態を実現できます。[ 7 ]
POKE 47196、201この場合、値201はRET命令[ 8 ]に対応しており、衝突検出をトリガーする前にゲームがサブルーチンから早期に復帰します。
Your Sinclairなどの雑誌は、ゲーム用のPOKEのリストを掲載した。このようなコードは、一般的にマシンコードをリバースエンジニアリングして、例えばライフの数、衝突の検出などに関連する目的の値を含むメモリ アドレスを特定することによって識別された。[ 9 ]
現代のゲームでは、「POKE」チートを使うのはより困難です。多くのゲームには、ゲームのメモリ空間の変更を阻害するアンチチート機能やコピープロテクション機能が組み込まれているからです。最新のオペレーティングシステムは、仮想メモリ保護スキームを適用して、外部プログラムが非共有メモリにアクセスできないようにしています(例えば、アプリケーションごとに個別のページテーブルを使用することで、アクセス不可能なメモリ空間を作り出しています)。
「POKE」は、BASICだけでなく、メモリの内容を直接操作すること全般を指す場合があり、特に1970年代後半から1980年代前半の8ビットマイクロコンピュータでコンピュータを学んだ人々の間でよく使われます。BASICは、これらのマシン(家庭用コンピュータでは通常ROMに格納されている)で利用できる唯一の言語であることが多く、そのため、機械語でプログラミングする最も明白で簡単な方法は、 BASICを使用してオペコードの値をメモリにPOKEすることでした。このような低レベルのコーディングを多く行うようになったのは、通常、アセンブラにアクセスできなかったためです。
POKEとPEEKの一般的な使用例としては、Visual Basic for Windowsがあり、LinkPokeキーワードを使用してDDEを実現できます。