Jump Instruction — dastur hisoblagichini yangi nishon manziliga shartsiz o‘zgartiradigan protsessor buyrug‘i. U boshqaruvni boshqa kod blokiga uzatadi va odatda qaytish manzilini avtomatik saqlamaydi. Shartli branch, funksiya chaqiruvi va qaytish bilan qarindosh bo‘lsa-da, jumpning me’moriy vazifasi oddiy nazorat o‘tishidir.
Bevosita va bilvosita sakrash
Bevosita jump nishonni buyruq ichidagi siljish yoki manzil maydoni orqali belgilaydi. Kompilyator va linker nishonni oldindan bilishi mumkin, shu sabab statik nazorat oqimini tahlil qilish osonroq. Position-independent kodda nisbiy siljish keng tarqalgan; dastur boshqa bazaga yuklansa ham bloklar orasidagi masofa o‘zgarmaydi.
Bilvosita jump nishonni registr yoki xotiradan oladi. switch jadvali, virtual metod, dinamik dispatcher va tail call shunday o‘tishdan foydalanishi mumkin. Nishon ish vaqtida tanlangani sabab disassembler barcha ehtimoliy yo‘llarni faqat baytlardan aniq topa olmaydi.
Kodlash diapazoni
Buyruqdagi siljish maydoni manzilning hamma bitini saqlamasligi mumkin. Nishon yaqin bo‘lsa qisqa kod yetarli. Uzoq o‘tishda manzilning yuqori qismini registrga yuklab, so‘ng bilvosita jump qilish talab etiladi. Linker bo‘limlarni joylashtirgach qisqa shakl sig‘masligini aniqlab, trampoline yoki veneer deb ataladigan yordamchi ketma-ketlik yaratishi mumkin.
Nishonning tekislanishi ISA qoidalariga mos bo‘lishi kerak. O‘zgaruvchan uzunlikdagi arxitekturada buyruq o‘rtasiga sakrash noto‘g‘ri dekodlashga, qat’iy tekislangan arxitekturada esa alignment istisnosiga olib keladi.
Mikroarxitektura
Bevosita jump nishoni dekodlashda tez aniqlanishi mumkin. Bilvosita jump uchun predictor avval kuzatilgan nishonlarni saqlaydi. Xato taxmin noto‘g‘ri yo‘l buyruqlarini flush qiladi. Ko‘p nishonli dispatcher predictor uchun qiyin bo‘lib, ishlash tezligiga sezilarli ta’sir qilishi mumkin.
Jump link registriga qaytish manzilini yozsa, u ko‘pincha call semantikasini oladi. Link yozilmasa yoki natija tashlansa, shu kodlash oddiy jump sifatida ishlatilishi mumkin. Aniq nom va ta’sir ISAga bog‘liq.
Xavfsizlik
Bilvosita jump nishoni buzilishi control-flow hijacking hujumlariga yo‘l ochadi. Boshqaruv oqimi yaxlitligi ruxsat etilgan nishonlar to‘plamini tekshiradi, ayrim apparat kengaytmalari esa qonuniy bilvosita nishonlarni maxsus belgi bilan boshlashni talab qiladi. W^X siyosati kod sahifasiga yozishni cheklaydi, ammo mavjud kod ichidagi noto‘g‘ri nishonni o‘zi hal qilmaydi.
Jump stek freymini yaratmaydi va avtomatik qaytish kafolatini bermaydi. U funksiya ichidagi bloklar, tail call yoki kompilyator yaratgan umumiy epilogga o‘tishda ayniqsa foydalidir.
Jump table ishlatilganda indeks diapazoni nishon yuklanishidan oldin tekshiriladi. Jadval yozuvlari to‘liq manzil yoki umumiy baza bilan qo‘shiladigan kichik siljish bo‘lishi mumkin. Ikkinchi shakl joyni tejaydi va ko‘chiriladigan kodga qulay. Indeks tekshiruvi yo‘qolsa, ma’lumot jadval tashqarisidan nishon sifatida o‘qilib, nazorat oqimi buziladi. Optimallashtiruvchi kompilyator switch holatlari zichligini hisoblab, jump table, taqqoslash daraxti yoki ketma-ket branch orasidan tanlaydi.
Debuggerda jumpdan keyingi “next” va “step” amallari farqlanadi. Oddiy jump funksiyani chaqirmagani uchun qaytish nuqtasi yaratmaydi; boshqaruv oqimi grafigi uning nishoni va tushib qolmaydigan ketma-ket yo‘lini to‘g‘ri belgilaydi. Dead code tahlili ham shu qirralarga tayanadi.
Hot patch tizimi ishlayotgan kodni yangi amalga yo‘naltirish uchun kirishda jump yozishi mumkin. Baytlar atomik yangilanishi, instruction cache sinxronlanishi va hech bir oqim yarim yozilgan buyruqni ko‘rmasligi ta’minlanadi; bu oddiy fayl almashtirishdan ancha murakkab.
Bog‘liq tushunchalar
program counter, indirect branch, control-flow integrity, branch instruction, call instruction, position-independent code