Assembly - 스택, 프로시저 명령어

이쑤신개자두·2023년 6월 17일
0

어셈블리어

목록 보기
3/6

참고! 매우 어려움

스택 명령어

1. push A

A를 스택 최상단에 쌓음

[Register]
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc400 | 0x0 <= rsp
0x7fffffffc408 | 0x0
[Code]
push 0x31337
.
.
.
[Register]
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x31337 <= rsp
0x7fffffffc400 | 0x0
0x7fffffffc408 | 0x0

2. pop A

스택 최상단의 값을 꺼내서 A에 대입

[Register]
rax = 0
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x31337 <= rsp
0x7fffffffc400 | 0x0
0x7fffffffc408 | 0x0
[Code]
pop rax
.
.
.
[Register]
rax = 0x31337
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc400 | 0x0 <= rsp
0x7fffffffc408 | 0x0

프로시저 (Procedure)

  • 특정 기능을 수행하는 코드 조각. (= C언어의 함수)
  • 프로시저를 사용하면 반복되는 연산을 프로시저 호출로 대체할수 있어서 전체 코드의 크기를 줄이고, 기능별로 코드 조각에 이름을 붙일수 있어서 가독성을 크게 높임

호출 (Call)

  • 프로시저를 부르는 행위
  • 프로시저를 호출할때는 프로시저를 실행하고나서 원래 실행 흐름으로 돌아와야 하므로,
  • call 다음의 명령어 주소를 스택에 저장하고 프로시저로 rip를 이동시킴

1. call A

A에 위치한 프로시저 호출

[Register]
rip = 0x400000
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x0
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000 <= rip
0x400005 | mov esi, eax
...
0x401000 | push rbp
.
.
.
[Register]
rip = 0x401000
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005 <= rsp
0x7fffffffc400 | 0x0
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | push rbp <= rip

반환 (Return)

프로시저 코드에서 돌아오는 행위

1. ret

돌아갈 예정이였던 call 다음의 주소로 돌아감

[Register]
rip = 0x401000
rsp = 0x7fffffffc3f8
[Stack]
0x7fffffffc3f8 | 0x400005 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret <= rip
.
.
.
[Register]
rip = 0x400005
rsp = 0x7fffffffc400
[Stack]
0x7fffffffc3f8 | 0x400005
0x7fffffffc400 | 0x0 <= rsp
[Code]
0x400000 | call 0x401000
0x400005 | mov esi, eax <= rip
...
0x401000 | mov rbp, rsp
...
0x401007 | leave
0x401008 | ret

스택프레임

  • 함수별로 자신의 지역변수 또는 연산과정에서 부가적으로 생겨나는 임시 값들을 저장하는 영역
  • 서로 다른 두 함수가 같은 스택 메모리 영역을 사용하려고 하면, 서로 다른 함수의 지역변수들끼리 서로 오염시킬 수 있으므로 정상적인 연산 수행 불가능
  • 서로 다른 함수들의 사용하는 스택의 영역을 구분하기 위해 스택프레임이 사용됨

1. leave

스택프레임 정리

[Register]
rsp = 0x7fffffffc400
rbp = 0x7fffffffc480
[Stack]
0x7fffffffc400 | 0x0 <= rsp
...
0x7fffffffc480 | 0x7fffffffc500 <= rbp
0x7fffffffc488 | 0x31337
[Code]
leave
.
.
.
[Register]
rsp = 0x7fffffffc488
rbp = 0x7fffffffc500
[Stack]
0x7fffffffc400 | 0x0
...
0x7fffffffc480 | 0x7fffffffc500
0x7fffffffc488 | 0x31337 <= rsp
...
0x7fffffffc500 | 0x7fffffffc550 <= rbp
profile
25.04.28 Restart ~ 1일 1포스트 & 1일 1커밋!

0개의 댓글