ESP - Stack pointer register


ESP 레지스터 : 스택의 크기를 조정할 때 사용되는 레지스터. 스택의 최상단 주소값을 가진다.

 -> 스택의 크기를 나타냄


Intel CPU에서는 스택이 거꾸로 자란다.


ESP는 다음 번 DATA를 PUSH할 위치가 아닌, 다음에 POP 했을 때 뽑아낼 데이터의 위치를 가리킨다.

 -> std::stack::top()의 주소라고 생각하면 될듯.


어셈블리에서 esp에 PUSH를 하면 esp 값이 n감소한다.


 n? : msvc 2017 기준, 0C0h(192) 감소한다. 밑의 디스어셈블리 참고


감소하는 이유는 다음과 같다. 높은주소 → 낮은주소


EBP - Base pointer register


EBP 레지스터 : 스택프레임 형태로 저장된 함수의 지역변수, 전달 인자를 참조 & 값의 수정 시 사용되는 레지스터.


현재 스택의 가장 바닥을 가리키는 포인터.


새로운 함수 B가 호출되면, EBP 레지스터 값은 지금까지 사용했던 스택 A의 위를 가리킨다. 그리고 새로운 스택(함수 공간)이 시작


따라서 EBP는 새로운 함수가 호출되거나, 현재 실행중인 함수가 종료되면 값이 달라진다.


새로운 함수를 호출할 때, EBP 레지스터 값

전달 인자를 ESP 레지스터로 참조할 수는 있지만 어셈블리 코드 유지가 힘들다.


EBP는 고정적이지만 ESP는 명령을 수행 시 값이 변하기 때문에 매번 수정해주어야 하기 때문.




00E85720 push ebp : 이전 스택의 베이스 주소(따로 첨부는 안했지만 main함수였음)를 저장


00E85721 mov ebp, esp  : 현재 스택의 꼭대기(esp)를 새로운 스택의 base(ebp)로 복사

(새로운 스택의 시작)


그 밑에도 뭐가 주루룩 있지만 일단 여기까지만



기본적인 레지스터 종류


일반 레지스터

EAX, EBX, ECX, EDX


일반주소 레지스터

ESP, EBP, ESI, EDI


그 외 레지스터

EIP



EAX (Extended Accumulator Register)

 - 산술, 논리연산


산술, 논리연산의 중심이 되는 레지스터

주로 이 레지스터를 사용해 산술, 논리 연산을 수행


함수의 리턴 값을 저장하는 레지스터다.

(그렇기 때문에 리턴값이 2개 이상이 될 수 없다.)


EBX (Extended? Base Register)

 - 간접 주소 지정


간접 주소 지정 시 사용된다.

ebx 1000

jmp 1000 //직접 지정

jmp ebx // 간접 지정


int a[5] 에서 배열의 메모리 접근 시 a[2]를 사용되는 0 ~ 4, 이러한 인덱스 넘버가 바로 간접 번지이다.

 - a의 3번째 주소에 접근해라!


ECX (Extended? Count Register)

 - 반복 카운터


루프와 같은 명령의 반복 수행이 필요할 때 반복 횟수 지정에 주로 사용, (whilefor과 다르다. 어셈블리를 위한 반복이다)


ex) ECX에 5를 넣었을 때, ECX 값이 0이 될 때까지 반복한다. ECX 값은 감소한다.


EDX (Extended? Data Register)

 - EAX를 도와주는 역할


아 귀찮다. 나중에 더 필요하면 공부함

'프로그래밍' 카테고리의 다른 글

클린 코드(미완)  (0) 2023.03.01
COM  (0) 2020.11.06
XML, XML DOM  (0) 2020.11.06
FSM  (0) 2019.07.24
더블과 플로트, FPU에 관해 (6 / 2)  (0) 2019.06.09

+ Recent posts