메모리 스택 구현

푸시 작업에 'DB' 또는 'DA'를 사용하는 옵션(팝 작업에는 'IA' 또는 'IB')을 사용하는 옵션은 스택이 구현되는 방식에 따라 다릅니다.

•full stack: sp가 가리키는 주소가 이미 사용 중입니다.

•empty stack : sp가 가리키는 주소는 여전히 비어 있습니다.

•Descending: 메모리 주소에서 스택이 작아집니다.

•Ascending: 메모리 주소에서 스택이 증가합니다.

스택별 지침

스택 작업을 처리할 때 잘못된 유형의 STM 및 LDM 명령어 사용을 방지하려면

• 다른 스택 구현과 일치시키기 위해 특수 접미사가 대신 사용됩니다.

•FD: 완전 내림차순 스택의 경우

•FA: 완전 오름차순 스택의 경우

•ED: 빈 내림차순 스택의 경우

•EA: 빈 오름차순 스택의 경우

예시:

완전 내림차순 스택을 사용하는 ARM 프로세서의 경우 스택 명령어 쌍은 STMFD 및 LDMFD입니다.

스택 작업

•스택은 일반적으로 메모리에서 감소합니다.

– 마지막 "푸시된" 값은 가장 낮은 주소에 있습니다.

•ARM은 오름차순 스택도 지원합니다.

– 스택 구조는 메모리를 통해 성장합니다.

• 스택 포인터의 값은 다음 중 하나일 수 있습니다.

– 마지막으로 점유된 주소를 가리킵니다(전체 스택).

• 사전 감소 필요(즉, 푸시 전)

-다음 점유 주소를 가리킴(빈 스택)

• 사후 감소 필요(즉, 푸시 후)

• 사용할 스택 유형은 명령어의 접미사로 지정됩니다.

– STMFD / LDMFD : 전체 내림차순 스택

– STMFA / LDMFA : 전체 오름차순 스택.

– STMED / LDMED : 빈 내림차순 스택

– STMEA / LDMEA : 빈 오름차순 스택

• ARM 컴파일러는 항상 전체 내림차순 스택을 사용합니다.

Cortex-M3 Architecture는 ARM 계열로서 FD 방식

* 프로세스에서 스택 사용 방식은 전체 내림차순(Full-Descending) 방식 사용

Stack 포인터는 메모리에서 마지막 주소를 갖고 시작합니다.(Stack Pointer holds the address of the last stacked item in memory.)

Stack 메모리에 데이터가 저장이 될때 Full-Descending 에서 Full 이라는 것은 Stack 동작이 끝나고 났을때 항상 SP는 유효한 데이터를 가르키고 있다는 것이고 Descending 이라는 것은 높은 주소에서 낮은 주소로 주소가 감소 하면서 데이터가 저장이 되는 방식입니다.

Stack PUSH 동작이 끝났을때 SP가 유효한 데이터를 가르키고 있으려면 데이터를 PUSH 하기 전에 먼저 SP의 주소를 4Byte 감소시키고 나서 데이터를 저장 해야 합니다.

반대로 POP 동작에서는 데이터를 먼저 꺼내고 나서 SP의 주소를 4Byte 증가 시켜야 합니다.

PUSH, POP 동작을 그림으로 예를 들어 보겠습니다.

- PUSH Operation

- POP Operation

위의 그림에서 POP 동작이 끝난 이후에도 RAM STACK영역에는 데이터가 그대로 남아 있습니다. POP을 했다고 해서 메모리에서 데이터가 사라지는 것은 아니고 단지 SP 만이 변경된다는 사실을 알 수 있습니다.

결론적으로

문제) 8비트 마이크로 프로세스에 스택 포인터가 500번지 가리킨다. 3바이트 push 후 스택 포인터 값은 얼마인가? 답 : 497

(단, 8비트 마이크로 프로세스는 ARM 계열 또는 스택 구조가 Full-Descending 방식이라는

전제 조건)