간접분지

Indirect branch

간접 분기(계산된 점프, 간접 점프 및 레지스터 간접 점프라고도 함)는 일부 기계 언어 명령 집합에 존재하는 프로그램 제어 명령의 한 유형이다.직접 분기와 같이 실행할 다음 명령주소를 지정하는 대신, 인수는 주소가 있는 위치를 지정한다.예로는 'r1 레지스터에서 간접적으로 점프'가 있는데, 이는 실행할 다음 명령이 레지스터 r1의 주소에 있음을 의미한다.뜀박질할 주소는 명령이 실행될 때까지 알 수 없다.간접적인 가지도 메모리 위치의 값에 따라 달라질 수 있다.

간접 분기는 조건부 분기를 만들 때 유용할 수 있는데, 특히 다방향 분기를 만들 때 유용할 수 있다.예를 들어, 프로그램 입력에 기초하여 데이터 값이 내포한 다양한 사례를 처리하기 위한 코드의 포인터의 점프 테이블에서 값을 조회할 수 있다.데이터 값은 테이블의 주소에 추가될 수 있고, 결과는 레지스터에 저장될 수 있다.그런 다음 해당 레지스터의 값에 기초하여 간접 점프를 할 수 있으며, 프로그램 제어를 입력에 적합한 코드로 효율적으로 배치할 수 있다.

유사한 방식으로 서브루틴 호출 지침은 메모리에 호출될 서브루틴 주소를 사용하여 간접적일 수 있다.Function Pointers는 일반적으로 간접 서브루틴 호출로 구현된다.

간접적인 가지는 스펙터의 공격 표면 중 하나였다.GCC 8.1은 공격을 완화하기 위해 다음과 같은 새로운 옵션을 도입했다.-mindirect-branch=,-mfunction-return=그리고-mindirect-branch-register.[1][nb 1]

조립자 구문 예제

MSP430: br r15
SPARC: jmpl %o7
MIPS: jr $ra
X86(AT&T 구문): jmp *%eax
X86(Intel 구문): jmp eax
: mov pc, r2
Itanium(x86 계열): br.ret.sptk.few rp
6502: jmp ($0DEA)
65C816: jsr ($0DEA,X)
6809: jmp [$0DEA],jmp B,X,jmp [B,X]
6800: jmp 0,X
Z80: jp (hl)
Intel 8080: pchl
IBM System z: bcr cond,r1[2]
RISC-V: jalr x0, 0(x1)

참고 항목

메모들

  1. ^ 다음 항목도 참조하십시오.RETPOLINE=y리눅스 커널 4.14.14/4.9.77/4.4.112에 추가된 기능.참고 항목:레트폴린

참조

  1. ^ Larabel, Michael (2018-01-14). "Spectre Mitigation Added To GCC 8, Seeking Backport To GCC 7". Archived from the original on 2018-01-20. Retrieved 2018-01-19.
  2. ^ "z/Architecture - Principles of Operation" (4 ed.). IBM. May 2004 [1990]. SA22-7832-03. Archived from the original on 2016-03-04. Retrieved 2018-05-26.