2014-07-09 1 views
1

저는 x86 스택과 CDECL 규칙을 읽고 혼란스러워하는 것을 읽었습니다.% esp와 CDECL 증가시키기

나열된 호출자의 책임 중에서 매개 변수를 사용하거나 매개 변수를 사용하여 매개 변수를 가져 오거나 단순히 % esp를 증가시켜 매개 변수를 제거했습니다.

마지막 파트는 어떻게 작동합니까?

예를 들어 % esp의 초기 값이 0x105000이고 현재 스택 프레임에 대해 $ 0x1c만큼 감소한다고 가정합니다. 일부 데이터를 할당 한 다음 다시 증가 시키십시오.이 경우 데이터가 여전히 메모리에 떠 다니는 것이 아닙니까? 기억은 어떻게 지워 집니까? 0x104FF4에 액세스하면 세그먼테이션 오류가 발생하며 그럴 경우 데이터가 지워졌습니까?

+0

"맑은"기억은 어떻게 느껴 집니까? 당신은 어떻게 기억을 통해 "부유"합니까? –

+0

Ehm, 'clear'에 의해, 나는 그 값이 심지어 존재한다면, 방금 튀어 나온 스택 프레임의 다른 값으로 설정되기 전에 보유한 기본값으로 돌아 가기 위해 사용 된 바이트를 의미한다고 생각합니다. 그리고 'float'은 팝 된 프레임에 설정된 값을 유지하기위한 바이트를 의미했습니다. – user8814

+0

미안하지만별로 의미가 없으면 스택의 작동 방식과 힙과의 차이점을 파악하려고합니다. C에서 할당 된 구조를 해제하는 것과 비슷한 방식으로 스택을 해제해야하는지 여부를 혼란스러워했습니다. 각 요소는 먼저, 그 다음 전체 구조가됩니다. 또는 OS가 당신을 위해 그것을했는지 여부; 또는 당신이 전혀 그것을 해방 할 필요가 없는지. – user8814

답변

4

POP는 데이터를 레지스터로 이동시키고 스택 포인터를 조정합니다. 데이터를 지우거나 다른 부작용이 없습니다.

데이터를 레지스터로 다시 옮길 필요가없는 경우 스택 포인터를 ADD로 조정하면 필요한 작업 만 수행하면됩니다. 스택 포인터를 원할 때 어디서나 가져올 수 있습니다. 단, POP 명령어로 레지스터를 긁지 않아도됩니다.

잠재적으로 더 효율적입니다. 좀 더 느려지거나 코드가 커질 수있는 일련의 POP가 아니라 하나의 ADD 명령어 만 필요합니다.

데이터는 여전히 메모리에 있지만 데이터를 스택으로 푸시하면 덮어 쓰기됩니다.

+0

정말 고마워요! 데이터를 덮어 쓰지 않으면 액세스 할 수 있습니까? – user8814

+0

예, 정확하게. 아마도 추천 된 활동은 아니지만. – JCx