NOP (kod) - NOP (code) - Wikipedia

İçinde bilgisayar Bilimi, bir HAYIR, işlemsizveya HAYIR ("işlem yok" olarak okunur; kısaltması işlem yok) bir montaj dili talimat, Programlama dili ifade veya bilgisayar protokolü hiçbir şey yapmayan komut.

Makine dili talimatları

Bir bilgisayar komut setleri açık amacı programcı tarafından erişilebilen herhangi birinin durumunu değiştirmemek olan bir talimat içermelidir kayıtlar, durum bayrakları veya hafıza. Genellikle iyi tanımlanmış sayıda saat döngüleri yürütmek için. Diğer komut setlerinde, bir NOP, aynı etkiye neden olan işlenenlere sahip bir komutun yürütülmesiyle simüle edilebilir; ör. SPARC işlemci, talimat sethi 0,% g0 önerilen çözümdür.

Bir NOP, en yaygın olarak zamanlama amacıyla, zorlamak için kullanılır. bellek hizalaması, önlemek tehlikeler işgal etmek şube gecikme yuvası, atlama gibi mevcut bir talimatı geçersiz kılmak veya program geliştirmede daha sonra aktif talimatlarla değiştirilecek bir yer tutucu olarak (veya yeniden düzenleme sırasında kaldırılan talimatları değiştirmek sorunlu veya zaman alıcı olabilir). Bazı durumlarda, bir NOP'nin küçük yan etkileri olabilir; örneğin, Motorola 68000 bir dizi işlemci, NOP işlem kodu, boru hattı.[1]

Aşağıda bazı CPU mimarileri için NOP talimatı listelenmiştir:

CPU mimarisiTalimat anımsatıcıBaytİşlem koduNotlar
Intel x86 İşlemci aileHAYIR1; İ686 ve x86-64 için 1–90x 90[2]0x90, xchg eax, eax hariç tüm modlarda uzun mod, 0x90 işlem kodunun hala etkisinin olmadığı. Daha uzun kodlamalar Intel'in kılavuzunda açıklanmıştır.
Intel 8051 / MCS-51 aileHAYIR10x00
KOL A32HAYIR40x00000000Bu, andeq r0, r0, r0. Montaj talimatı hayır büyük olasılıkla genişleyecek mov r0, r0 0xE1A00000 kodlu (küçük endian mimarisi).[3]
KOL T32 (16 bit)HAYIR20xb000İşlem kodu SP EKLE, # 0 - Yığın işaretçisine sıfır ekleyin (İşlem yok). Montaj talimatı hayır büyük olasılıkla genişleyecek mov r8, r8 0x46C0 kodlu.[4]
KOL T32 (32 bit)HAYIR40xF3AF 8000
ARM A64 (64 bit)HAYIR40xD503201F
AVRHAYIR20x0000bir saat döngüsü
IBM System / 360, IBM Sistemi / 370, IBM Sistemi / 390, z / Mimarlık, UNIVAC 90 SerisiHAYIR40x47000000 veya 0x470nnnnn veya 0x47n0nnnn burada "n" herhangi bir 4 bitlik değerdir.NOP ("İşlem Yok") ve NOPR ("İşlem Yok Kaydı") sırasıyla "Durumda Şube Şube" veya "Koşullu Şube Kaydı" talimatlarının bir alt kümesidir; her iki versiyonun da NO-OP oluşturmak için iki seçeneği vardır.

Hem NOP hem de NOPR komutları durumunda, ikinci bayttaki ilk 0 "maske" değeridir, eşit, eşit değil, yüksek, düşük vb. Gibi test edilecek durumdur. Maske 0 ise, dallanma yok oluşur.

NOPR komutu durumunda, ikinci bayttaki ikinci değer dallanacak kayıttır. Kayıt 0 seçilirse, maske değerinden bağımsız olarak dallanma oluşmaz. Bu nedenle, ikinci bayttaki iki değerden biri 0 ise, dallanma gerçekleşmeyecektir.

NOP talimatı durumunda, ikinci bayttaki ikinci değer, birleşik bir temel kayıt, yer değiştirme yazmacı ve ofset adresinin "temel" kaydıdır. Temel kayıt da 0 ise, yer değiştirme kaydı veya yer değiştirme adresinin değerine bakılmaksızın dal alınmaz.

