PEEK ve POKE - PEEK and POKE

Bir CBM 3016'da bir Commodore Basic programının 100. satırında PEEK ve POKE

Gelen bilgi işlem , PEEK ve POKE bazılarında kullanılan komutlar üst düzey programlama dilleri onun tarafından başvurulan belirli bir hafıza hücresinin içeriğini erişmek için hafıza adresi . PEEK, belirtilen bellek adresinde bulunan baytı alır. POKE, belirtilen adreste bellek baytını ayarlar. Bu komutlar , DECsystem-10 monitörü gibi makine kodu izleyicilerinden kaynaklanır ; bu komutlar özellikle BASIC programlama dili ile ilişkilidir , ancak Pascal ve COMAL gibi diğer bazı dillerde de bu komutlar bulunur. Bu komutlar için rollerinden karşılaştırılabilir işaretçiler de C dilinde ve bazı diğer programlama dilleri.

BASIC'te bu komutlara yapılan en eski referanslardan biri, en eskisi değilse bile Altair BASIC'dedir . PEEK ve POKE komutları, özellikle giriş/çıkış çevre birimleri gibi bilgisayarın belirli işlevlerini kontrol etmek için özel bellek eşlemeli donanım kayıtlarını değiştirmek için çeşitli amaçlara hizmet etmek için erken kişisel bilgisayar sistemlerinde tasarlandı . Alternatif olarak, programcılar bu komutları yazılımı kopyalamak veya hatta belirli bir yazılım parçasının amacını atlatmak için kullanabilirler (örneğin, bir oyun programını kullanıcının hile yapmasına izin verecek şekilde manipüle etmek). Bugün, BASIC gibi yüksek seviyeli bir dil kullanarak bilgisayar belleğini bu kadar düşük seviyede kontrol etmek alışılmadık bir durum. Bu nedenle PEEK ve POKE komutları kavramları genellikle eskimiş olarak görülür.

Peek ve poke terimleri bazen genel olarak bellek erişimini ifade etmek için bilgisayar programcılığında halk dilinde kullanılır.

deyim sözdizimi

PEEK işlevi ve POKE komutları, doğrudan modda (BASIC komut isteminde girilir ve yürütülür ) veya dolaylı modda (bir programın parçası olarak) genellikle aşağıdaki şekilde çağrılır :

integer_variable = PEEK(address)

POKE address, value

Adres ve değer parametreleri karmaşık içerebilir ifadeler değerlendirildiğinde ifadeleri geçerli bellek adresleri veya değerlere karşılık olarak sırasıyla sürece,. Geçerli bir adres bu bağlamda bilgisayarın içinde bir adres adres alanı geçerli iken, değer , sıfır ve minimum adreslenebilir birimi (hafıza hücresi) sahip olabilir maksimum işaretsiz sayısı arasında işaretsiz değer (genellikle) 'dir.

Bellek hücreleri ve donanım kayıtları

Sokmak veya Gözetledin altındadır adres konumları sıradan bellek hücrelerine ya da her iki sevk edebilir bellek eşlemeli donanım kayıt arasında I / O gibi birim veya destek fiş ses cips ya da bellek eşlemeli ve video grafik yongaları kayıtları CPU'nun kendisi (güçlü makine kodu monitörlerinin ve hata ayıklama /simülasyon araçlarının yazılım uygulamalarını mümkün kılar). POKE güdümlü destek yongası kontrol şemasına bir örnek olarak, aşağıdaki POKE komutu Commodore 64'ün yerleşik VIC-II grafik yongasının belirli bir kaydına yönlendirilir ve ekran kenarlığını karartacaktır:

POKE 53280, 0

Atari 8-bit ailesinden benzer bir örnek , ANTIC görüntü sürücüsüne tüm metni ters çevirmesini söyler :

POKE 755, 4

Makineler arasındaki fark ve kablolu bellek konumlarının önemi ve faydası, çeşitli makinelerin "hafıza haritalarının" önemli belgeler olduğu anlamına geliyordu. Bir örneği Atari Haritalama yerde sıfır başlar ve konuma göre Atari 8-bit sistemler konumu tüm 64 kB bellek eşlenen.

Diğer BASIC'lerde PEEK ve POKE

1980'lerin başlarından itibaren bir satıcı olan North Star Computers , NSDOS işletim sistemiyle kendi BASIC lehçesini sundu . Olası yasal sorunlar hakkında endişe duydukları için komutları yeniden adlandırdılar EXAMve FILL. Bunun yerine MEMW ve MEMR ayrılmış sözcüklerini kullanan BASIC lehçeleri de vardı.

BBC Micro ve diğer Acorn Computers makinelerinde kullanılan BBC BASIC , PEEK ve POKE anahtar sözcüklerini içermiyordu, ancak BBC BASIC'te sorgu olarak bilinen soru işareti simgesini (?) bir işlev ve komut olarak her iki işlem için de kullandı. Örneğin:

> DIM W% 4  : REM reserve 4 bytes of memory, pointed to by integer variable W%
> ?W% = 42  : REM store constant 42; equivalent of 'POKE W%, 42'
> PRINT ?W% : REM print the byte pointed to by W%; equivalent of 'PRINT PEEK(W%)'
        42

