Program counter — protsessor bajarishi kerak bo‘lgan navbatdagi mashina ko‘rsatmasining manzilini saqlaydigan maxsus registrdir. Ayrim arxitekturalarda u instruction pointer yoki PC deb ataladi. Protsessor fetch bosqichida shu manzildan ko‘rsatmani oladi, keyin program counter odatiy ketma-ketlikka yoki boshqaruv oqimi ko‘rsatgan yangi manzilga yangilanadi.
Ko‘rsatmalar ketma-ketligi
Oddiy bajarilishda PC joriy ko‘rsatma uzunligicha oshadi. RISC arxitekturalarida ko‘rsatmalar ko‘pincha bir xil uzunlikda bo‘ladi; x86 kabi o‘zgaruvchan uzunlikli to‘plamda dekoder keyingi manzilni aniqlaydi. Arxitektura hujjatida ko‘rinadigan PC qiymati pipeline ichidagi haqiqiy fetch manzilidan farq qilishi mumkin.
Branch, jump, call va return ko‘rsatmalari boshqaruv oqimini o‘zgartiradi. Shartli branch natijasi rost bo‘lsa PC target manzilga o‘tadi, aks holda ketma-ket manzil tanlanadi. Function call qaytish manzilini stack yoki link registrida saqlaydi; return shu manzilni yana program counterga yuklaydi.
Uzilish va istisnolar
Interrupt yoki exception yuz berganda protsessor joriy bajarilish holatini, jumladan qaytish uchun zarur PC qiymatini saqlaydi. Keyin u interrupt vector orqali handler manziliga o‘tadi. Handler tugagach maxsus return ko‘rsatmasi avvalgi kontekstni tiklaydi. Saqlanadigan manzil xato bergan ko‘rsatmanimi yoki undan keyingisini ko‘rsatishi exception turiga bog‘liq.
Operatsion tizim context switch paytida oqimning program counterini boshqa registrlar bilan birga saqlaydi. Oqim qayta rejalashtirilganda PC tiklanadi va dastur o‘sha bajarilish nuqtasidan davom etadi. Debugger breakpoint qo‘yganda ham PC orqali to‘xtagan ko‘rsatma manzili aniqlanadi.
Pipeline va spekulyatsiya
Zamonaviy protsessor bir vaqtning o‘zida bir nechta ko‘rsatmani pipeline bosqichlarida ushlab turadi. Branch predictor ehtimoliy keyingi PCni oldindan tanlaydi. Taxmin to‘g‘ri bo‘lsa pipeline uzluksiz ishlaydi; noto‘g‘ri bo‘lsa spekulyativ natijalar bekor qilinib, to‘g‘ri manzildan fetch qayta boshlanadi.
Out-of-order protsessorda ko‘rsatmalar ichki tartibda turlicha bajarilishi mumkin, ammo retirement arxitektura kuzatadigan tartibni saqlaydi. Precise exception talabida tizim dasturga xato aynan ma’lum PCda ketma-ket bajarilgandek ko‘rinishini ta’minlaydi.
Xavfsizlik va diagnostika
Memory corruption hujumlari return address yoki function pointer orqali program counterga ta’sir qilishga urinadi. NX, ASLR, control-flow integrity va shadow stack bunday boshqaruvni qiyinlashtiradi. Ular dasturdagi asosiy xotira xatosini tuzatmaydi, lekin ekspluatatsiya imkonini cheklaydi.
Crash dump ichidagi PC qaysi ko‘rsatma bajarilayotganda nosozlik yuz berganini topish uchun symbol jadvali bilan bog‘lanadi. Optimallashtirish, inline funksiyalar va address randomization sabab debugger mos binary hamda to‘g‘ri load addressdan foydalanishi kerak. Embedded tizimlarda watchdog resetdan oldingi PCni saqlash kam takrorlanadigan xatoni tahlil qilishga yordam beradi.
Nisbiy manzillash
Ko‘p instruction setlarda branch target joriy program counterga signed offset qo‘shish orqali hisoblanadi. PC-relative addressing kodning xotirada boshqa joyga ko‘chirilishini osonlashtiradi va position-independent executable hamda shared library uchun foydalidir. Offset diapazoni cheklangan bo‘lsa assembler uzoq target uchun qo‘shimcha ko‘rsatma yoki trampoline yaratishi mumkin. Debug symbol machine addressni source qatoriga bog‘laydi; stripped binaryda bu xarita tashqi symbol faylida saqlanadi. ASLR sabab crashdagi runtime PCdan modulning load base manzili ayrilib, haqiqiy file offset topiladi.
Virtual mashina va emulator guest program counterini alohida holat sifatida saqlaydi; tracing vositasi bajarilgan manzillar ketma-ketligidan control flow tarixini tiklaydi.
Bog‘liq tushunchalar
Instruction pointer, Branch prediction, Call stack, Interrupt, Context switch, Control-flow integrity