Assembly Language
레지스터
수색…
비고
레지스터 란 무엇입니까?
프로세서는 숫자 값 (숫자)을 조작 할 수 있지만, 어딘가에 먼저 저장해야합니다. 데이터는 대부분 메모리에 저장되거나 명령어 opcode (보통 메모리에도 저장 됨) 또는 프로세서에 직접 배치 된 특수 온칩 메모리 ( 레지스터 라고 함)에 저장됩니다.
레지스터에서 값을 사용하려면 주소로 주소를 지정할 필요는 없지만 x86의 경우 ax
, Z80의 경우 A
, ARM의 경우 r0
과 같은 특수 니모닉 이름이 사용됩니다.
일부 프로세서는 거의 모든 레지스터가 동등하고 모든 목적 (대개 RISC 프로세서 그룹)에서 사용할 수있는 방식으로 구성되며, 일부 레지스터 만 산술 (초기 CPU의 누산기)에 사용될 수있는 경우 특수한 전문화 기능을 제공합니다 ) 및 메모리 어드레싱을위한 다른 레지스터들 등.
프로세서 칩에서 직접 메모리를 사용하여이 구조 등록을 다시 저장 레지스터로부터 두 숫자를 추가 성능이 크게 의미를 가지고 일반적으로 ARM 프로세서 해당 프로세서 (실시 예에서의 최단 시간 수행된다 : ADD r2,r0,r1
설정 r2
로 (r0 + r1)
값, 단일 프로세서 사이클에서).
반대로 피연산자 중 하나가 메모리 위치를 참조하면 프로세서가 메모리 칩에서 값이 도착할 때까지 기다릴 수 있습니다 (x86에서는 L0 캐시의 값이 0에서 100까지 대기 할 수 있음). 값이 캐시에 없으며 메모리 DRAM 칩에서 직접 읽어야하는 CPU주기).
따라서 프로그래머가 일부 데이터 처리 코드를 작성할 때 대개 처리 중에 모든 데이터를 레지스터에 저장하여 최상의 성능을 얻으려고합니다. 그렇게 할 수 없으며 메모리 읽기 / 쓰기가 필요하면 최소화해야하며 특정 플랫폼의 캐시 / 메모리 아키텍처와 협력하는 패턴을 형성해야합니다.
비트 단위 레지스터의 기본 크기는 종종 Z80 이 "8 비트 프로세서" 이고 80386 이 "32 비트 프로세서"인 프로세서 를 그룹화하는 데 자주 사용됩니다. 그러나 그 그룹화는 거의 명확하지 않습니다. 예를 들어, Z80 은 네이티브 16 비트 값을 구성하는 레지스터 쌍으로도 작동하며, 32 비트 80686 CPU는 기본적으로 64 비트 레지스터로 작업하기위한 MMX 명령어를 가지고 있습니다.
Zilog Z80 레지스터
레지스터 : 8 비트 : A
, B
, C
, D
, E
, H
, L
, F
, I
, R
, 16 비트 : SP
, PC
, IX
, IY
및 일부 8b 레지스터의 그림자 : A'
, B'
, C'
, D'
, E'
, H'
, L'
및 F'
.
대부분의 8 비트 레지스터는 AF
, BC
, DE
및 HL
와 같이 16 비트 레지스터로 쌍으로 사용할 수 있습니다.
SP
는 스택 메모리의 맨 아래를 표시하는 스택 포인터입니다 ( PUSH
/ POP
/ CALL
/ RET
명령어에 사용됨).
PC
는 현재 실행 된 명령을 가리키는 프로그램 카운터 입니다.
I
인터럽트 레지스터 로서 IM 2
인터럽트 모드의 상위 바이트의 벡터 테이블 주소를 제공합니다.
R
은 새로 고침 레지스터 이며 CPU가 opcode (또는 opcode 접두사)를 가져올 때마다 증가합니다.
일부 비공식적 인 명령어가 일부 Z80 프로세서에서 IX
8 비트 부분을 IXH:IXL
및 IY
( IYH:IYL
로 조작하기 위해 존재합니다.
섀도우 변종은 어떤 명령으로도 직접 액세스 할 수 없으며 EX AF,AF'
명령은 AF
와 AF'
사이를 전환하고 EXX
명령은 BC,DE,HL
을 BC',DE',HL'
.
값을 레지스터에로드 :
; from other register
LD I,A ; copies value in A into I (8 bit)
LD BC,HL ; copies value in HL into BC (16 bit)
; directly with value encoded in instruction machine code
LD B,d8 ; 8b value d8 into B
LD DE,d16 ; 16b value d16 into DE
; from a memory (ROM/RAM)
LD A,(HL) ; value from memory addressed by HL into A
LD A,(a16) ; value from memory with address a16 into A
LD HL,(a16) ; 16b value from memory with address a16 into HL
POP IX ; 16b value popped from stack into IX
LD A,(IY+a8) ; IX and IY allows addressing with 8b offset
; from I/O port (for writing value at I/O port use "OUT")
IN A,(C) ; reads I/O port C, value goes to A
가능한 소스와 대상 피연산자의 올바른 조합이 제한됩니다 (예 : LD H,(a16)
이 없음).
값을 메모리에 저장 :
LD (HL),D ; value D stored into memory addressed by HL
LD (a16),A ; value A into memory with address a16
LD (a16),HL ; value HL into 16b of memory with address a16
LD (IX+a8),d8 ; value d8 into memory at address IX+a8
LD (IY+a8),B ; value B into memory at address IY+a8
; specials ;)
PUSH DE ; 16b value DE pushed to stack
CALL a16 ; while primarily used for execution branching
; it also stores next instruction address into stack
x86 레지스터
32 비트 환경에서 범용 레지스터는 세 가지 일반 클래스로 분류됩니다. 16 비트 범용 레지스터, 32 비트 확장 범용 레지스터 및 8 비트 레지스터 반쪽입니다. 이 세 클래스는 완전히 다른 세 개의 레지스터 세트를 전혀 나타내지 않습니다. 16 비트 및 8 비트 레지스터는 실제로 32 비트 레지스터 내부 의 영역 이름입니다. x86 CPU 제품군의 레지스터 증가는 구형 CPU에 존재하는 레지스터를 확장 함으로써 이루어졌습니다
AX, BX, CX, DX, BP, SI, DI, SP 등 8 개의 16 비트 범용 레지스터가 있습니다. 16 비트 이하로 표현 될 수있는 값을 입력 할 수 있습니다.
인텔이 x86 아키텍처를 1986 년에 32 비트로 확장 한 후 8 개의 레지스터 모두를 두 배로 늘리고 각각의 레지스터 이름 앞에 E를 붙이면 새로운 이름을 붙여 EAX, EBX, ECX, EDX, EBP, ESI, EDI 및 ESP.
x86_64에서는 레지스터 크기가 두 배가되고 새로운 레지스터가 추가되었습니다. RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4는 64 비트 폭이며 이름은 슬래시입니다 (대체 레지스터 이름을 표시하는 데 사용됨). R8, R9, R10, R11, R12, R13, R14, R15.
범용 레지스터는 기술적으로 모든 용도로 사용할 수 있지만 각 레지스터에는 대체 / 주 목적이 있습니다.
- AX (누산기)는 산술 연산에 사용됩니다.
- CX (카운터)는 시프트 및 회전 명령어에 사용되며 루프에 사용됩니다.
- DX (데이터)는 산술 및 I / O 작업에 사용됩니다.
- BX (기본) 데이터에 대한 포인터로 사용됩니다 (특히 세그먼트 모드에서 DS 세그먼트 레지스터에 대한 오프셋으로 사용).
- SP (스택)는 스택 맨을 가리 킵니다.
- BP (스택 기준)는 스택의 기준을 가리 킵니다.
- SI (소스)는 스트림 작업 (예 :
lodsb
)을 위해 메모리의 소스를 가리 킵니다. - DI (대상)는 스트림 작업 (예 :
stosb
)을 위해 메모리의 대상을 가리 킵니다.
분할 모드에서 사용되는 세그먼트 레지스터는 메모리의 다른 세그먼트를 가리 킵니다. 각 16 비트 세그먼트 레지스터는 64k (16 비트)의 데이터를 볼 수 있습니다. 세그먼트 레지스터가 메모리 블록을 가리 키도록 설정되면 레지스터 (예 : BX
, SI
및 DI
)를 세그먼트 레지스터의 오프셋으로 사용하여 64k 공간의 특정 위치에 액세스 할 수 있습니다.
6 개의 세그먼트 레지스터와 그 용도는 다음과 같습니다.
레지스터 | 성명 | 기술 |
---|---|---|
SS | 스택 세그먼트 | 스택을 가리킨다. |
연사 | 코드 세그먼트 | CPU가 코드를 가져 오는 데 사용합니다. |
DS | 데이터 세그먼트 | MOV 연산의 기본 레지스터 |
ES | 추가 세그먼트 | 추가 데이터 세그먼트 |
FS | 추가 세그먼트 | 추가 데이터 세그먼트 |
GS | 추가 세그먼트 | 추가 데이터 세그먼트 |
x64 레지스터
x64 아키텍처는 이전 x86 아키텍처의 진화로서 이전 버전 (x86 레지스터는 계속 사용할 수 있음)과의 호환성을 유지하면서 새로운 기능을 도입했습니다.
- 레지스터는 이제 64 비트의 용량을 갖습니다.
- 더 많은 8 개의 범용 레지스터가 있습니다.
- 세그먼트 레지스터는 64 비트 모드에서 강제로 0이됩니다.
- 각 레지스터의 하위 32, 16 및 8 비트를 사용할 수 있습니다.
범용
레지스터 | 이름 | 서브 레지스터 (비트) |
---|---|---|
RAX | 어큐뮬레이터 | EAX (32), AX (16), AH (8), AL (8) |
RBX | 베이스 | EBX (32), BX (16), BH (8), BL (8) |
RCX | 계수기 | ECX (32), CX (16), CH (8), CL (8) |
RDX | 데이터 | EDX (32), DX (16), DH (8), DL (8) |
RSI | 출처 | ESI (32), SI (16), SL (8) |
RDI | 목적지 | EDI (32), DI (16), DL (8) |
RBP | 기본 포인터 | EBP (32), BP (16), BPL (8) |
RSP | 스택 포인터 | ESP (32), SP (16), SPL (8) |
R8 ~ R15 | 새 레지스터 | R8D-R15D (32), R8W-R15W (16), R8B-R15B (8) |
노트
새 레지스터의 하위 비트를 처리하는 데 사용되는 접미어는 다음을 나타냅니다.
- B 바이트, 8 비트;
- W 워드, 16 비트;
- D 더블 워드, 32 비트.