NOPR20x0700 veya 0x070n veya 0x07n0 burada "n" herhangi bir 4 bitlik değerdir.
SuperHHAYIR20x0009
MIPSHAYIR40x00000000Anlamına gelir sll r0, r0,0yani mantıksal olarak 0 sıfır bitini sola kaydır ve sonucu 0 yazmacıda sakla
MIPS-XHAYIR40x60000019(genişletilmiş işlem kodu r0, r0, r0 ekle)
MIXHAYIR1 kelime± * * * * 0* Baytlar isteğe bağlıdır ve 0'dan maksimum bayta kadar herhangi bir değer olabilir (63-99 aralığında olması gerekir). MIX, işaret büyüklüğü temsilini kullanır.
MMIXSWYM40xFD ******SWYM, "Makinenize sempati duyun" anlamına gelir. * Rakamları isteğe bağlı olarak seçilebilir.
Motorola 68000 ailesiHAYIR20x4E71Bu senkronize eder boru hattı ve talimatların çakışmasını önler.[1]
Motorola 6809HAYIR10x12
MOS Teknolojisi 65xx (Örneğin. 6502 )HAYIR10xEAHAYIR iki saat döngüsü tüketir. Tanımsız işlem kodları içinde NMOS 65xx ailesinin sürümleri, farklı talimat uzunlukları ve döngü süreleri olan NOP'lara dönüştürüldü. 65C02.
PowerPCHAYIR40x60000000(genişletilmiş işlem kodu ori r0, r0,0)
PIC mikro denetleyiciHAYIR12 bit0b000000000000MOVW 0, W
RISC-VHAYIR40x00000013ADDI x0, x0, 0
SPARCHAYIR40x01000000Anlamına gelir sethi 0,% g0 hangi donanımla bağlantılı sıfıra sıfırlar % g0 Kayıt ol[5]
Z80HAYIR10x00Herhangi bir etkisi olmayan (ve aynı zamanlamaya sahip) başka talimatlar vardır: LD A, A, LD B, B vb.
PDP-11HAYIR16 bit000240 (sekizlik)Koşul kodlarının hiçbirini temizleme
VAXHAYIR10x01Gecikme, işlemci türüne bağlıdır

Donanım tasarımı açısından bakıldığında, bir veriyolunun eşlenmemiş alanları genellikle sıfırları döndürecek şekilde tasarlanır; Beri NOP slayt davranış genellikle arzu edilir, bunu all-zeroes işlem kodu ile kodlamaya bir önyargı verir.

Kod

NOP bazen bir işlev tarafından gerçekleştirilen eylem için bir açıklama olarak veya işlev veya kodun etkisi yoksa bir dizi programlama dili deyimi olarak kullanılır (aynı zamanda gereksiz kod ). Ortak derleyici optimizasyonu ... bu tür bir kodun tespiti ve kaldırılması. Bu tür bir kod, boşluğa izin vermeyen programlama dilinin grameri tarafından gerekli olabilir.

Ada

İçinde Ada, boş ifadesi bir NOP işlevi görür.[6] Sözdizimi kontrol deyimlerinin veya işlevlerin boş olmasını yasakladığından, boş herhangi bir eylemin gerekli olmadığını belirtmek için kullanılmalıdır. (Bu nedenle, programcı bir dizi ifade yazmayı unutursa, program derleme yapamayacaktır.)

C ve türevleri

Aşağıdaki ikinci satır tek bir örnektir. C ifadesi davranır NOP gibi. Uygulamada çoğu derleyiciler bu ifade için kod üretmeyecek:

  int i = 0; i + 1;

Bu ifade bir ekleme yapar ve sonucu atar. Gerçekte, hesaplamanın sonucu atıldığı için, yan etkisi olmayan (ve kontrol akışını etkilemeyen, örneğin, kesme, dönüş) herhangi bir ifade kaldırılabilir.

Bir NOP gibi davranan C'deki olası en basit ifade sözde boş ifade, bir ifade gerektiren bir bağlamda sadece bir noktalı virgüldür. (Bu durumda bir derleyicinin bir NOP talimatı oluşturması gerekmez; tipik olarak, hiçbir talimat oluşturulmaz.)

  ;

Alternatif olarak, boş bir blok (bileşik ifade) kullanılabilir ve daha okunaklı olabilir:

  {}

Bir fonksiyonun gövdesi gibi bazı durumlarda, bir blok kullanılmalıdır, ancak bu boş olabilir. C'de ifadeler boş olamaz — basit ifadeler a ile bitmelidir; (noktalı virgül), bileşik ifadeler {} (kaşlı ayraçlar) içine alınır, bu da kendi başına noktalı virgül gerektirmez. Bu nedenle, bir ifadenin dilbilgisi açısından gerekli olduğu bağlamlarda, bu tür bazı boş ifadeler kullanılabilir.

