어셈블리-레지스터

프로세서 작업에는 대부분 데이터 처리가 포함됩니다. 이 데이터는 메모리에 저장되고 여기에서 액세스 할 수 있습니다. 그러나 데이터를 메모리에서 읽고 메모리에 저장하면 제어 버스와 메모리 저장 장치로 데이터 요청을 보내고 동일한 채널을 통해 데이터를 가져 오는 복잡한 프로세스가 포함되므로 프로세서 속도가 느려집니다.

프로세서 작동 속도를 높이기 위해 프로세서에는 다음과 같은 내부 메모리 저장 위치가 포함됩니다. registers.

레지스터는 메모리에 액세스하지 않고도 처리 할 데이터 요소를 저장합니다. 제한된 수의 레지스터가 프로세서 칩에 내장됩니다.

프로세서 레지스터

IA-32 아키텍처에는 10 개의 32 비트 및 6 개의 16 비트 프로세서 레지스터가 있습니다. 레지스터는 세 가지 범주로 분류됩니다.

  • 일반 레지스터,
  • 제어 레지스터 및
  • 세그먼트 레지스터.

일반 레지스터는 다음 그룹으로 더 나뉩니다.

  • 데이터 레지스터,
  • 포인터 레지스터 및
  • 인덱스 레지스터.

데이터 레지스터

산술, 논리 및 기타 연산에 4 개의 32 비트 데이터 레지스터가 사용됩니다. 이러한 32 비트 레지스터는 세 가지 방법으로 사용할 수 있습니다.

  • 완전한 32 비트 데이터 레지스터 : EAX, EBX, ECX, EDX.

  • 32 비트 레지스터의 아래쪽 절반은 AX, BX, CX 및 DX의 4 개의 16 비트 데이터 레지스터로 사용할 수 있습니다.

  • 위에서 언급 한 4 개의 16 비트 레지스터 중 하위 및 상위 절반은 AH, AL, BH, BL, CH, CL, DH 및 DL의 8 비트 데이터 레지스터로 사용할 수 있습니다.

이러한 데이터 레지스터 중 일부는 산술 연산에서 특정 용도로 사용됩니다.

AX is the primary accumulator; 입력 / 출력 및 대부분의 산술 명령어에 사용됩니다. 예를 들어 곱셈 연산에서는 피연산자의 크기에 따라 하나의 피연산자가 EAX 또는 AX 또는 AL 레지스터에 저장됩니다.

BX is known as the base register인덱싱 된 주소 지정에 사용할 수 있습니다.

CX is known as the count register, ECX로서 CX 레지스터는 반복 작업에 루프 수를 저장합니다.

DX is known as the data register. 입력 / 출력 작업에도 사용됩니다. 또한 큰 값을 포함하는 곱하기 및 나누기 연산을 위해 DX와 함께 AX 레지스터와 함께 사용됩니다.

포인터 레지스터

포인터 레지스터는 32 비트 EIP, ESP 및 EBP 레지스터와 해당 16 비트 오른쪽 부분 IP, SP 및 BP입니다. 포인터 레지스터에는 세 가지 범주가 있습니다.

  • Instruction Pointer (IP)− 16 비트 IP 레지스터는 실행될 다음 명령어의 오프셋 주소를 저장합니다. CS 레지스터와 관련된 IP (CS : IP)는 코드 세그먼트에서 현재 명령어의 전체 주소를 제공합니다.

  • Stack Pointer (SP)− 16 비트 SP 레지스터는 프로그램 스택 내에서 오프셋 값을 제공합니다. SS 레지스터 (SS : SP)와 관련된 SP는 프로그램 스택 내에서 데이터 또는 주소의 현재 위치를 나타냅니다.

  • Base Pointer (BP)− 16 비트 BP 레지스터는 주로 서브 루틴에 전달 된 매개 변수 변수를 참조하는 데 도움이됩니다. SS 레지스터의 주소는 BP의 오프셋과 결합되어 매개 변수의 위치를 ​​가져옵니다. BP는 특수 주소 지정을위한 기본 레지스터로 DI 및 SI와 결합 될 수도 있습니다.

인덱스 레지스터

32 비트 인덱스 레지스터, ESI 및 EDI 및 해당 16 비트 맨 오른쪽 부분. SI 및 DI는 인덱싱 된 주소 지정에 사용되며 때로는 더하기 및 빼기에 사용됩니다. 두 세트의 인덱스 포인터가 있습니다-

  • Source Index (SI) − 문자열 연산을위한 소스 인덱스로 사용됩니다.

  • Destination Index (DI) − 문자열 연산을위한 대상 인덱스로 사용됩니다.

제어 레지스터

32 비트 명령어 포인터 레지스터와 결합 된 32 비트 플래그 레지스터는 제어 레지스터로 간주됩니다.

많은 명령어는 비교 및 ​​수학적 계산을 포함하고 플래그의 상태를 변경하고 일부 다른 조건부 명령어는 이러한 상태 플래그의 값을 테스트하여 제어 흐름을 다른 위치로 가져갑니다.

