Собственно основные варианты: Direct - когда смещение куда переходить описано в команде Indirect - когда абсолютный адресс куда переходить береться из регистра и Адресс возврата записывается в stack (типично для CISC) Адресс возврата записывается в специальный Link register (типично для RISC) Direct/Stack: Call subroutine
Push(Instruction_Pointer) Instruction_Pointer = Instruction_Pointer + Relative_Offset |
Indirect/Stack:
Push(Instruction_Pointer) Instruction_Pointer = Source |
Direct/Link register:
Link_Register = Instruction_Pointer Instruction_Pointer = Instruction_Pointer + Relative_Offset |
call address jmpl address, %o8 ! Jump and Link |
Indirect/Link register:
Link_Register = Instruction_Pointer Instruction_Pointer = Source |
Pop(Instuction_Pointer) |
Instruction_Pointer = Link_Register |
ret => jmpl %i7+8,%g0 retl => jmpl %o8+8,%g0 ! for leaf subroutines |
Instruction_Pointer = Instruction_Pointer + Relative_Offset |
Instruction_Pointer = Link_Register |
jmp address jmpl address,%g0 |