Null deyimi kendi başına işe yaramaz, ancak daha geniş bir bağlamda sözdizimsel bir kullanıma sahip olabilir, örneğin bir döngü bağlamında:

  süre (getchar() != ' n') {}

alternatif olarak

  süre (getchar() != ' n')      ;

veya daha kısaca:

  süre (getchar() != ' n');

(son formun kafa karıştırıcı olabileceğini ve bu nedenle bazı derleyiciler veya derleyici seçenekleriyle bir uyarı oluşturduğunu unutmayın, çünkü noktalı virgül genellikle satırın sonunda bir parantezden sonra yerleştirildiğinde işlevin sonunu çağırır).

Yukarıdaki kod, işlevi çağırmaya devam eder getchar () bir n (satırsonu) karakteri döndürene kadar, esasen standart girişin geçerli okuma konumunu bir sonraki satırın başlangıcına ileri sarar.

Fortran

İçinde Fortran, DEVAM ET deyimi DO döngüsündeki son ifade gibi bazı bağlamlarda kullanılır, ancak herhangi bir yerde kullanılabilir ve herhangi bir işlevi yoktur.

JavaScript

JavaScript dilde yerleşik bir NOP ifadesi yoktur. Birçok uygulama mümkündür:

  • Kullan ';' boş ifade[7] ya da '{}' boş blok ifadesi aynı şekilde C ve türevleri örnekler;
  • Kullan Tanımsız ya da boş tam bir ifade olarak ifade (bir ifade ifadesi) önceki yöntemlere sözdizimi tarafından izin verilmediğinde.

Bir işlevin gerekli olduğu durumlarda alternatifler şunlardır:

  • Kullan Function.prototype () herhangi bir argümanı ve dönüşü kabul eden yerleşik işlev Tanımsız;[8]
  • Üçüncü taraf kitaplığında bulunan bir NOP işlevini kullanın — aşağıya bakın;
  • Aşağıdaki örnekte olduğu gibi özel bir NOP işlevi tanımlayın ( ES6 ok işlevi sözdizimi):
sabit noop = () => {};

AngularJS

AngularJS çerçeve sağlar açısal.noop hiçbir işlem yapmayan işlev.

jQuery

jQuery kütüphane bir işlev sağlar jQuery.noop ()hiçbir şey yapmaz.[9]

Lodash

Lodash kütüphane bir işlev sağlar _.noop (), tanımsız döndürür ve hiçbir şey yapmaz.[10]

Pascal

C ile olduğu gibi; kendisi tarafından kullanılan bir boş ifade olarak kullanılabilir Pascal. Aslında, dilin spesifikasyonu nedeniyle, bir BEGIN / END bloğunda noktalı virgül END ifadesinden önce isteğe bağlıdır, bu nedenle burada kullanılan noktalı virgül gereksizdir.

Ayrıca, aşağıdakilerden oluşan bir blok BEGIN END; başka bir BEGIN / END bloğunun içine yerleştirilse bile hiçbir eylem olmadığını belirtmek için yer tutucu olarak kullanılabilir.

Python

Python programlama dili var geçmek Beyan bu, yürütüldüğünde hiçbir etkisi yoktur ve bu nedenle bir NOP işlevi görür. Öncelikle Python'a bağlı olarak doğru sözdizimi sağlamak için kullanılır. girintiye duyarlı sözdizimi; örneğin bir tanım için sözdizimi sınıf olarak ifade edilmesi gereken sınıf mantığına sahip girintili bir blok gerektirir geçmek ne zaman boş olmalı.

Kabuk komut dosyası (bash, zsh vb.)

':'[iki nokta üst üste] komutu, "NOP" (hiçbir şey yapmama işlemi) ile benzer etkiye sahip olan bir kabuk yerleşiktir. Teknik olarak bir NOP değil, çünkü özel parametresi $? (son komutun çıkış durumu) 0'a kadar. Kabuğun yerleşik 'true' ile eşanlamlı olduğu düşünülebilir ve çıkış durumu true (0).[11][12][13]

TeX makro dili (ConTeXt, LaTeX, vb.)

TeX tipografik sistemin makro dili, Rahatlayın komut.[14] Kendi başına hiçbir şey yapmaz, ancak hemen önceki komutun sonraki simgeleri ayrıştırmasını önlemek için kullanılabilir.[15]

NOP protokol komutları

