확인하기~!


============================== Assembly =================================


1. =>  0x0000000000400534 <+0>  : push    %rbp       일 때,


                                                    push 명령어 뒤에 있는 데이터를 밀어넣는다

                                                    push 는 Stack 의 최상위에 을 밀어넣는다

                                                    push 는 sp 레지스터에 데이터를 넣은 주소를 밀어넣는다

                                                    그리고 sp 레지스터는 포인터의 크기만큼 증가한다

                                 [포인터의 크기 - 64 bit 의 경우 8 byte / 32 bit 의 경우 4 byte]


(gdb) p/x $rbp                                  // rbp 또는 ?bp : Stack의 베이스를 나타냄

$1 = 0x400570

(gdb) p/x $rsp

$2 = 0x7fffffffdd38                             // rsp 또는 ?sp : Stack의 최상위를 나타냄


============================== Computer =================================


1. Stack prame 생성(공간할당)

0x7fffffffdd38

 

0x400570 

=>

0x7fffffffdd30

 

 0x400570 

   

 rsp 레지스터

 

 rbp 레지스터

 rsp 레지스터

 

 rbp 레스터

   


                   

 

 Stack

 

메모리 주소

rbp >


 


 


<rsp

0x7fffffffdd38

0x7fffffffdd30 


sp 레지스터의 크기가 8 byte 증가한다 (수치상으로는 감소했음.. 밑으로 자란다 생각하면 됨)

sp 레지스터에 메모리주소를 밀어넣는다

                                                         

                                                  

  

 Stack

 

메모리 주소

  rbp >


 

0x400570



<rsp



0x7fffffffdd30 


rbp의 데이터를 Stack의 최상위 에 밀어넣는다                                 






============================== Assembly =================================


2. =>  0x0000000000400535 <+1>  : mov    %rsp, %rbp     일 때,


                                                  rsp의 값을 rbp에 넣어라

                                                  [mov %a %b] 좌측의 레지스터 정보를 우측 레지스터로 복사한다

                                                                    복사 명령어 이므로, 이동이 X안된다X

(gdb) p $rsp

$3 = 0x400570

(gdb) p $rbp

$4 = 0x400570                             // bp와 sp가 같아짐을 확인


============================== Computer =================================


2. Stack prame 생성(rbp 셋팅 하여, stack 사용할 수 있도록 하는 과정)

0x7fffffffdd30

 

0x400570 

=>

 0x7fffffffdd30

 

0x7fffffffdd30

   

 rsp 레지스터

 

 rbp 레지스터

 rsp 레지스터

 

 rbp 레스터

   



 

 Stack

 메모리 주소

이전 rbp위치>


rbp> 

0x400570

 


 <rsp

0x7fffffffdd38

0x7fffffffdd30 


rsp 의 정보를  rbp 에 넣음

(그러면 rbp 는 이전주소보다 8Byte 확장된 주소공간을 가리키고 있겠네요~!)






============================== Assembly =================================


3. =>      0x0000000000400538 <+4>  : sub     $0x10, %rsp     일 때,


                                                  rsp 에서 0x10 을 빼서 rsp에 넣을 것..

                                                  [sub $0x10 %rsp] subtract의 약자로 뺄셈을 의미한다

                                                                         rsp 에서 0x10 을 뺄셈하겠다는 의미

(gdb) p $rsp

$5 = 0x7fffffffdd20

(gdb) p $rbp

$6 = 0x7fffffffdd30


============================== Computer =================================


3. main함수 사용하기 위한 (임시적인)공간만 할당

0x7fffffffdd30

 

0x7fffffffdd30

=>

 0x7fffffffdd20

 

0x7fffffffdd30

   

 rsp 레지스터

 

 rbp 레지스터

 rsp 레지스터

 

 rbp 레스터

   



 

 Stack

 메모리 주소


rbp> 

0x400570

 


 <이전 rsp위치

0x7fffffffdd38

0x7fffffffdd30 

 

 일단 공간만 할당(쓰레기값)



 <rsp

 

