전자전기공학/컴퓨터구조

[컴퓨터구조][기본배경 및 Operand]

Sim 2024. 9. 17. 12:42
반응형

· 목차

  - 기본적인 배경

  - Arithmetic Operand

  - Register Operand

  - Memory Operand

  - Immediate Operand

 

 


 

 

안녕하세요, 오늘은 컴퓨터 구조에 대해서 배워보도록 하겠습니다.

컴퓨터 구조에 대해서 배우기 이전에 제가 공부하는 교재는 ARM architecture을 기본으로 학습하기 때문에,

해당 부분에 대해서 헷갈리는 부분이 없으셨으면 합니다.

 

여기서 ARM architectureIntel architecture란 무엇일까요?

 

ARM architecture(Advanced RISC Machine)는 RISC(Reduced Instruction Set Computer) 기반의 아키텍처입니다.

ARM은 경량, 저전력, 그리고 단순한 설계를 목표로 개발되었으며, 주로 모바일 기기나 임베디드 시스템에 널리 사용됩니다.

 

그렇다면 ARM architecture의 주요 특징은 무엇이 있을까요?

 

 

1. RISC 설계: ARM은 단순하고 빠른 명령어를 사용하는 RISC 설계를 따릅니다. 명령어 집합이 간단하기 때문에 처리 속도가 빠르고

                     하드 웨어 복잡성을 줄일 수 있습니다.

 

2. 파이프라인 처리: ARM 프로세서는 명령어를 파이프라인 방식으로 처리하여 더 빠른 명령어 실행을 지원합니다.

 

3. Load/Store 구조: ARM은 Load/Store 구조를 이용합니다. Instruction이 직접 메모리에서 데이터를 읽거나 쓰지 않고, 메모리와

                                 레지스터 간의 데이터 이동만을 담당하는 Load/Store 명령어를 사용합니다.

 

 

Intel architecture(x86 architecture)CISC(Complex Instruction Set Computer) 기반의 아키텍처 입니다.

Intel architecture은 성능 최적화에 중점을 두며, 데스크탑, 서버, 고성능 컴퓨팅에 주로 사용됩니다.

 

여기서 Intel architecture의 주요 특징을 살펴보자면,

 

 

1. CISC 설계: Intel architecture은 복잡한 명령어 집합을 사용한 CISC을 사용합니다. 하나의 명령어가 매우 복잡한 작업을

                     수행할 수 있으며, 다양한 형태의 데이터를 처리하는 능력이 뛰어납니다.

 

2. 복잡한 하드웨어: CISC 설계는 명령어가 복잡한 만큼 하드웨어 설계도 복잡하지만, 고성능을 구현할 수 있습니다. 복잡한 명령어 집합을

                               처리하기 위해 더 많은 트랜지스터와 전력을 사용하기 때문에 그만큼 단점 또한 존재합니다.

 

3. 명령어의 다양한 길이: Intel architecture은 가변 길이의 명령어를 사용합니다. 한마디로 각 명령어의 크기가 다를 수 있으며,

                                      유연성을 높여 더 복잡한 명령어를 구현할 수 있습니다.

 

 

 

위의 내용을 하나의 표로 정리하면 아래와 같습니다.

 

특성 ARM architecture Intel architecture
설계 철학 RISC(단순한 명령어 집합) CISC(복잡한 명령어 집합)
명령어 집합 간단하고 빠른 명령어 복잡하고 다양한 명령어
전력 소비 저전력 설계 고전력 소비
성능 저전력에 적합, 고성능 응용에 상대적 약점 고성능 응용에 적합, 저전력에는 약점
데이터 처리 방식 Load/Store 구조 다양한 메모리 접근 방식

 

 

저희는 CPU design 하는 것을 ISA(Instruction Set Architecture)라고 합니다.

ISA는 자료형, 명령어, 레지스터, 어드레싱 모드, 메모리 구조, 인터럽트, 예외 처리, 외부 입출력을 포함한 프로그래밍 관련

컴퓨터 아키텍처의 일부 입니다. 또한 ISA는 Software과 Hardware의 사이에서 작동한다고 생각할 수 있습니다.

 

 

기본적인 Arm architecture과 Intel architecture에 대해서 알아보았으니 앞서 말한 것 처럼, ARM architecture을 이용하기 때문에

ARMv8 명령어의 부분집합인 LEGv8이라는 명령어 집합을 사용합니다. 부분집합이라고 하지만 일부 명령어는 ARMv8과 다르기 때문에

