2022. 12. 12. 22:42ㆍ리눅스
<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의 프레임포인터 저장
'리눅스' 카테고리의 다른 글
| 어셈블리어 -(2) (0) | 2022.12.12 |
|---|---|
| 어셈블리어 -1 (0) | 2022.12.12 |
| (리눅스) Makefile (0) | 2022.11.29 |
| gdb 명령어 모음 (0) | 2022.11.28 |
| 디버깅 (0) | 2022.11.26 |