2016-06-26 3 views
3

, 우리 일반적으로 함수에서 반환 할 때 :함수가 반환 된 후 esp의 값은 무엇입니까? C/86에서

  1. pop ebp 이전 함수의 프레임 포인터를 복원하기 위해 호출하는 함수가 계속 될 수 있음을 암시 pop eip 그래서 포함 (내가 이해)
  2. ret 반환 주소에서 실행하려면

이 시점에서 esp에 포함 할 것으로 예상되는 항목은 무엇입니까? 반환 주소 바로 위의 포인터이거나, ret에 의해 암시 적으로 변경된 esp의 값입니까?

감사합니다 :) ret

+0

CDECL 호출 규칙에서 'esp'는 이제 호출 전에 스택에 푸시 된 마지막 매개 변수를 가리 킵니다. –

+2

이와 같은 질문에 대해서는 각 지침의 역할에 대한 매우 자세한 설명이 포함 된 설명서를 읽는 것이 좋습니다. – fuz

+1

@CodyGray :'ret'는 esp에 영향을 미칩니다 : OP와 마찬가지로 반송 주소를 나타냅니다. 올바른 명령문은 호출/리턴 쌍이 스택에 영향을 미치지 않는다는 것입니다 (호출자가'ret imm16'을 사용하는 호출 수신자 대신 args를 팝하는 호출 규칙을 가정 할 때) –

답변

8

반환 주소 바로 위의 포인터이거나 ret에 의해 암시 적으로 변경된 esp 값입니까? 단지 retret N :

ret의 두 가지 형태가있다. 첫 번째 양식은 단순히 eip를 팝하며 (스택에서 eip를 받고 esp, 4를 추가 함) 스택에서 실행을 계속하므로 esp는 함수를 호출 할 때 마지막 매개 변수를 가리 킵니다. 이는 호출자가 다음을 처리해야 함을 의미합니다. 그 다음에 add esp, N.

ret N은 eip를 팝핑 한 후 esp가 동일한 명령어에서 값 N으로 추가되므로 호출자가이를 수행 할 필요가 없음을 의미합니다. 단점은 변수 수를 사용할 수 없다는 것입니다. 'N'은 상수 값일 수 있기 때문입니다.

+0

이것은 아주 좋은 답변입니다. – fuz

2

esp는 더 헛소리 사이에 무슨 일이 있었없는 경우는 해당 call 직전했다 동일한 값을 포함해야합니다. call 명령어는 스택에 반환 값을 푸시합니다. ret 명령어는 스택에 반환 값을 푸시합니다. 네, 당신의 직관이 옳습니다.

1

ret가 끝나면 sp는 함수 호출이 발생한 지점과 동일해야합니다.

마지막으로 스택에 푸시 된 항목을 가리 킵니다.