0x7fffffffdd20 


rsp 의 주소값에서 0x10 (즉, 16byte) 를 빼서, 다시 rsp에 넣음으로써, 16 byte의 공간을 확보한다

(rbp는 그대로 유지하고 있군요.. 역시 베이스포인터 답습니다.)






============================== Assembly =================================


4. =>      0x000000000040053c <+8>  : movl    $0x3, -0x8(%rbp)     일 때,


                                                  숫자 3을 .. rbp 로 부터 8byte 공간을 할당한 후, 그 자리에 넣을것..

(gdb) x $rbp-0x8

$7 = 0xffdd28 : 0x00000003                   // 숫자 3이 들어가 있음 확인


============================== Computer =================================


4. 임시공간 -0x8만큼 할당하여 숫자 3을 스택에 넣는다 - 다음 연산을 위한 준비작업

0x7fffffffdd20

 

0x7fffffffdd30

   
   

 rsp 레지스터

 

 rbp 레지스터

      



 

 Stack

 메모리 주소


rbp> 

0x400570

 


 

0x7fffffffdd38

0x7fffffffdd30 

 

 숫자 3

 


0x7fffffffdd28 

 




  <rsp


0x7fffffffdd20 


rbp 의 주소값에서 -0x8만큼 (즉, 8byte) 를 할당한 공간에, 숫자 3이라는 값을 넣음

(여기서 우리는, 변수 선언시 사용하는 이름따위.. 컴퓨터는 관심없고.. 위치정보를 기억하고..

꺼내쓸때는 그 주소를 따라가서.. 있는.. 값을 꺼내씀을... 알 수 있습니다)





============================== Assembly =================================


5. =>        0x0000000000400543 <+15> : mov    -0x8(%rbp), %eax     일 때,


                                             rbp 로부터 8byte 아래의 공간에 저장되어있는 값을 -> eax 레지스터에 넣기

                                              rax 또는 ?ax : 주로 산술 연산에 활용하며 모든 return 값은 ax 레지스터에 저장됨

(gdb) p $eax

$8 = 3                                  // eax 레지스터에 숫자 '3' 복사됨을 확인


============================== Computer =================================


5. 연산을 위해 eax 레지스터에 복사

0x7fffffffdd20

 

0x7fffffffdd30


 숫자 '3'

     

 rsp 레지스터

 

 rbp 레지스터

 eax 레지스터

 
   



 

 Stack

 메모리 주소


rbp> 

0x400570

 


 

0x7fffffffdd38

0x7fffffffdd30 

 

 숫자 3 

 


0x7fffffffdd28 

 




  <rsp


0x7fffffffdd20 


rbp 로 부터 8 byte 아래의 임의공간에 저장되어 있는 값을 -> eax 레지스터에 넣는다

(연산을 위해 연산레지스터로 값을 보내는군요)






============================== Assembly =================================


6. =>        0x0000000000400546 <+18> : mov    %eax, %edi    일 때,


                                             eax 레지스터에 있는 값을 -> edi 레지스터에 복사하기

                                              edi : temp 와 같이 임시저장 레지스터

(gdb) p $edi

$9 = 3                                  // edi 레지스터에 숫자 '3' 복사됨을 확인


============================== Computer =================================


6. 연산을 위해 edi 레지스터에 임시저장

0x7fffffffdd20

 

0x7fffffffdd30


 숫자 '3'

 

  숫자 '3'

   

 rsp 레지스터

 

 rbp 레지스터

 eax 레지스터

 

 edi 레지스터

   



 

 Stack

 메모리 주소


rbp> 

0x400570

 


 

0x7fffffffdd38

0x7fffffffdd30 

 

 숫자 3 

(언제지워질지 모르는값)

 


0x7fffffffdd28 

 




  <rsp


0x7fffffffdd20 


eax 레지스터의 값을 -> edi 레지스터에 복사하여 넣는다 (연산을 위해 임시저장하는 공간)

(연산 레지스터 말고도.. 임시저장하는 레지스터도 있군요..)


+ Recent posts