[Register]
rip = 0x400000
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x0
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000 <= rip
0x400005 | mov esi, eax
...
0x401000 | push rbp
에서 궁금한 것이 있습니다.
1)rsp가 스택의 탑을 가리키는 것이라 알고있는데 왜 저기서는 탑(0x7fffffffc3f8)을 안 가리키는지
2)push만 했는데 왜 rsp가 가리키는 것이 달라지는지, 왜 push인데 쌓이는 데이터가 없는지
3)저기서의 mov는 왜 쓴건지
이해를 못하겠네요... 도와주시면 감사하겠습니다 제발...
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret <= rip
프로시저 ret 설명에서 [Code] 부분 질문드립니다.
위의 코드의 첫번째와 두번째줄의 메모리주소를 보시면 0x400000 다음 0x400005이 나오는데 메모리는 한 주소당 8바이트의 공간이 있기 때문에 0x400000 다음에는 0x400008이 와야 되는거 아닌가용? 그리고 마지막 두개의 줄은 왜 0x401007 다음 0x401008이 오나요?
[Memory]
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420
만약 위와 같은 주소에 값이 있고 이 값을 1바이트씩 나눠보면
0x400500 | 0x72
0x400501 | 0x33
0x400502 | 0x34
.
.
0x400507 | 0x30
0x400508 | 0x20
.
.
.
0x40050f | 0x00
이런 식으로 이해하는 것이 맞을까요?
```
0x401000: push rbp
0x401001: mov rbp, rsp
0x401004: sub rsp, 0x30
0x401008: mov BYTE PTR[rsp], 0x3
...
0x401020: leave
0x401021: ret
```
"스택 프레임의 할당과 해제" 예시 코드에서 x64면 데이터 처리 단위가 64비트 = 8바이트 잖아요. 메모리 주소 단위가 바이트니까 코드 주소 0x401000다음 0x401001이 아니고 0x401008여야 하지 않나요?


push 할 때, 왜 rsp -=8 인지 궁금합니다.
스택 최상단에 쌓는 것이니 rsp += 8 인 것아닌가요...?
그리고 앞선 강의에서 "메모리 피연산자는 []에 둘러싸여 표현된다" 라고 배웠는데, 이게 정확히 무슨 뜻인지 모르겠습니다...
[rsp] = val 라는 예시를 기준으로, rsp가 가리키는 주소에 있는 값을 val을 대입해주는 건가요?