공통 플래그 비트는 다음과 같습니다.

  • Overflow Flag (OF) − 부호있는 산술 연산 후 데이터의 상위 비트 (가장 왼쪽 비트)의 오버플로를 나타냅니다.

  • Direction Flag (DF)− 문자열 데이터를 이동하거나 비교할 좌우 방향을 결정합니다. DF 값이 0이면 문자열 연산은 왼쪽에서 오른쪽 방향을 취하고 값이 1로 설정되면 문자열 연산은 오른쪽에서 왼쪽 방향을 취합니다.

  • Interrupt Flag (IF)− 키보드 입력 등과 같은 외부 인터럽트를 무시하거나 처리할지 여부를 결정합니다. 값이 0이면 외부 인터럽트를 비활성화하고 1로 설정하면 인터럽트를 활성화합니다.

  • Trap Flag (TF)− 단일 단계 모드에서 프로세서의 작동을 설정할 수 있습니다. 우리가 사용한 DEBUG 프로그램은 트랩 플래그를 설정하므로 한 번에 한 명령 씩 실행할 수 있습니다.

  • Sign Flag (SF)− 산술 연산 결과의 부호를 보여줍니다. 이 플래그는 산술 연산 후 데이터 항목의 부호에 따라 설정됩니다. 부호는 가장 왼쪽 비트의 높은 순서로 표시됩니다. 양수 결과는 SF 값을 0으로 지우고 음수 결과는 1로 설정합니다.

  • Zero Flag (ZF)− 산술 또는 비교 연산의 결과를 나타냅니다. 0이 아닌 결과는 0 플래그를 0으로 지우고 0 결과는 1로 설정합니다.

  • Auxiliary Carry Flag (AF)− 산술 연산 후 비트 3에서 비트 4 로의 캐리를 포함합니다. 특수 산술에 사용됩니다. AF는 1 바이트 산술 연산으로 인해 비트 3에서 비트 4로 캐리가 발생할 때 설정됩니다.

  • Parity Flag (PF)− 산술 연산 결과의 총 1 비트 수를 나타냅니다. 1 비트의 짝수는 패리티 플래그를 0으로 지우고 1 비트의 홀수는 패리티 플래그를 1로 설정합니다.

  • Carry Flag (CF)− 산술 연산 후 상위 비트 (가장 왼쪽)에서 0 또는 1의 캐리를 포함합니다. 또한 이동 또는 회전 작업 의 마지막 비트 내용도 저장합니다 .

다음 표는 16 비트 플래그 레지스터에서 플래그 비트의 위치를 ​​나타냅니다.

깃발: 영형 나는 에스
비트 번호 : 15 14 13 12 11 10 9 8 7 6 5 4 2 1 0

세그먼트 레지스터

세그먼트는 데이터, 코드 및 스택을 포함하기 위해 프로그램에 정의 된 특정 영역입니다. 세 가지 주요 세그먼트가 있습니다-

  • Code Segment− 실행할 모든 명령이 포함되어 있습니다. 16 비트 코드 세그먼트 레지스터 또는 CS 레지스터는 코드 세그먼트의 시작 주소를 저장합니다.

  • Data Segment− 여기에는 데이터, 상수 및 작업 영역이 포함됩니다. 16 비트 데이터 세그먼트 레지스터 또는 DS 레지스터는 데이터 세그먼트의 시작 주소를 저장합니다.

  • Stack Segment− 데이터를 포함하고 프로 시저 또는 서브 루틴의 주소를 반환합니다. '스택'데이터 구조로 구현됩니다. 스택 세그먼트 레지스터 또는 SS 레지스터는 스택의 시작 주소를 저장합니다.

DS, CS 및 SS 레지스터 외에도 데이터 저장을위한 추가 세그먼트를 제공하는 ES (추가 세그먼트), FS 및 GS와 같은 다른 추가 세그먼트 레지스터가 있습니다.

어셈블리 프로그래밍에서 프로그램은 메모리 위치에 액세스해야합니다. 세그먼트 내의 모든 메모리 위치는 세그먼트의 시작 주소에 상대적입니다. 세그먼트는 16 또는 16 진수 10으로 균등하게 나눌 수있는 주소에서 시작합니다. 따라서 이러한 모든 메모리 주소에서 가장 오른쪽 16 진수는 0이며 일반적으로 세그먼트 레지스터에 저장되지 않습니다.

세그먼트 레지스터는 세그먼트의 시작 주소를 저장합니다. 세그먼트 내에서 데이터 또는 명령어의 정확한 위치를 얻으려면 오프셋 값 (또는 변위)이 필요합니다. 세그먼트의 메모리 위치를 참조하기 위해 프로세서는 세그먼트 레지스터의 세그먼트 주소를 위치의 오프셋 값과 결합합니다.

어셈블리 프로그래밍에서 레지스터 사용을 이해하려면 다음 간단한 프로그램을 살펴보십시오. 이 프로그램은 간단한 메시지와 함께 화면에 9 개의 별을 표시합니다.

section	.text
   global _start	 ;must be declared for linker (gcc)
	
_start:	         ;tell linker entry point
   mov	edx,len  ;message length
   mov	ecx,msg  ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	edx,9    ;message length
   mov	ecx,s2   ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	eax,1    ;system call number (sys_exit)
   int	0x80     ;call kernel
	
section	.data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg  ;length of message
s2 times 9 db '*'

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

Displaying 9 stars
*********