Birçok bilgisayar protokolleri, gibi telnet, istemcinin başka herhangi bir eylem istemeden sunucudan bir yanıt istemek için verebileceği bir NOP komutu ekleyin. Böyle bir komut, bağlantının hala canlı olduğundan emin olun veya sunucunun yanıt verdiğini. Bir NOOP komutu aşağıdaki protokollerin bir parçasıdır (bu kısmi bir liste):

Listelenen diğer protokollerden farklı olarak, IMAP4 NOOP komutunun belirli bir amacı olduğunu unutmayın - sunucunun istemciye herhangi bir bekleyen bildirimi göndermesine izin verir.

Çoğu iken telnet veya FTP sunucular bir NOOP komutuna "OK" veya "+ OK" ile yanıt verir, bazı programcılar istemciye ilginç yanıtlar ekler. Örneğin, ftpd daemon MINIX NOOP'a şu mesajla yanıt verir:[16]

200 Sana da HAYIR!

Çatlama

ŞİD'ler genellikle çatlama Seri numaraları, belirli donanım veya yazılım gereksinimlerini, donanımın varlığını veya yokluğunu kontrol eden yazılım dongle'lar, vb.[kaynak belirtilmeli ] Bu işlem, değiştirilerek gerçekleştirilir. fonksiyonlar ve alt programlar güvenlik kontrollerini atlamak ve bunun yerine kontrol edilmekte olan beklenen değeri döndürmek için. Güvenlik kontrolü rutinindeki talimatların çoğu kullanılmayacağından, bunlar NOP'larla değiştirilecek ve böylece ikili dosyada takip eden her şeyin konumunu değiştirmeden yazılımın güvenlik işlevselliğini kaldıracaktır.

Güvenlik açıkları

NOP işlem kodu, bir NOP slayt, komut işaretçisinin tam değeri belirsiz olduğunda kodun yürütülmesine izin verir (örneğin, bir arabellek taşması yığındaki bir işlevin dönüş adresinin üzerine yazılmasına neden olduğunda).

Ayrıca bakınız

Referanslar

  1. ^ a b "Motorola 68000 Programcı Referans Kılavuzu" (PDF).
  2. ^ "Intel 64 ve IA-32 Mimarileri Yazılım Geliştirici Kılavuzu: Yönerge Seti Referansı A-Z" (PDF). Alındı 2012-03-01.
  3. ^ "4.8.4. NOP ARM sözde talimatı". BREW Assembler Kılavuzu için RealView Derleme Araçları.
  4. ^ "5.6.3. NOP Başparmak sözde talimatı". BREW Assembler Kılavuzu için RealView Derleme Araçları.
  5. ^ Weaver, D. L .; Germond, T., eds. (1994). SPARC Mimarlık Kılavuzu, Sürüm 9 (PDF). SPARC International, Inc. Prentice Hall. ISBN  0-13-825001-4. Arşivlenen orijinal (PDF) 2012-01-18 tarihinde. Alındı 2014-01-09. NOP'nin imm22 = 0 ve rd = 0 ile SETHI komutunun özel bir durumu olduğuna dikkat edin.
  6. ^ Ada Referans Kılavuzu - boş ifadeler. "Bir null_statement'ın yürütülmesinin hiçbir etkisi yoktur."
  7. ^ MDN JavaScript referansı - boş ifade. "Boş ifade bir noktalı virgüldür (;) JavaScript sözdizimi gerektirse bile hiçbir ifadenin yürütülmeyeceğini belirtir. "
  8. ^ ECMAScript Dil Belirtimi - Sürüm 5.1 - İşlev Prototip Nesnesinin Özellikleri
  9. ^ jQuery.noop () jQuery API belgelerinden
  10. ^ "Lodash Belgeleri". lodash.com. Alındı 2017-12-15.
  11. ^ Gelişmiş Bash Komut Dosyası Kılavuzu> Bölüm 3. Özel Karakterler
  12. ^ bash manpage> KABUK YAPISI KOMUTLAR
  13. ^ zsh kılavuz sayfası (zshbuiltins)> KABUK YAPISI KOMUTLAR
  14. ^ Bausum, David (2002). "TeX İlkel Kontrol Dizileri". TeX Referans Kılavuzu. Kluwer Academic Publishers. Alındı 1 Nisan 2020. The TeXbook'a göre, karşılaştığında 'TeX hiçbir şey yapmaz' Rahatlayın. Aslında, Rahatlayın TeX'e 'Bu yaptığınız şeyin sonu' diyebilir.
  15. ^ TeX wikibook - Rahatlayın
  16. ^ "ftpd.c". Alındı 2016-06-19.