Ағылшыншамен салыстырыңыз: абзацты басыңыз — түпнұсқа терезеде ашылады. Абзац астындағы EN түймесі оны мәтін ішінде көрсетеді.
Кіріспе
Жанама тармақ (сондай-ақ есептелген секіру, жанама секіру және тіркеуіш арқылы жанама секіру деп аталады) – кейбір машина тіліндегі нұсқаулар жиынтығында кездесетін бағдарламалық басқару нұсқауларының бір түрі. Тікелей тармақтағыдай келесі орындалатын нұсқаудың мекенжайын көрсетудің орнына, аргумент мекенжайдың қайда сақталғанын анықтайды. Мысалы, "r1 тіркеуіші арқылы жанама секіру" дегеніміз, келесі орындалатын нұсқау r1 тіркеуішіндегі мекенжайда орналасқан. Секундік мекенжай нұсқау орындалғанға дейін белгілі болмайды. Жанама тармақтар жад жатынының мәніне де байланысты болуы мүмкін. Жанама тармақ шартты тармақ жасау үшін, әсіресе көп тармақты тармақ үшін пайдалы болуы мүмкін. Мысалы, бағдарламалық кіріске сәйкес, дерек мәнінің әртүрлі жағдайларын өңдеуге арналған кодқа сілтемелердің секіру кестесінен мән ізделуі мүмкін. Дерек мәні кесте мекенжайына қосылып, нәтиже тіркеуіште сақталады. Содан кейін, осы тіркеуіштің мәніне негізделген жанама секіру жасалуы мүмкін, бұл бағдарламалық басқаруды кіріске сәйкес кодқа тиімді түрде жібереді. Сол сияқты, кіші бағдарламаны шақыру нұсқаулары да жанама болуы мүмкін, кіші бағдарламаның мекенжайы жадта көрсетіледі. Функциялық көрсеткіштер әдетте жанама кіші бағдарлама шақырулары арқылы іске асырылады. Жанама тармақтар "Spectre" шабуылының әсер ететін жерлерінің бірі болды. Шабуылды азайту үшін GCC 8.1 келесі жаңа опцияларды енгізді: mindirect branch=, mfunction return= және mindirect branch register.
An indirect branch (also known as a computed jump, indirect jump and register indirect jump) is a type of program control instruction present in some machine language instruction sets. Rather than specifying the address of the next instruction to execute, as in a direct branch, the argument specifies where the address is located. An example is 'jump indirect on the r1 register', which means that the next instruction to be executed is at the address in register r1. The address to be jumped to is not known until the instruction is executed. Indirect branches can also depend on the value of a memory location. An indirect branch can be useful to make a conditional branch, especially a multiway branch. For instance, based on program input, a value could be looked up in a jump table of pointers to code for handling the various cases implied by the data value. The data value could be added to the address of the table, with the result stored in a register. An indirect jump could then be made based on the value of that register, efficiently dispatching program control to the code appropriate to the input. In a similar manner, subroutine call instructions can be indirect, with the address of the subroutine to be called specified in memory. Function Pointers are typically implemented with indirect subroutine calls. Indirect branches were one of the attack surfaces of Spectre. To mitigate the attack GCC 8.1 introduced the following new options: mindirect branch=, mfunction return= and mindirect branch register.