2013-08-19 2 views
7

어셈블리 지침 retq이 어디로 반환되는지 이해할 수 없습니다.Retq 명령, 반환 위치

정상적인 코드가 실행되면 스택에 지정된 주소로 돌아갑니다. 그러나 스택에있는 반환 주소가 어디에 있는지 어떻게 알 수 있습니까?

간단히 말해 스택에서 주소를 찾기 위해 rbp 또는 esp를 사용합니까? 이의이 샘플을 살펴 보자 : 우리가 retq 전에 명령이 볼 수

fun: 
push %rbp 
mov %rsp,%rbp 
... 
... 
pop %rbp 
retq 

main: 
... 
... 
callq "address" <fun> 
... 
... 

+1

실험하고 싶다면'retq'을'addq $ 8, % rsp;로 바꾸어보십시오. jmpq -8 (% rsp)'. 기능상으로 동등한 (성과가 아닌). –

답변

3

는 연구 어셈블리 코드 후, 여기에 내 생각이다. 은 "팝 %의 RBP는"

  1. 이동에 현재 스택 포인터 (RSP) 점의 내용과 기본 스택 포인터 (RSP)에 저장됩니다 명령 (언젠가 그것은 휴가를 명령하지만, 유사한있다).
  2. 스택의 이전 주소로 rsp와 포인터를 이동하십시오. 예를 들어

: 팝 명령 전에 : 0000 0000 0000 00D8는 (스택이 낮은 주소로 높은 주소에서 성장 가정)

: RSP를 팝업 명령 후 0000 0000 0000 00D0

지적했다

pop 명령 다음에 rsp가 새 주소를 가리키고 retq가이 주소를 반송 주소로 사용합니다.

+0

rbp를 "기본 스택 포인터 (rsp)에 저장 하시겠습니까?" –