stack 쌓는 순서
안녕하세요.
우분투 disas main으로 어셈블리어로 stack 이 어떻게 쌓는지 공부하는 중인데요.
어셈블리어로 연산코드가 mov라서 제 해석이 틀린건가요?
지역변수는 선언한 순서로 Push된다고 이해했는데 실제로 해보니 달라서 질문드립니다. int type으로 정의한 $0x1, -0x30에서 주소가 -0x3a로 멀어져서 이해가 안돼서 질문 드렸습니다.
그 이후 부터는 stack이 하나씩 지워지면서 rbp 포인터로 가까워 지는 모양으로 이해했는데 char 형태에서 오히려 더 밀려나서 주소가 왜 밀린건지 이해가 되지않습니다.
물론 함수 호출이 아닌 변수를 정의한 거지만 결은 비슷할 거라 생각이 들어서 질문 드립니다.
너무 궁금해서 엉뚱한 질문이지만 알려주시면 감사합니다...
Answer 1
1
디스어셈블 코드는 디스어셈블러에 따라 조금씩 다르게 표기 될 수 있습니다. 그러나 지금 질문에서는 신경쓸 주제는 아닌 것 같습니다. 지역변수는 보통 선언한 순서대로 스택에 Push되는 것이 항상 옳은 것은 아닙니다. 일반적인 컴파일러 언어들은 최소 2회 이상 컴파일을 하는데 첫 번째 단계에서 지역변수 목록을 확보하고 소요될 Stack의 량을 계산합니다. 이 때 선언된 순서에 따라 스택 메모리 위치를 지역변수 + 자동변수에게 배치 할 수도 있고 아닐 수도 있습니다. 보통은 선언된 순서대로 스택에 Push되거나 아니면 선언된 순서의 역순으로 Push되는경향이 있습니다.
그리고 소모되는 스택 메모리의 크기는 보통 지역변수의 크기보다 더 큰 값이 할당 됩니다. 메모리 패킹 때문입니다. 이는 구조체 멤버 정렬과 비슷한 원리 입니다.
끝으로 지역변수로 인식되는 함수의 매개변수는 또 다릅니다. 무엇보다 64비트 환경에서는 fastcall 호출 규약이 늘 적용된다고 볼 수 있습니다. 해서 아예 스택에 메모리 공간이 표시되지 않을 수 있습니다.
참고하시기 바랍니다. :)
병행성 제어
0
41
2
질문이 있습니다(강의와 거의 상관이 없는)
0
71
2
컴파일러 서적 질문입니다
0
154
1
코드생성 및 최적화 질문입니다
0
151
1
Hex Editor를 이용한 다국어 번역 관련 질문입니다
0
206
2
큐의 배열을 넘겨도 정상작동합니다
0
155
2
캐너리비트에 관하여 질문
0
207
3
상수화된 문자열에 질문있습니다
0
167
1
함수 호출 매개변수 전달에 대한 질문 드립니다.
0
187
1
단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.
0
203
2
함수호출 규약 종류에 따른 장단점 여부
0
221
2
정적라이브러리 링크 오류
0
221
1
const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의
0
348
2
pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.
0
248
2
비선형 자료구조
0
307
1
자료 구조 공부 후에
0
348
1
강의자료 관련
0
248
1
마지막에 말씀하신 부분 질문드립니다.
0
209
1
문자열 관련 질문 드립니다
0
286
1
라이브러리
0
269
1
부동소수점
0
387
1
왜 변수 주소 사이에 offset이 있는 건가요?
0
297
2
함수호출이랑 쓰레드
0
404
1
리눅스 환경도 스레드 생성 원리는 동일한건가요?
0
522
1

