본문 바로가기

Hardware/assembly language

5장(프로시저)

6판에서는 5장 처음에 라이브러리가 나오지만 7판에서는 바로 스택이 나온다.

스택 연산

스택은 LIFO 구조라고도 부른다.

스택은 스택 포인터 레지스터라고 하는 ESP 레지스터를 사용하여 CPU가 직접 관리하는 메모리 배열이다.

ESP 레지스터는 스택에 있는 어떤 위치에 대한 32비트 오프셋을 저장한다.

ESP는 항상 스택의 맨 위에 추가된, 즉 PUSH 된 마지막 정수를 가리킨다.

Push 연산 32비트 Push 연산은 스택 포인터를 4씩 감소시키고 값을 스택 포인터가 가리키는 스택 위치로 복사한다.

16비트면 2씩 감소하겠네

POP 연산

POP 연산은 스택에서 값을 제거한다.

값이 스택에서 팝된 후에 스택 포인터는 스택의 그 다음 높은 주소를 가리키도록 증가된다

PUSHFDE와 POPFD 명령어

PUSHFD 명령어는 32비트 EFLAGS 레지스터를 푸쉬하고 POPFD는 TMXORDMF EFLAGS로 팝한다.

( EFLAG는 상태,제어,시스템플래그) MOV 명령어는 플래그를 변수로 복사하기 위해서 사용될 수 없으며, 그래서 PUSHFD가 플래그를 저장하는 가장 좋은 방법일 것이다.

나중에 플래그를 이전 값으로 복원 할 수 있도록 플래그를 복사하여 백업하는 것이 유용할 때가 있다.

플래그를 변수로 복사하는 예제

플래그 복원 예제

PUSHAD, PUSHA,POPAD,POPA

PUSHAD는 스택에 모든 범용 레지스터를 PUSH 한다.

POPAD는 스택에 모든 범용 레지스터를 POP 한다.

여기서 가장 중요한 예외가 있는데 하나 이상의 레지스터에 결과를 반환 하는 프로시저는 PUSHA와 PUSHAD를 사용하지 않아야 한다

IAR Compiler.

(LR = 함수 시작 주소)

CPU 뿐만 아니라 MCU 에서도 똑같음 offset +428 Data는 main 복귀 주소, 레지스터를 PUSH 한 상태에서 offset +412 Data는

Read_value 함수 주소.

Disassembly를 보면 +408~400 offset 주소는 R4-R6값을 PUSH한 값이고 SP 에서 0x190을 SUB 한 이유는 Stack[100] 이 들

어갈 만큼 400Byte를 미리 빼놓음.

'Hardware > assembly language' 카테고리의 다른 글

4장(데이터 전송, 주소지정과 산술연산)  (0) 2019.12.22
3장(어셈블리 언어의 기초)  (0) 2019.12.22
2장(x86 프로세서 구조)  (0) 2019.12.22
1장(기본 개념)  (0) 2019.12.22