No-Operation Instruction — me’moriy dastur holatini mazmunli o‘zgartirmasdan bajariladigan mashina buyrug‘i. U odatda NOP mnemonic bilan ifodalanadi. Program counter odatdagidek keyingi buyruqqa o‘tadi, lekin umumiy registr, xotira va nazorat oqimida foydali natija hosil bo‘lmaydi.
Kodlash
Ba’zi ISAlarda NOP uchun alohida opcode mavjud. Boshqasida nol registrini o‘ziga qo‘shish yoki ta’sirsiz move kabi mavjud buyruqning maxsus operandli ko‘rinishi kanonik NOP hisoblanadi. NOP uzunligi qat’iy yoki bir nechta bayt variantiga ega bo‘lishi mumkin.
O‘zgaruvchan uzunlikdagi arxitekturada ko‘p baytli NOP kod blokini kerakli chegaraga to‘ldiradi. Bir nechta qisqa NOP o‘rniga dekoderga qulay bitta uzun variant tanlanishi mumkin. Barcha rezerv qilingan opcode NOP emas; noma’lum kod ko‘pincha illegal-instruction istisnosi berishi kerak.
Tekislash va patch
Kompilyator sikl yoki funksiya kirishini instruction cache satri va fetch chegarasiga moslashtirish uchun oldiga NOP qo‘shadi. Bu kod hajmini oshiradi, ammo issiq yo‘lning dekodlanishini yaxshilashi mumkin. Har tekislash foydali emas; ortiqcha padding keshni band qiladi.
Hot patch tizimi keyinroq jump yoki call yozish uchun oldindan yetarli NOP maydoni qoldiradi. Yangilash paytida boshqa oqim yarim yozilgan ko‘rsatmani ko‘rmasligi, keshlar sinxronlanishi va almashtiruvchi kod aynan ajratilgan uzunlikka sig‘ishi kerak.
Vaqt va quvur
NOP hech qanday me’moriy ish qilmasa ham fetch, decode va commit resurslaridan foydalanishi mumkin. Mikroarxitektura uni erta tashlashi yoki nol mikrooperatsiyaga aylantirishi mumkin, ammo buni dastur kafolati sifatida qabul qilib bo‘lmaydi. NOP aniq vaqt kechiktirish vositasi emas: sikl soni protsessor, kesh va quvvat holatiga qarab farq qiladi.
Tarixiy delay slotlarda foydali mustaqil buyruq topilmasa NOP qo‘yilgan. Bu hazardni xavfsiz to‘ldiradi, lekin throughputni kamaytiradi. Zamonaviy apparat hazardni o‘zi aniqlasa, assembler qo‘lda NOP kiritishi ko‘pincha kerak emas.
NOP va bubble
NOP haqiqiy kod baytiga, manzilga va odatda commit hodisasiga ega. Pipeline bubble esa ichki valid bo‘lmagan bo‘sh slot bo‘lib, dastur binariysida mavjud emas. Debugger NOP ustida qadam bosishi mumkin; bubble’ni faqat mikroarxitektura kuzatuvi ko‘rsatadi.
NOP steganografiya yoki “sled” sifatida suiiste’mol qilinishi mumkin, lekin uning mavjudligi o‘zi zararli kod belgisi emas. Disassembler padding, patch maydoni va haqiqiy bajariladigan NOPni boshqaruv oqimi kontekstida talqin qiladi.
Maxsus NOPlar
Ayrim ISA hint ko‘rsatmalarini eski protsessor NOP sifatida qabul qiladi, yangi protsessor esa ulardan spin-wait, quvvat yoki branch xavfsizligi signali sifatida foydalanadi. Bunday kodlash orqaga moslik beradi: semantik natija talab qilinmaydi, lekin mikroarxitektura samaraliroq ishlashi mumkin. Dastur hint bajarilmaganida ham to‘g‘ri qolishi shart.
Xavfsiz patch maydoni ko‘p baytli kanonik NOP bilan to‘ldiriladi; tasodifiy “ta’sirsiz” buyruq tanlanmaydi. Chunki u bayroqlarni, dependency holatini yoki istisno xulqini o‘zgartirishi mumkin. Arxitektura tavsiya qilgan NOP dekoder va pipeline uchun bashorat qilinadigan variantdir.
NOP sonini vaqt kechikishi sifatida ishlatgan firmware chastota, pipeline va yangi chip avlodida buziladi. Apparatura taymeri, sikl hisoblagichi yoki hujjatlashtirilgan polling sharti aniq kutish uchun to‘g‘ri vositadir.
NOP breakpoint bilan almashtirilganda original bayt keyin tiklash uchun saqlanadi.
Bog‘liq tushunchalar
NOP, instruction alignment, hot patching, pipeline bubble, delay slot, machine code