스택은 데이터를 저장하고 이해하는데 중요한 부분이다.
아래 그림을 참고해보자
딩굴딩굴고양이
스택 프레임
함수를 호출하고 종료함에 따라 쌓였다 제거됐다 한다. 중요한건 높은주소에서 낮은 주소 방향으로 쌓인다는 것이다.
doorbals_512.log

rip는 주황색 줄을 의미한다 : 다음 실행될 위치
rsp 는 현재 스택 top의 위치를 의미하고
rbp 는 현재 스택의 상대주소 계산을 위해 사용한다
보면 push가 완료된 이후 rsp는 스택 프레임의 가장 윗줄로 이동해 top 을 가리키고 있고 rbp는 처음 그대로의 주소를 가리키고 있다. rbp를 통해서 주소를 찾고 rsp를 통해서 위치를 찾아 값을 push하는 것으로 볼 수 있다.
여기서는 register에 저장하는 부분이 없기때문에 push가 완료됐어도 register - rax, rbx, rcx에는 변화가 없다. 하지만 pop을 통해 rax, rbx, rcx 에 값을 넣기 때문에 pop 완료후에 값이 변한 것을 볼수 있다.
하지만 메모리에는 변화가 없다. 그리고
rsp도 다시 돌아온 것을 볼 수 있다.
; 스택 메모리, 스택 프레임
; 레지스터는 다양한 용도로 사용된다
; - a b c d 범용 레지스터
; - 포인터 레지스터 (포인터 = 위치를 가리키는~)
; -- ip (Instruction Pointer) : 다음 수행 명령어의 위치
; -- sp (Stack Pointer) : 현재 스택 top 위치 (일종의 cursor)
; -- bp (Base Pointer) : 스택 상대주소 계산용
push 5
push 2
call MAX
PRINT_DEC 8, rax
NEWLINE
add rsp, 16 ; or pop 2번
xor rax, rax
ret
MAX:
push rbp ; 이전 rbp를 기억하기 위해 push
mov rbp, rsp ; rbp에 rsp를 복사 (rsp가 call 한 함수의 rbp가 된다)
mov rax, [rbp + 16]
mov rbx, [rbp + 24]
cmp rax, rbx
jg L1
mov rax, rbx
L1:
pop rbp
ret
push를 통해 값을 넣어줌Max 함수를 호출push rbp 를 통해 이전 rbp를 저장하고mov rbp, rsp를 통해 현재 콜된 함수의 rbp를 Max가 종속된 함수의 rsp 값을 넣어 스택의 위치를 맞춘다. (안그러면 함수 구분 없이 계속 데이터가 추가됐다 빠졌다 혹은 이전 데이터에 영향을 미치게 된다.)mov rax, [rbp + 16] 현재 rbp = 새로운 함수의 base = Max가 종속된 함수의 rsp 에 16을 더하면 == 5 mov rbx, [rbp + 24] 5번과 동일하게 동작하였으나 이미 최고 높은 주소에 들어있는 값은 5이다. 따라서 rbx에 5가 들어간다.L1으로 이동하여 현재 함수의 rbp를 pop 하고 return 된다. - 현재함수를 탈출한다PRINT_DEC 에서 5가 출력add rsp, 16 ; or pop 2번를 동작한다. (push 한 만큼 pop을 하거나 rsp주소를 rbp로 옮기거나) - 안그러면 에러난다
오늘부로 어셈블리는 끝이났다. 어셈블리라기보단 앞서 말한대로 앞으로 코딩을 하면서 필요한 기초를 배웠다.(정글에선 더 깊게 많이 배웠었던게 확실하다 다시 복기를 한 기분이다.) 다음 강의부턴 C++이겠지.. 이제 진짜 시작이다. -끝-