32 bitlik değerleri kullanılarak dürttü ve Gözetledin olabilir ünlem işareti sembolü (!) Olarak bilinen PLING ilk azından önemli bayt ( küçük endian ). Ek olarak, adresten sonra sorgu veya pling belirtilerek ve ofset ile takip edilerek adres ofset yapılabilir:

> !W% = &12345678   : REM ampersand (&) specifies hexadecimal
> PRINT ~?W%, ~W%?3 : REM tilde (~) prints in hexadecimal
        78        12

Metin dizeleri, Dolar işareti ($) kullanılarak benzer şekilde PEEK'lenebilir ve POKE'lenebilir . Dizenin sonu, Satır dönüş karakteriyle işaretlenir ( ASCII'de &0D ); geri okunduğunda, bu sonlandırma karakteri döndürülmez. Dolar işaretiyle ofsetler kullanılamaz.

> DIM S% 20          : REM reserve 20 bytes of memory pointed to by S%
> $S% = "MINCE PIES" : REM store string 'MINCE PIES', terminated by &0D
> PRINT $(S% + 6)    : REM retrieve string, excluding &0D terminator, and starting at S% + 6 bytes
PIES

16 ve 32 bit sürümleri

Erken dönem ev bilgisayarlarının çoğu 8 bitlik işlemciler kullandığından, PEEK veya POKE değerleri 0 ile 255 arasındadır. Bu tür makinelerde 16 bitlik bir değerin ayarlanması veya okunması, A adresinde 16 bitlik bir tamsayı okumak ve ardından ve 16 bitlik bir V tamsayısını A adresinde saklamak için. {{{1}}}POKE A,VPOKE A+1,V/256

Bazı BASIC'ler, 8 bitlik makinelerde bile, bellekten 16 bitlik değerleri okumak ve yazmak için komutlara sahiptir. Atari 8-bit ailesi için BASIC XL bir "D" ("çift" için) öneki kullanır: ve Doğu-Alman "Kleincomputer" KC85/1 ve KC87 bunları ve olarak adlandırır . DPEEKDPOKEDEEKDOKE

Sinclair QL sahiptir PEEK_Wve POKE_W16 bit değerler için PEEK_Lve POKE_L32-bit değerleri için. Atari ST için ST BASIC , geleneksel adları kullanır ancak boyutu belirleyen 8/16/32 bit bellek bölümlerinin ve adreslerinin tanımlanmasına izin verir.

Hile olarak POKE'ler

Birçok 8-bit bilgisayar için oyunlar bağlamında, kullanıcılar oyunları belleğe yükleyebilir ve başlatmadan önce hile yapmak için belirli bellek adreslerini değiştirebilir , sınırsız sayıda can, dokunulmazlık, görünmezlik vb. elde edebilir. Bu tür değişiklikler yapıldı. POKE deyimlerini kullanarak. Commodore 64 , ZX Spectrum ve Amstrad CPC ilgili kartuşlar veya da izin oyuncuların Multiface eklenti, çalışan programı dondurmak Dürtmeler ve özgeçmiş girin.

Örneğin Knight Lore for the ZX Spectrum'da bağışıklık aşağıdaki komutla elde edilebilir:

POKE 47196,201

Bu durumda, 201 değeri bir RET komutuna karşılık gelir , böylece oyun, çarpışma algılamayı tetiklemeden önce bir alt rutinden erken döner .

Gibi Dergiler Sizin Sinclair oyunlar için böyle Dürtmeler listelerini yayınladı. Bu tür kodlar genellikle, örneğin yaşam sayısı, çarpışma tespiti vb. ile ilgili istenen değeri içeren bellek adresini bulmak için makine kodunu tersine mühendislikle tanımladı.

Bir 'POKE' hilesi kullanmak, modern oyunlarda daha zordur, çünkü birçoğu, oyunun bellek alanının değiştirilmesini engelleyen hile önleme veya kopya koruma önlemleri içerir. Modern işletim sistemleri, paylaşılan olmayan belleğe harici program erişimini reddetmek için sanal bellek koruma şemalarını zorunlu kılar (örneğin, her uygulama için ayrı sayfa tabloları , dolayısıyla erişilemeyen bellek alanları).

POKE'nin genel kullanımı

"POKE" bazen, özellikle 1970'lerin sonu ve 1980'lerin başında 8 bitlik mikro bilgisayarlarda bilgi işlem öğrenen kişiler arasında, yalnızca BASIC yoluyla değil, bellek içeriğinin herhangi bir doğrudan manipülasyonunu belirtmek için kullanılır . BASIC genellikle bu makinelerde kullanılabilen tek dildi ( ev bilgisayarlarında , genellikle ROM'da bulunur ) ve bu nedenle makine dilinde programlamanın açık ve en basit yolu , opcode değerlerini belleğe POKE yapmak için BASIC kullanmaktı . Bunun gibi çok düşük seviyeli kodlama yapmak, genellikle bir montajcıya erişim eksikliğinden kaynaklanır .

Poke PEEK jenerik kullanımının bir örneği olduğunu , Windows için Visual Basic , DDE ile elde edilebilir LinkPoke anahtar kelime.

Ayrıca bakınız

Referanslar