프레임 포인터 설명


28

에서는 어셈블리 MIPS , 스택 포인터 레지스터 및 프레임 포인터에 대한 다른 레지스터가있다. 프레임 포인터는 무엇이고 그 목적은 무엇입니까? 스택 포인터와 어떻게 다릅니 까?


1
어떤 연구를 이미 수행했으며 용어에 대해 잘 알고 있습니까? 이것은 어떤 시스템입니까 (다른 시스템은 다른 용어를 가짐)?

프레임 포인터 (mips assembly)에 익숙해지기를 원합니다. 어떻게 도움이되는지 모르겠습니다. 왜 필요한가요? 고마워
qwaserdftyghuijkiii

답변:


44

MIPS 어셈블리에서 스택 포인터는 스택의 상단을 가리 킵니다. 스택에 공간을 할당하면 스택 포인터 ($ sp)가 사용 가능한 메모리를 가리 키도록 이동합니다.

MIPS 어셈블리에서 서브 루틴을 호출 할 때 (레지스터가 당시에는 레지스터 기반 매개 변수가 아닌 경우 레지스터가 프리미엄 임) 매개 변수를 스택에 쓴 다음 스택 포인터를 진행시킵니다.

메소드가 시작되면 매개 변수의 오프셋이되었을 수 있습니다 16($sp). 그러나 변수가 스택에 배치되면 스택 포인터가 이동하고 동일한 매개 변수24($sp)대신 배치 될 수 있습니다 . 이로 인해 코드가 약간 혼동 될 수 있습니다.

프레임 포인터 ($ fp)는 스택 프레임의 시작을 가리키며 서브 루틴 호출 기간 동안 움직이지 않습니다. 이는 스택 프레임의베이스를 가리키며 서브 루틴으로 전달되는 매개 변수는 프레임 포인터에 대해 일정한 지점에 유지됩니다.

프레임 포인터를 수정하는 서브 루틴 호출로 프레임 포인터를 저장하고 복원해야합니다.

더 읽을 거리 :


"레지스터가 그 당시 프리미엄이었던 이유는 무엇입니까?-기존의 레지스터 기반 매개 변수"라는 의미는 모르지만 레지스터 수가 제한되어 있으면 매개 변수를 스택에 넣을 수도 있습니다. 예를 들어 35 개의 매개 변수가있는 경우 (MIPS에 32 개의 규칙이 있다고 생각합니다.) 최종 3 개의 매개 변수를 스택에 배치해야합니다. 구현에 더 구체적으로, FP는 반환 주소가있는 메모리의 주소에 있습니다.
Jonathan

1
@Jonathan MIPS이 32 개의 레지스터 중 $ 0은 0입니다. $ at는 예약되었고, $ v0 및 $ v1은 함수 호출의 반환 값이며, $ a0-$ a3은 함수 매개 변수, $ t0-$ t9는 임시적입니다 (호출자 유지). , $ s0-$ s7이 저장되었으며 시스템 자체에서 $ gp, $ sp, $ fp 및 $ ra가 사용되었습니다. 대체로 24 개의 범용 레지스터와 사용하려는 경우 일부 오버 헤드가 발생했습니다. 일반적으로 $ t 레지스터 (10) 만 사용했습니다. 이것을 128 개의 레지스터가있는 Itanium과 비교하십시오. 35 개의 매개 변수를 사용하여 MIPS에서 함수를 호출하면 스택에 모두 넣을 수 있습니다.

@Jonathan 나는 또한 이 의견을 지적 할 것이다 . "AMD 불도저 : 96 물리적 GPR, Intel Sandy Bridge : 160 물리적 GPR, Intel Haswell : 168 물리적 GPRs" 여러 코어 머신으로 상황이 재미 있습니다. SPARC에는 160 개의 레지스터 가있었습니다 . 또한 MIPS의 디자인 철학 중 일부에 해당 하는 등록 창 을 동시 등록자 수의 절반으로 등록하는 창 을 지적합니다 .

%ebpx86 호출 컨벤션에서 '기본 포인터'레지스터를 사용하는 것과 동일한 것 입니까? (이 모든 것을 처음 사용하지만 sth를 사용하는 것과 같은 기본적인 것 같 MOV 8(%ebp), %eax습니까?)
ELLIOTTCABLE

선은 Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.확실히 어떤 것을 분명하지 않다 수단
zadane
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.