STACK은 history 기능, 뭔가를 쌓는 구조의 Memory 영역, LIFO, 마지막에 집어넣은 Data가 가장 처음으로 나오는 Data
push는 stack에 자료를 집어넣는 용어, pop은 stack에서 자료를 빼는 것
어떻게 채워지느냐, 보통 Stack은 높은 주소에서 낮은 주소로 쌓아감.
Stack이 자라는 방향이 높은 주소로 자라는 것은 Ascending, 낮은 주소로 자라는 것은 Descending stack으로 분류
현재 stack pointer가 방금 push나 pop을 한 data를 포함하면 Full, 아니면 empty로 분류
stack pointer가 data를 넣은 후 변하느냐 아니면 먼저 변하고 sp가 먼저 변하느냐에 따라 After와 Before로 분류
stack에는 multiple register transfer addressing 명령어를 이용하여 push/pop
ST는 store = push, LD는 load = pop, M은 Multiple이라는 의미로 다 포함
IB는 Increase Before로서 sp를 data를 넣기 전에 증가 시킨다
IA는 Increase After로서 sp를 datas를 넣고 난 후에 증가 시킨다
DB는 Decrease Before로서 sp를 data에 넣기 전에 감소 시킨다
DA는 Decrease After로서 sp를 data 넣고 난 후에 감소
명령어 r9!, {r0, r1, r5} : R9가 가리키는 곳에 R0, R1, R5를 넣고 넣은 개수 3개 만큼 R9을 update하라는 의미
서브 루틴 호출 시 수행되는 일
1. 전달 인자와 돌아갈 주소를 스택에 push
2. 함수 호출(즉, pc를 불리워진 함수의 주소로 jump 시킴
3. 지역변수에 대하여 스택에 공간을 할당하는 일)
4. 호출된 함수를 수행하는 일
5. stack에서 부터 할당된 지역변수 저장고간의 해제
6. 돌아갈 주소를 stack으로부터 꺼내와 함수로부터의 복귀
7. 전달인자에 의해 사용되던 공간을 해제
Linked Register를 이용해서(R14), Branch하기 전에 돌아올 주소를 R1에 넣어두고 복귀할 때 R14를 pc에 넣고 돌아오는 mechanism 이용
'개발' 카테고리의 다른 글
Simple AMP: Zynq SoC Cortex-A9 Bare-MetalSystem with MicroBlaze Processor (0) | 2020.01.16 |
---|---|
tvm (0) | 2019.12.21 |
어셈블리어 (0) | 2019.12.17 |
AArch64 generic timer (0) | 2019.12.09 |
plot graph color (0) | 2019.10.04 |