확인하기~!
============================== 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위치>
| 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 | 메모리 주소 | ||
| 0x400570 |
<이전 rsp위치 | 0x7fffffffdd38 0x7fffffffdd30 |
|
| |
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 | 메모리 주소 | ||
| 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 | 메모리 주소 | ||
| 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 | 메모리 주소 | ||
| 0x400570 |
| 0x7fffffffdd38 0x7fffffffdd30 |
숫자 3 (언제지워질지 모르는값) | | 0x7fffffffdd28 | |
<rsp | 0x7fffffffdd20 |
eax 레지스터의 값을 -> edi 레지스터에 복사하여 넣는다 (연산을 위해 임시저장하는 공간)
'C언어 기초 > 02주차' 카테고리의 다른 글
배열 선언하기, 사용해보기 (0) | 2017.02.07 |
---|---|
x32 x64 어셈블리 실행시 메모리 사용 .. 01_셋팅하기 (0) | 2017.02.03 |