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

댓글

  • 이미 수행 한 연구는 무엇이며 용어에 대해 잘 알고 있습니까? 이것은 어떤 시스템을위한 것입니까 (시스템마다 용어가 다릅니다)?
  • 프레임 포인터 (mips 어셈블리)에 익숙해지고 싶습니다. ' 어떻게 도움이되는지 모르겠습니다. 왜 필요한가요? 감사합니다.

Answer

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

MIPS 어셈블리에서 서브 루틴을 호출 할 때 (당시에는 레지스터가 프리미엄이었습니다-레지스터 기반 매개 변수) 일반적인 경우), 매개 변수를 스택에 쓴 다음 스택 포인터를 전진시킵니다.

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

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

프레임 포인터를 저장하고 복원해야한다는 사실을 인식하십시오. 수정하는 서브 루틴 호출이 있습니다.

추가 정보 :

댓글

  • 저는 ' " 당시 레지스터가 프리미엄이었던 것이 무엇인지 알지 못합니다. "이 아닌 매개 변수가있는 등록 기반 매개 변수 regi의 #이 스택에 놓일 수도 있습니다. sters는 제한됩니다. 예를 들어 35 개의 매개 변수가있는 경우 (MIPS에 32 개의 regs가 있다고 생각합니다.) 스택에 마지막 3 개의 매개 변수를 배치해야합니다. 또한 구현에 더 구체적으로 말하자면 FP는 반환 주소가있는 메모리의 주소에 있습니다.
  • @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 I '도 이 설명 : " AMD Bulldozer : 96 개의 물리적 GPR, Intel Sandy Bridge : 160 개의 물리적 GPR, Intel Haswell : 168 개의 물리적 GPR ". 여러 코어 머신을 사용하면 상황이 재미있어집니다. SPARC에는 160 개의 레지스터 가 있습니다. 또한 MIPS의 일부 디자인 철학에 들어간 등록 창 을 알려 드리며 동시대의 레지스터 수가 절반에 불과합니다.
  • 그래서 , 이것은 x86 호출 규칙에서 %ebp 기본 포인터레지스터의 일반적인 사용과 동일합니까? (저는 '이 모든 것을 처음 접했지만 MOV 8(%ebp), %eax 등의 sth를 사용하는 것과 동일한 기본 사항처럼 들립니까?)
  • Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it. 행은 그 의미가 명확하지 않습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다