해당 부분을 참고하셔야 합니다.

 

 

 

Arithmetic Operations

 

 

 

Arithmetic Operation에 있는 Add와 Subtract의 경우에는 다음과 같은 방식으로 명령어를 설정할 수 있습니다.

 

 

$ADD \; a, b, c // a gets b+c$

 

모든 Arithmetic Operation은 위와 같은 형태로 작성되게 됩니다.

위에 a, b, c는 각자 두 개의 source와 하나의 destination을 의미합니다.

위의 명령어 예시에서 보자면 'a'가 destination이 되고, 'b' 와 'c'가 source가 되는 것 입니다.

 

하나의 예시를 더 들자면 아래와 같습니다.

 

 

C code로 작성된 $f = (g + h) - (i + j)$를 LEGv8로 작성해보자면, 

 

$ADD \; t0, g, h // t0 = g + h$

$ADD \; t1, i, j // t1 = i + j$

$SUB  \; f, t0, t1 // f = t0 - t1$

 

위와 같이 작성할 수 있습니다.

 

 

 

 

Register Operand

 

 

 

 

ARM과 같은 register-regitser architecture 또는 load-store architecture에서는 모든 피연산자가 레지스터입니다.

띠리사 ADD를 할 때는 레지스터끼리만 덧셈을 할 수 있고 메모리에 접근하려면 별도의 load/store 명령어를 실행해야만 합니다.

 

LEGv8에서는 64bit 32개의 레지스터를 정의하고 이용합니다.

해당 레지스터에서 "doubleword"와 "word"라고 표기하는 것이 있는데,

"doubleword"는 64-bit register가 채워져있는 것을 의미합니다.

또한 "word"는 하위 32bit를 사용하는 것을 의미합니다. 

 

X0 ~ X7 함수 호출 시 첫 번째부터 여덟 번째까지의 인자(arguments)를 전달하는데 사용되며, 함수가 반환하는 값을 리턴 값으로 사용될 때 사용합니다. 
X8 임시 레지스터로 반환 값 저장에 사용됩니다,
X9 ~ X15 일반 목적 임시 데이터 저장에 사용됩니다.
X16 ~ X17 인터프로시저 호출 및 주소 계산에 사용됩니다.
X18 플랫폼 독립적인 특수 용도이며, 마찬가지로 임시 레지스터로 사용됩니다.
X19 ~ X27 함수 규약에 따라 함수 호출 후 보존되어야 하는 레지스터입니다.
X28 Stack Pointer으로 local variable을 사용할 때 사용하거나 register백업할 때 사용합니다.
X29 Frame Pointer(FP)
X30 Link Register(LR)
XZR(register 31) 특수레지스터로 명령에 따라 제로 레지스터로서 항상 0을 반환하거나 스택 최 상단을 가르키는 스택 포인터로 작동합니다.

 

위에서 X29와 X30 Register을 보자면, Frame Pointer와 Link Register가 있다는 것을 알 수 있습니다.

 

Frame Pointer는 스택 프레임의 기준점 역할을 합니다. 함수 호출 시 스택의 시작 지점을 가르키고,

이러한 정보들을 스택 프레임이라고 하며, FP는 해당 프레임의 주소를 가르킵니다.

 

또한 Link Register는 함수 호출과 반환을 담당합니다. 함수가 호출되면 LR은 복귀할 주소를 저장합니다.

함수가 종료되면 LR 값을 스택에 저장된 주소로 돌아갑니다.

재귀 함수나 중첩 함수 호출에서는 LR 값을 스택에 저장해 반환 주소를 유지합니다.

 

 

또한 Register Operands를 사용하는 방법에 대해서 아래와 같이 예시를 들 수 있습니다.

 

$f = (g + h) - (i + j)$

에서 f ···· j 까지가 X19부터 X23까지를 나타낸다면, 아래와 같이 Arithmetic을 수행할 수 있습니다.

 

 

$ADD \; \text{x}9, \; \text{x}20, \; \text{x}21$

$ADD \; \text{x}10,\; \text{x}22, \; \text{x}23$

$SUB \; \text{x}19, \; \text{x}9, \; \text{x}10$

 

 

 

 

Memory Operands

 

 

 

Memory Operand는 다음과 같은 특징을 가지고 있습니다.

 

 

1. 복합 데이터에 사용되는주기억장치

  - 배열, 구조체, 동적 데이터

 

2. 산술 연산을 적용하기 위해
  - 메모리에서 레지스터로 값을 로드합니다.
  - 레지스터에서 메모리로 결과를 저장합니다.

 

