어셈블리어-(3)

2022. 12. 12. 22:42리눅스

728x90

<IA32 Stack>

  • 메모리의 스택은 거꾸로 뒤집혀진 스택
  • 위에서 아래로 쌓임
  • 스택이 늘어난다는 건 아래로 증가한다는 것
  • 스택 포인터는 탑을 가리키고 있다.
  • 위로 갈수록 번지수 증가

<pushing/popping>

pushl %edx // %edx의 값을 스택에 푸쉬-> 스택 4바이트만큼 늘어남-> %esp 메모리번지 4만큼 감소

popl %edx // %edx에 탑의 값 저장-> 스택 4바이트만큼 감소 ->%esp메모리번지 4만큼 증가

<함수 실행 플로우>

* call foo  // 리턴 주소를 스택에 푸쉬 후 foo라는 함수 위치로 점프(코드 실행)

->pushl %eip, jump to foo

*리턴 주소값: 다음 명령어의 주소값 

* ret: 리턴 주소를 스택에서 pop하고 , 그 리턴 주소로 점프(다음 명령어로 이동)

* %eip: 다음에 실행할 명령어의 위치(리턴 주소)를 가지고 있는 레지스터

* call chain : 

*stack Frame(스택 프레임)

스택 프레임 안에: 

Set-up code(함수호출 시작하면 스택 초기화하는 코드)

Finish code(끝나면 스택 할당한거 끝내는 함수)

포인터:

Stack pointer: 현재 호출되는 함수 스택의 탑을 가리키는 포인터 %esp

Frame pointer: 현재 프레임의 시작을 가리키는 포인터(스택의 바텀을 가리키고 있다. %ebp)

->함수가 시작되면 스택프레임이 생기고  종료되면 삭제된다

 

<linux stack Frame>

현재 스택 프레임에 들어있는 것들:

함수에 관한 마라미터들

지역 변수

레지스터들

caller의 프레임 포인터caller 스택 프레임에 들어있는 것들:리턴 주소 콜에 대한 인자들

*old %ebp: caller의 프레임포인터 저장

728x90

'리눅스' 카테고리의 다른 글

어셈블리어 -(2)  (0) 2022.12.12
어셈블리어 -1  (0) 2022.12.12
(리눅스) Makefile  (0) 2022.11.29
gdb 명령어 모음  (0) 2022.11.28
디버깅  (0) 2022.11.26