책/컴퓨터 구조

컴퓨터 구조 Ch02_"Language of the Computer-1"

RyoTTa 2020. 11. 18. 16:17
반응형

Chapter 2. 명령어: 컴퓨터 언어

 

2.1 서론

명령어 집합

  하드웨어의 언어를 명령어라 칭하며, 이들의 집합을 명령어 집합이라 부른다.

  설명에 사용될 명령어 집합은 ARMv8이며, 부분 집합을 설명 할 때에는 LEGv8 용어를 사용하겠다.

  Chapter 2 에서는 명령어의 표현 방식을 배우고 이를 이해한다면 내장 프로그램 개념을 이해할 수 있다.

 

2.2 하드웨어 연산

 LEGv8 산술 명령어는 반드시 한 종류의 연산만 지시하며, 항상 변수 세개를 갖는 형식이다. 

 LEGv8 어셈블리언어 예시

  ADD a, b, c

  ADD a, a, d

  ADD a, a, e // b, c, d, e 의 합을 a에 저장하는 예시

 

 설계원칙 1: 간단하기 위해서는 규칙적인 것이 좋다.

  연산의 피연산자(operand)는 연산될 숫자 두개와 합을 기억할 장소 하나,

   즉 모두 세개인것으로 고정해 하드웨어를 단순히 한다.

 

 ex) 상위 수준 언어의 컴파일

  a = b + c

  d = a - e

   ADD a, b, c

   SUB d, a, e

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

   ADD t0, g, h

   ADD t1, i, j

   SUB f, t0, t1

2.3 피연산자

 상위 수준 언어 프로그램과는 달리 산술 명령어의 피 연산자에는 레지스터만을 사용해야하는 제약이 존재한다.

 LEGv8 구조에서 레지스터의 크기는 64bit(=더블워드) 이다. 또한 32bit(=워드) 그룹도 자주 사용한다.

 또한 레지스터 개수는 한정되어 있으며 LEGv8  구조에서는 32개의 레지스터가 있다.

  

 설계원칙 2: 작은 것이 더 빠르다.

  레지스터의 개수가 많아지면 CPU 내부 전기신호가 상대적으로 먼곳까지 전달되어야 하므로 클럭 사이클이 길어진다.

  하지만 절대적이지 않으며 레지스터의 개수와 클럭사이클 사이의 타협점을 찾아야 한다.

  

 메모리 피연산자

  단순 변수 외에 배열 및 구조체와 같은 복잡한 자료구조는 레지스터 개수보다 훨씬 더많은 데이터가 존재한다.

  따라서 레지스터와 메모리간에 데이터를 주고받는 명령어가 필요하다. 이를 데이터 전송 명령어라 한다.

 

  메모리에 접근하려면 메모리 주소를 지정해야한다. 메모리 주소는 주소가 인덱스 역할을 하는 큰 일차원 배열이다. 

  주소는 0부터 시작한다.

  이러한 상황이라면 세번째 데이터 주소는 2이며 Memory[2]의 값은 10이다.

 

 메모리로부터 레지스터로 데이터를 적재하는 데이터 전송명령을 Load라 하며 LEGv8 에서는 LDUR로 명한다.

 

 ex) 상위 수준 언어의 컴파일

  g = h + A[8]

   LDUR X9, [X22 ,#8] // X9 레지스터에 A[8]값 임시 저장

   ADD X20, X21, X9

 

 프로그램에서 8비트로 구성된 바이트를 많이 사용하므로 대부분의 컴퓨터는 바이트 단위로 주소를 지정한다. 

 따라서 연속된 더블워드의 주소는 8씩 차이가 난다. 예를들어 세번째 더블워드의 바이트 주소는 16이다.

 앞의 LDUR X9, [X22, #8] 의 코드에서 상수 8을 더하는것이 아닌 사실 8 * 8 = 64를 더해야 한다.

 

 레지스터로부터 메모리로 데이터를 복사하는 데이터 전송명령을 Store라 하며 LEGv8에서는 STUR로 명한다.

 

 ex) 상위 수준 언어의 컴파일

  A[12] = h + A[8]

   LDUR X9, [X22 ,#64] // X9 레지스터에 A[8]값 임시 저장

   ADD X9, X21, X9

   STUR X9, [X22, #96]

 

 스필링 :자주 사용하지않은 변수를 메모리에 넣는것

 

상수 또는 수치 피연산자

 상수(수치 피연산자)를 피연산자로 사용해 연산하는것을 위해 명령어를 제공한다.

 ADDI X22, X22, #4 // 레지스터 X22에 상수 4를 더한다.

 상수중에서 0은 여러가지 변형을 제공함으로 명령어 집합을 단순하게 하는 역할을 한다. 따라서 LEGv8에서는

  레지스터 XZR의 값이 0으로 고정되어 있다.

 

2.4 부호있는 수 부호없는 수

 모든 정보는 이진 자릿수, 즉 비트로 구성되며 계산의 기본단위이다. ex) 1010(2) = 11(10)

 LSB = 가장 오른쪽 비트수, MSB = 가장 왼쪽의 비트수

 

 2진수를 통해 양수와 음수를 모두 표기하는데 이를 2의보수법으로 나타낸다. 

 ex) 2^63 - 1 까지는 MSB가 0이며 이후 숫자들은 수를 나타내는데 쓰인다. 

     그다음 비트패턴 (1000...000)부터는 가장 작은 음수를 나타내며 1비트가 추가될때마다 음수에서 1씩 증가하게 된다

     따라서 최종적으로 (x63 * -2^63) + (x62 * +2^62) .... + (x1 * +2^1) + (x0 * +2^0)로 표현가능하다.

 

 부호있는 적재의 경우 레지스터의 남는 곳을 채우기위해 부호를 반복하여 복사하게 되는데 이를 부호확장이라 한다.

 목적은 레지스터 내부에 정확한 값을 적재하기 위해서이다. 

 

2.5 명령어의 컴퓨터 내부 표현

 LEGv8 언어 버전을 10진수와 이진수 형태로 표현

 LEGv8 ADD X9,  X20, X21

  LEGv8의 명령어는 예외없이 32bit 워드단위이다.

 

 LEGv8의 명령어 필드

 opcode : 명령어가 실행할 연산의 종류, 연산자

 Rm : 두번째 Source 피연산자 레지스터

 shamt : 자리이동(Shift) 양 

 Rn : 첫번째 Source 피연산자 레지스터

 Rd : 목적지 Destination 레지스터

 

 설계원칙 3: 좋은 설계에는 적단한 절충이 필요하다

  load 명령어는 레지스터 필드 두개와 상수 필드 하나가 필요하다. 만일 위의 5bit 필드중 하나를 주소로 사용한다면         2^5 보다 작은 값많을 사용할 수있다. 따라서 명령어 길이는 같게하되 명령어 종류에 따라 형식을 다르게 사용한다.

  위의 명령어는 R-Type 이다.

 

 D-Type

 D-Type은 9비트 주소를 사용하므로 Load 명령어에서 베이스 레이스터 Rn 에 저장된 주소를 기준으로 +-2^8 바이트   안에있는 더블워드를 지정할 수있다.

 

 I-Type

 수치명령어를 위한 형식, opcode에서 1비트를 더가져와 상수 필드를 12비트로 만들었다.

반응형