3. 메모리는 바이트 단위로 주소 지정됩니다.

  - 각 주소는 8-bit byte를 식별합니다.

 

4. LEGv8은 명령어와 스택을 제외하고는 메모리에서 워드 정렬을 요구하지 않습니다.

 

여기에서 추가로 몇 가지 정보가 있는데, 기본에 마이크로프로세서 수업을 들어본 사람은 각 Instruction이 각자 다른 byte길이를

갖고 있는 것을 아실 것 입니다. 하지만 LEGv8에서는 모두 4byte 길이를 갖고 있습니다.

여기서 그렇다면 PC(Program Counter)를 계산하는 것이 간단하다는 것을 직관적으로 아실 수 있습니다.

저희는 그저 PC + 4를 하면 되기 때문에 계산하기 편하다는 것을 알 수 있죠?

 

 

Memory Operand에는 대표적으로 LDURSTUR이 있습니다.

LDUR은 memory에서 Register로 Load하는 것을 의미합니다. LD(Load)U(unscaled)R(Register)입니다.

또한 STUR은 레지스터로부터 메모리로 데이터를 복사하는 데이터 전송 명령입니다. 해당 명령을 Store라고 합니다.

이제 왜 ARM의 데이터 처리방식이 Load/Store이라고 하는지 아실 것 이라고 생각합니다.

 

아래의 C code로 작성된 예시를 compiled LEGv8 code로 어떻게 작성될까요?

 

$A[12] = h + A[8]$, h in x21, base address of A in x22

 

위의 C code로 작성된 것은 아래와 같이 작성할 수 있습니다.

 

$LDUR \; \text{x}9,[\text{x}22, \#64]\; $

$ADD \; \text{x}9, \; \text{x}21, \; \text{x}9\;$

$STUR \; \text{x}9, [\text{x}22, \#96]\; $

 

 

지금까지 Register과 Memory Operand에 대해서 배워봤는데요, 각각의 차이점은 무엇이 있을까요?

1. 레지스터는 메모리보다 접근 속도가 빠르다.

2. 메모리 데이터를 처리하려면 데이터를 로드(불러오기)하고 저장해야 한다.

  - 이를 위해 더 많은 명령어를 실행해야 한다.

3. 컴파일러는 가능한 한 많은 변수를 레지스터에 저장해야 한다.

  - 덜 자주 사용되는 변수만 메모리에 저장해야 한다.

  - 레지스터 최적화는 매우 중요하다.

 

위와 같이 정리할 수 있을 것 같습니다. 아직 모르는 부분이 많기 때문에 컴퓨터 구조에 대해서 공부하며 추가적으로 정리해보도록 할게요.

 

 

 

 

Immediate Operand

 

 

 

 

Immediate Operand는 메모리나 레지스터에서 값을 가져오지 않고, 명령어 자체에 포함되어 바로 사용되는 것 입니다.

 

쉬운 예로 아래와 같은 예시를 들 수 있습니다.

 

$ADD \; \text{x}1, \; \text{x}2,  \; \#5$

 

Immediate Operand는 추가적인 메모리 접근 없이 연산에 사용됩니다.

또한 일반적으로 작은 값을 처리할 때 사용되며, 값의 크기가 제한됩니다.

 

값의 크기가 제한되는 것의 이유에 대해서 알아보자면, I-format Instruction을 보면 알 수 있습니다.

 

 

여기서 opcode는 명령어를 말하고, Rn은 source register, Rd는 destination register입니다.

여기서 immediate라는 값이 위의 예시에서 '#5'를 가르키는 것 입니다.

 

해당 I-format을 보면 immediate는 12bit입니다. 그럼 최대한 표현할 수 있는 수는 $-2^{11} \text{~} 2^{11}$이 됩니다.

그렇기 때문에 값의 크기가 제한된다고 이야기하는 것 입니다.

 


 

 

지금까지 컴퓨터 구조에서 ARM architecture 그리고 Intel architecture의 차이와 더불어서

Arithmetic, Register, Memory, Immediate Operand에 대해서 배워봤습니다.

 

만약에 마이크로 프로세서를 하셨다면 아주 어렵지 않게 이해하실 수 있으실 거라고 생각합니다.

 

앞에서 I-format에 대해서 이야기한 것 처럼 format에는 R,D,W,I,CW에 대한 format이 존재합니다.

 

다음 시간에는  해당 format에 대해서 살펴보도록 하겠습니다.

 

 

 

감사합니다.

 

반응형