간접분지
Indirect branch이 글은 검증을 위해 인용구가 추가로 필요하다. – · · · · (2018년 5월) (이 템플릿 과 시기 |
기계코드 |
---|
일반개념 |
지침들 |
간접 분기(계산된 점프, 간접 점프 및 레지스터 간접 점프라고도 함)는 일부 기계 언어 명령 집합에 존재하는 프로그램 제어 명령의 한 유형이다.직접 분기와 같이 실행할 다음 명령의 주소를 지정하는 대신, 인수는 주소가 있는 위치를 지정한다.예로는 '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)
참고 항목
- 분기표
- 간접 나사산
- 간접 분기 제어(IBC)
- 간접 분기 제한 투기(IBRS)
- 간접 분기 예측 장벽(IBPB)
- 단일 나사산 간접 분기 예측 변수(STIBP)
메모들
참조
- ^ 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.
- ^ "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.