[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이 오나요?
여기서 8바이트는 64비트 시스템에서 메모리에 데이터를 한 번에 읽고 쓸 수 있는 크기를 의미합니다.
"메모리는 한 주소당 8바이트의 공간이 있다"는 것은 여기서 나온 말입니다.
다만, 실제 메모리 주소는 연속적이기 때문에 각 명령어의 크기만큼 떨어져 있습니다.
마지막 두 개의 줄은 leave가 1바이트의 공간을 차지하는 명령어 이기 때문에 1바이트 차이가 나는 것입니다.
말씀하신 부분은 코드 영역이고, 8바이트씩 움직이는건 스택 영역입니다.
코드영역에서는 '코드 뭉치' 만큼 움직입니다.
즉
0x400000 | call 0x401000
0x400005 | mov esi, eax
에서 call 0x401000의 코드 뭉치는 5바이트 입니다.
쉽게 다음 코드의 주소와 현 코드를 빼면 됩니다 ㅎㅎ 자세하게 어떤 구조인지는 opcode table을 참고하시면 좋을 것 같습니다
올리디버거에 보시면
주소 | 기계어 | 어셈블리어로 나눠져 있습니다.
0x400000 | E8 CF0D0000 | call 0x401000
0x400005 | 8BF0 |mov esi, eax
0x400000에서 기계어(E8 CF0D0000이 5바이트)만큼 이동하면
다음 주소 0x400005가 됩니다.
물론 0x400005에서 8BF0(2바이트) 이동하면 0x400007 이겠죠