구조체와 일반 지역변수 스택 저장 순서 차이
글쓴이: you88311 / 작성시간: 일, 2018/01/07 - 9:43오후
안녕하세요 공부하다 궁금한점이 생겨 질문 올립니다.
gdb로 확인하던 도중 구조체와 일반 변수의 스택 저장 순서에 차이가 있다는 것을 발견했습니다.
일반적인 지역변수의 경우
#include <stdio.h> int main(void){ char A='A'; char B = 'B'; int C = 100; printf("%c %c %d\n",A,B,C); return 0; }
이를 gdb로 살펴보면
0x80483d6 : mov BYTE PTR [%ebp-1],0x41 //'A'
0x80483da : mov BYTE PTR [%ebp-2],0x42 //'B'
0x80483de : mov DWORD PTR [%ebp-8],0x64 //100
스택에 C B A ebp로 쌓이고
구조체의 경우
#include <stdio.h> typedef struct test { char A; char B; int C; }test; int main() { test Data={'A','B',100}; printf("%c %c %d\n",Data.A,Data.B,Data.C); return 0; }
gdb로 살펴보면
0x80483d6 : mov BYTE PTR [%ebp-8],0x41 //'A'
0x80483da : mov BYTE PTR [%ebp-7],0x42 //'B'
0x80483de : mov DWORD PTR [%ebp-4],0x64 //100
함수의 매개변수 처리방식처럼
스택에 A B C ebp로 쌓이는 것을 알 수 있습니다.
왜 이러한 스택 저장순서 차이가 발생하는지 그 이유를 알고싶습니다.
감사합니다.
Forums:
[어셈블리 잘 모릅니다. 의견을 공유하고 싶어 적으니
[어셈블리 잘 모릅니다. 의견을 공유하고 싶어 적으니 틀린점에 대해 의견 주시면 감사하겠습니다.]
1. C 표준규격상 메모리에 struct를 로드할 때
struct 내의 element 순서는 반드시 시켜야 된다고 알고있습니다.
2.
Case A:
0x80483d6 : mov BYTE PTR [%ebp-1],0x41 //'A'
0x80483da : mov BYTE PTR [%ebp-2],0x42 //'B'
0x80483de : mov DWORD PTR [%ebp-8],0x64 //100
Case B:
0x80483d6 : mov BYTE PTR [%ebp-8],0x41 //'A'
0x80483da : mov BYTE PTR [%ebp-7],0x42 //'B'
0x80483de : mov DWORD PTR [%ebp-4],0x64 //100
변수의 메모리 주소는, 둘다 순서대로 저장된 것 맞는것 같습니다.
레지스터의 순서는, 현재 동작하는 문맥 & 시스템(함수 콜의 arg의 역순 혹은 그 반대)에 따라서 달라질 수 있는게 아닌가 합니다.
답변 감사합니다.
답변 감사합니다.
일단 스택에 올라간 순서 자체는 확실히 다른 것 같습니다.
어셈블리로 보나 gdb를 통해 스택을 보나
지역변수는 100 'B' 'A' ebp 순으로
구조체는 'A' 'B' 100 ebp 순으로
스택에 저장되어 있습니다.
아무리 찾아봐도 구조체는 대부분이 변수 크기가 변환되는 것과 관련된 자료가 많고 이러한 순서와 관련된 자료는
없어 궁금하네요.
https://github.com/hjl-tools
https://github.com/hjl-tools/x86-psABI/wiki/intel386-psABI-1.1.pdf
댓글 달기