Flags register — protsessor bajarilgan amallar natijasi va boshqaruv holatini ifodalovchi bir nechta bitlardan tashkil topgan maxsus registrdir. Har bit alohida flag bo‘lib, nol natija, ko‘chirish, ishora, overflow yoki interruptlarga ruxsat kabi holatni bildiradi. Aniq flaglar va ularning ma’nosi protsessor arxitekturasiga bog‘liq.
Arifmetik holat flaglari
Zero flag amal natijasi nol bo‘lganda o‘rnatiladi. Sign yoki negative flag odatda natijaning eng katta bitini aks ettiradi. Carry flag unsigned qo‘shishda yuqori razryaddan ko‘chish, ayirishda esa arxitekturaga qarab qarz olish holatini bildiradi. Overflow flag signed son natijasi representatsiya qilinadigan diapazondan chiqqanini ko‘rsatadi.
Carry va overflow bir xil narsa emas. Masalan, bir xil bit naqshi unsigned talqinda diapazondan chiqishi, signed talqinda esa qonuniy bo‘lishi mumkin yoki aksincha. Dastur qaysi son modelidan foydalanayotganiga qarab tegishli flagni tekshiradi. Ba’zi arxitekturalarda parity, auxiliary carry yoki saturation holati uchun ham bitlar mavjud.
Shartli bajarilish
Compare ko‘rsatmasi ko‘pincha ikki operandni ayirgandek flaglarni yangilaydi, lekin natijani saqlamaydi. Keyingi conditional branch zero, carry, sign va overflow kombinatsiyasiga qarab yo‘nalishni tanlaydi. Signed “kichik” taqqoslash bilan unsigned “below” taqqoslash turli flag mantiqidan foydalanadi.
Compiler if, sikl va taqqoslashlarni shu mexanizmga o‘giradi. Ayrim instruction setlarda branch o‘rniga shartli ko‘chirish yoki predikatsiya mavjud. Boshqa arxitekturalar har arifmetik amal bilan global flags register yangilash o‘rniga taqqoslash natijasini oddiy registrga yozishi mumkin.
Boshqaruv flaglari
Flags register faqat arifmetik natijani saqlamaydi. x86 arxitekturasidagi interrupt flag maskalanadigan interruptlarni qabul qilish holatini boshqaradi; direction flag ayrim satr ko‘rsatmalarida indeks oshishi yoki kamayishini belgilaydi. Privilege darajasida o‘zgartiriladigan control bitlar oddiy dastur uchun cheklangan bo‘lishi mumkin.
Interrupt yoki exception handler joriy flaglarni saqlab, keyin qayta tiklaydi. Aks holda handler ichidagi arifmetik amal uzilgan dastur kutayotgan shart holatini buzishi mumkin. Function calling convention ham flaglarning chaqiruvlar orasida saqlanishi yoki buzilishi mumkinligini belgilaydi.
Dasturlash va tahlil
Yuqori darajali dasturchi flaglar bilan bevosita kam ishlaydi, ammo assembly, kompilyator, kriptografiya va ko‘p aniqlikdagi arifmetikada ular muhim. Katta sonlarni bir necha machine word bilan qo‘shishda carry keyingi wordga uzatiladi. Constant-time kriptografik kod branch o‘rniga flag natijasidan ehtiyotkorlik bilan foydalanishi mumkin.
Debugger register oynasida flaglarni ko‘rsatib, branch nima sababdan olinganini tushuntiradi. Tahlilda ko‘rsatma flaglarni yangilaydimi, qaysilarini saqlaydimi va keyingi ko‘rsatma aynan qaysi qiymatni o‘qishini hisobga olish kerak. Out-of-order yadro ichki flag bog‘liqliklarini rename qilishi mumkin, lekin dasturga arxitekturada belgilangan ketma-ket natija ko‘rinadi.
Flag bog‘liqligi
Ketma-ket ikkita arifmetik ko‘rsatma bir xil flags register’ni yozsa, ikkinchi amal birinchi natijani kerak bo‘lmasa ham yo‘q qiladi. Assembly yozishda branch aynan qaysi ko‘rsatma o‘rnatgan flaglarni o‘qishi tekshiriladi. Compiler intermediate representation’da comparison natijasini alohida qiymat sifatida saqlab, keyin target arxitekturaga mos flag ketma-ketligini yaratadi. Interruptlarni o‘chirishga xizmat qiluvchi control flagni uzoq vaqt o‘zgartirish latency va tizim barqarorligiga zarar yetkazadi; critical section minimal bo‘lishi va privilege qoidalariga rioya qilishi kerak.
Bog‘liq tushunchalar
Status register, Carry flag, Overflow flag, Conditional branch, Instruction set architecture, Assembly language