x86 assembly quiz 3번 풀다가 막혀서 질문드립니다.
강의같은 경우에는 stack이라고 써놨는데 문제에서는 memory라고 쓰여있어서 이게 스택인지 메모리인지 헷갈립니다.
또 mov QWORD PTR [rbp-0x8],rdi에서 왜 [rbp-0x8]이 0x400500이 되는지 모르겠습니다.(왜 rbp가 0x400508인지).스택이 아래로 자란다는 건 알고 있는데 main함수 이후로도 rbp가 0x400508인가요?
[Code]
main:
push rbp //이 부분에서 rbp가 0x400508인지?
mov rbp, rsp
mov esi, 0xf
mov rdi, 0x400500
call 0x400497 <write_n>
mov eax, 0x0
pop rbp
ret
write_n:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-0x8],rdi
mov DWORD PTR [rbp-0xc],esi
xor rdx, rdx
mov edx, DWORD PTR [rbp-0xc]
mov rsi,QWORD PTR [rbp-0x8]
mov rdi, 0x1
mov rax, 0x1
syscall
pop rbp
ret
==================================
[Memory] // 이 부분이 스택을 의미하는 부분인가요?
0x400500 | 0x3037207964343372
0x400508 | 0x003f367562336420
안녕하세요.
Q1. 강의같은 경우에는 stack이라고 써놨는데 문제에서는 memory라고 쓰여있어서 이게 스택인지 메모리인지 헷갈립니다.
A1. 우선, stack은 memory에 포함되어 있습니다.
더 자세한 설명은 이 강좌에서 진행하고 있습니다.
Background: Linux Memory Layout
Q2. mov QWORD PTR [rbp-0x8],rdi에서 왜 [rbp-0x8]이 0x400500이 되는지 모르겠습니다.(왜 rbp가 0x400508인지).
A2. 함수의 인자 전달 과정입니다. 이는 함수 호출 규약(calling convention)으로 규정하고 있습니다.
함수 호출 규약(calling convention)에 대해서는 이후 강의에서 만나실 수 있으며,
현재는 "함수 간 인자 전달을 위해 어떠한 규칙이 있다" 까지만 알아두시면 됩니다.
현재 main 함수에서 mov rdi, 0x400500
를 함으로서 rdi에 0x400500을 저장하고 있고,
write_n 함수에서 mov QWORD PTR [rbp-0x8],rdi
를 함으로서 rbp-0x8 가 가리키는 값을 rdi에 저장된 0x400500로 정하고 있습니다.
rbp를 0x400508로 정한다는 의미가 아님으로 알고 있습니다.
더 자세한 설명은 이 강좌에서 진행하고 있습니다.
x86 Assembly🤖: Essential Part(1) > x86-64 어셈블리 명령어 / Opcode: 데이터 이동
Q3. 스택이 아래로 자란다는 건 알고 있는데 main함수 이후로도 rbp가 0x400508인가요?
A3. A2에서 이미 답변하였습니다.
또한, 스택이 아래로 자란다고 외운다기보다 낮은 주소를 향해 확장된다고 외우는게 더 좋다는 의견입니다.
Background: Linux Memory Layout > 리눅스 프로세스의 메모리 구조 / 스택 세그먼트
Q4. 이 부분에서 rbp가 0x400508인지?
A4. 아닙니다.
Q5. 이 부분이 스택을 의미하는 부분인가요?
A5. A1에서 이미 답변하였습니다.
도움이 되었길 바랍니다.