레지스터란 CPU 내에서 데이터를 일시적으로 저장하는 작고 빠른 저장 장소(기억 장치)로 다양한 종류가 있다.
범용레지스터
먼저 레시스터들 중 범용레지스터란 말 그대로 용도를 특별히 정해두지않고 다양하게 쓸 수 있는 레지스터를 뜻한다.
범용레지스터에는 8개(x64 에서는 16개)의 종류가 있고 운영체제에 따라 이름이 조금씩 변하는데
16bit일 경우 : ax,bx,cx,dx ~
32bit일 경우 : eax,ebx,ecx,edx ~
64bit일 경우 : rax,rbx,rcx,rdx ~
이런식으로 표기하게 된다. x64의 구조로 레지스터들의 역할을 알아보겠다.
rax : 함수가 실행된 후 리턴값을 저장합니다. → 반환되기 전까지 범용 레지스터로 자유롭게 사용된다.
rcx,rdx,r8,r9 : 범용 레지스터들 중 함수가 실행될때 필요한 인자들을 저장하는 용도로 사용하는 레지스터들을 함수 호출 규약이라고 하는데 이들이 x64의 함수 호출 규약들이다. 이들은 함수를 호출할때 필요한 인자들을 rcx,rdx,r8,r9 순으로 저장한다. → rax 와 같이 본 목적으로 사용되지 않을땐 범용 레지스터로 자유롭게 사용된다.
rsp : 다른 범용 레지스터들과는 달리 용도가 정해져 있는 특별한 레지스터로 함수의 저장공간인 스택의 가장 위쪽 주소를 가리키는 스택 포인터 이다. → push,pop 명령어로 rsp 값을 8bit 씩 움직이면서 스택프레임의 크기를 변경하는 역할을 한다.
인덱스 레지스터
rsi : 데이터를 복사할때 복사할 데이터의 주소가 저장된다.
rdi : 데이터를 복사할 때 복사된 dest 데이터(dest : 데이터가 복사될 곳을 가리키는 포인터)의 주소가 저장된다.
포인터 레지스터
범용레지스터에도 포함되었던 rsp 가 있고 다른 레지스터로는 rbp 가 있다.
rbp : 함수 호출시 스택프레임이 형성 되는데 스택프레임의 시작 지점 주소를 저장한다.
rip : 명령어 포인터로써 다음에 실행될 명령어가 위치한 주소를 가리키고 있다. → 프로그램의 실행 흐름과 관련된 중요한 레지스터이다.
상태 레지스터
FLAGS : 이름에 맞게 현재 상태나 조건을 연산 결과에 따라 0 과 1로 나타내는 레지스터이다. 여러 종류가 있는데 몇가지만 알아보자면
→ CF : 산술연산 등의 연산이 일어났을때 자리올림이 생기는 경우 CF 의 값이 1이 된다. 부호가 없는 연산이다.
ZF : 연산의 결과가 0일때 ZF는 1이 된다.
SF: CF 와 다르게 부호가 있는 연산에서 쓰이며 양수인지 음수인지를 가리킨다. 양수일때 0, 음수일때 1
OF: 부호가 있는 연산에서 CF의 역할을 한다.
세그먼트 레지스터
세그먼트 레지스터는 보호모드(운영체제와 하드웨어 부분을 kernel 이라 지칭하고 사용자가 접근하지 못하게 함)에서 세그먼트 서술자 테이블에 대한 포인터를 가진다.
따라서 미리 할당된 메모리의 영역에 대한 시작 주소로 사용된다.
세가지가 있는데 SS,DS,CS가 있다.
'시스템' 카테고리의 다른 글
중앙처리장치- CPU 실행주기 (0) | 2022.01.19 |
---|---|
중앙처리장치-정의,구성 (0) | 2022.01.19 |
리눅스 기본 명령어1 (0) | 2021.12.06 |
어셈블리 스택프레임 (0) | 2021.11.07 |