구조체와 일반 지역변수 스택 저장 순서 차이

you88311의 이미지

안녕하세요 공부하다 궁금한점이 생겨 질문 올립니다.
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로 쌓이는 것을 알 수 있습니다.

왜 이러한 스택 저장순서 차이가 발생하는지 그 이유를 알고싶습니다.
감사합니다.

twinwings의 이미지

[어셈블리 잘 모릅니다. 의견을 공유하고 싶어 적으니 틀린점에 대해 의견 주시면 감사하겠습니다.]

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의 역순 혹은 그 반대)에 따라서 달라질 수 있는게 아닌가 합니다.

you88311의 이미지

답변 감사합니다.

일단 스택에 올라간 순서 자체는 확실히 다른 것 같습니다.
어셈블리로 보나 gdb를 통해 스택을 보나

지역변수는 100 'B' 'A' ebp 순으로
구조체는 'A' 'B' 100 ebp 순으로

스택에 저장되어 있습니다.

아무리 찾아봐도 구조체는 대부분이 변수 크기가 변환되는 것과 관련된 자료가 많고 이러한 순서와 관련된 자료는
없어 궁금하네요.

익명 사용자의 이미지

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.