수색…


비고

레지스터 란 무엇입니까?

프로세서는 숫자 값 (숫자)을 조작 할 수 있지만, 어딘가에 먼저 저장해야합니다. 데이터는 대부분 메모리에 저장되거나 명령어 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 , DEHL 와 같이 16 비트 레지스터로 쌍으로 사용할 수 있습니다.

SP스택 메모리의 맨 아래를 표시하는 스택 포인터입니다 ( PUSH / POP / CALL / RET 명령어에 사용됨).
PC 는 현재 실행 된 명령을 가리키는 프로그램 카운터 입니다.
I 인터럽트 레지스터 로서 IM 2 인터럽트 모드의 상위 바이트의 벡터 테이블 주소를 제공합니다.
R새로 고침 레지스터 이며 CPU가 opcode (또는 opcode 접두사)를 가져올 때마다 증가합니다.
일부 비공식적 인 명령어가 일부 Z80 프로세서에서 IX 8 비트 부분을 IXH:IXLIY ( IYH:IYL 로 조작하기 위해 존재합니다.

섀도우 변종은 어떤 명령으로도 직접 액세스 할 수 없으며 EX AF,AF' 명령은 AFAF' 사이를 전환하고 EXX 명령은 BC,DE,HLBC',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 , SIDI )를 세그먼트 레지스터의 오프셋으로 사용하여 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 비트.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow