<Introduction>
■ 이 챕터에서 다뤄질 대부분의 것들은 컴퓨터 사용자나 프로그래머가 평소에 쉽게 알만한 것은 아니다.
■ 하드웨어를 설계하는 컴퓨터 디자이너와 소프트웨어를 설계하는 컴퓨터 프로그래머는 기계명령어 셋(machine instruction set)을
통해서 소통한다.
-> 디자이너의 관점에서, 기계 명령어 셋은 프로세서에게 기능적인 요구를 제공한다, 기계 명령어 셋을 실행하는 것도 포함
-> 기계어(어셈블리어)로 프로그래밍하는 사용자는 레지스터와 메모리 구조, 기계와 ALU 기능에 의해 직접적으로 지원되는
데이터의 타입에 대해서 잘 터득할 수 있다.
■ 컴퓨터 기계명령어 셋의 설명은 컴퓨터 프로세서를 설명하기 이전에 알아두면 좋다. 따라서 이번과 다음 포스팅에서 기계명령어에 대해 알아보자.
<12.1 Machine Instruction 특징>
■ 프로세서의 동작은 프로세서가 실행하는 명령어에 의해 결정된다. 그 명령어는 machine instructions 혹은 computer instructions로 불린다.
■ 프로세서가 실행할 수 있는 다른 명령어들의 집합은 processor's instructions set으로 불려진다.
■ Instruction Cycle State Diagram
//Instruction fetch는 PC(IP) → Code memory에서 명령어를 가져오는 행위
//위에서 가져온 명령어를 IR에 저장하는데, 이 IR에 저장된 명령어를 의미 분석하는 것이 Instruction operation decoding 단계다.
//decoding이 끝나고 PC값은 변경된다. 즉 지금 실행중인 명령어가 끝나고 수행할 다음 명령어의 주소 값을 PC레지스터에 담는다.
//Operand는 연산에 쓰일 자료, 그것을 불러오는 과정이 Operand fetch
//Data operation은 실질적으로 명령어를 수행하는 부분, 여러 개 클락으로 수행될 수 있다.
//그 결과가 저장되거나, jump하거나, 등등이 Operand store이다.
//명령어들의 총체적인 집합, Instruction set
<12.1.1 Elements of a Machine Instruction> //기계명령어가 가지는 4가지 정보
■ 각 명령어는 반드시 실행에서 프로세서가 필요한 정보를 포함해야 한다.
-> Operation code (opcode) 수행될 동작을 구체적으로 명시한다. 동작은 binary code에 의해 구체화된다. 이것은 operation code 혹은 opcode로 알려져 있다.
//명령어의 의미를 알려준다.
-> Source operand reference 동작은 한 개 이상의 source operand를 포함한다, 즉 operand는 어떤 동작에 있어서 입력이 된다.
//명령어가 수행될 때 기초자료, 연산자료
-> Result operand reference
동작은 결과에 대한 정보를 제공한다.
//결과 저장을 어디에, 어떻게 해야 하는지 알려준다.
-> Next instruction reference
프로세서가 현재 명령어가 끝난 후에 다음 명령어를 어디로 불러올지 말해준다.
//다음 명령어가 어느 위치에 있는지 알려준다.
//기계명령어가 가질수 있는 정보 이 4가지가 꼭 다 있어야 하는 것은 아니다.
<Source and Result Operands : 4가지 가능> //OPERAND가 있을 수 있는 곳
■ 1. Main or virtual memory
-> 다음 명령어 레퍼런스와 함께, 메인 혹은 가상 메모리 주소가 지원되어야 한다.
//이곳의 Operand는 수행속도가 3순위다.
■ 2. I/O 장치
-> 명령어는 반드시 I/O 모듈과 장치에서 어떻게 동작할 것인지에 대해 구체화해야 한다. 만약 memory-mapped I/O가 사용되면, 이것은 다른 메인 혹은 가상 메모리 주소다.
//이곳의 operand는 수행속도 꼴찌, 예시로 scanf, printf 같은 명령어 많아지면 코드 느려진다.
■ 3. Processor register
-> 프로세서는 한 개 이상의 레지스터를 포함한다. 그 프로세서는 기계명령어에 의해 레퍼런스될 수 있다.
//PC, IR 등이 다 CPU안에 있는 Special Purpose한 register
//여기에서 말하는 건 General Purpose한 register
//RISC는 프로세서 레지스터 많다, CISC는 적다.
//이곳의 operand는 수행속도 2순위
■ 4. Immediate(수치로 표현됨)
-> operand의 값이 실행되는 명령어 영역 안에 포함된다.
//가장 간단한 데이터, 상수
//code memory에 opcode와 함께 저장된다.
//operand의 수행속도 제일 좋음
<12.1.2 명령어 표현>
■ 컴퓨터에서 각 명령어는 bits의 순서에 의해 표현 된다.
■ 명령어는 자신을 구성하는 요소에 대응하는 fields안으로 나뉘어 들어간다.
■ 명령어 형식에 간단한 예시
//위 그림에서 최대 명령어 종류는 2^4 = 16개까지다.
//operand가 IAS 명령어 형식과 다르게 여러 개로 나눠질 수도 단일로 있을 수도 있다.
■ 다른 예시로, IAS 명령어 형식은 : 4096 저장 공간, 40개 binary digits의 word라고 불린다.
//IAS는 모든 명령어가 메모리에 있기 때문에 address = operand라고 볼 수 있다.
<Instruction Representation>
■ Opcodes(연산자)는 mnemonics라고 불리는 약자에 이해 표현된다. //니모닉, Assembly Language
-> Opcode 예시는 다음과 같다.
ADD Add
SUB Subtract
MUL Multiply
DIV Divide
LOAD Load data from memory
STOR Store data to memory
■ Operand(연산부)는 또한 symbolic하게 표현되기도 한다, 예시로:
-> 명령어 ADD R, Y //R, Y가 Operand, 연산부(연산에 필요한 자료)라고 불린다.
-> 데이터 위치 Y에 포함된 값을 레지스터 R의 내용에게 더한다.
-> 이 예시에서, Y는 메모리 안 위치의 주소를 언급한다. 그리고 R은 특정 레지스터를 언급한다.
-> 동작이 위치의 주소가 아닌 내용으로 적용된다는 것을 주의해라
//예시에선 Destination Operand(R), Source operand(Y)지만 어떻게 정의하느냐에 따라 달라질 수 있다.
<어셈블리 언어 사용>
■ 그리하여, Symbolic form으로 machine-language 프로그램을 쓰는 것이 가능하다. 각 Symbolic opcode가 고정된 이진표현을 가지고, 프로그래머는 각 symbolic operand의 위치를 구체적으로 명시한다.
-> X = 513, Y = 514 등등
■ 간단한 프로그램은 이와 같은 symbolic 입력을 받고, opcode와 operand reference를 이진 형식으로 변환한다. 그리고 이진 기계 명령어를 만든다.
■ Machine-language 프로그래머는 거의 존재하지 않는다. 대부분 프로그램은 high-level 언어로 쓰이거나 혹은, 그것이 안 되면 어셈블리 언어를 쓴다.
■ 그러나, symbolic machine language는 기계 명령어를 표현하는데 유용한 도구로 남았다. 우린 이것에 대해 알아볼 것이다.
<12.1.3 명령어 타입>
■ 다음 high-level language가 기계 명령어로 동작하는 예제를 생각하여 보자.
(X = 513, Y = 514를 가정): X = X + Y;
1. 메모리 위치 513의 내용을 register로 불러온다.
2. 메모리 위치 514의 내용을 레지스터에 더한다.
3. 레지스터의 내용을 메모리 위치 513에 저장한다.
■ high-level 언어는 정교한 대수 형식 안에서, 변수를 사용하여 동작을 표현한다.
■ 기계언어는 데이터의 움직임, 레지스터 안팎으로의 움직임을 포함한 기본 형식으로 표현된다.
■ 컴퓨터는 사용자가 일을 처리하는 어떤 데이터든지 형식화 하는 set of instruction을 가지는 것이 좋다.
high-level 언어로 쓰인 어떤 프로그램이던간에 실행되기 위해서는 반드시 machine language로 바뀌어야 한다.
■ 따라서 set of machine instruction은 high-level 언어로서부터 어떤 명령어던간에 충분히 수행할 수 있다.
//RISC가 CISC보다 코드 길이가 길다.
<명령어 타입> //4가지 종류에 맞춰서 나뉘어 있다.
■ 컴퓨터의 4가지 주요 기능을 지원하기 위함이다.
■ 데이터 처리
-> Arithmetic instruction은 숫자 데이터를 처리하는데 연산적인 능력을 제공한다.
-> 논리(Boolean) 명령어는 숫자보단 비트로 word의 비트에서 동작한다. 그렇게 그들은 사용자가 채택하는 어떤 타입의 데이터도 처리할 수 있는 능력을 제공한다.
//가장 기본적인 연산기능
■ 데이터 저장
-> 데이터가 레지스터 혹은 메모리 위치로 들어오거나 나가는 움직임
//연산결과 메모리에 저장
//레지스터에 저장
■ 데이터 움직임(movement)
-> I/O 명령어는 프로그램과 데이터를 메모리로 전송, 연산의 결과를 사용자에게 전해주는 것도 필요하다.
//Storage랑 비슷한 기능이지만, I/O에 관한 명령어에 해당한다.
//데이터 저장과, 움직임을 묶어서 생각하는 사람도 있다.
■ Control
-> 테스트 명령어는 데이터 word의 값, 혹은 연산의 상태를 테스트하는데 사용된다.
-> Branch 명령어는 서로 다른 명령어 셋을 결정에 따라 branch하는데 사용된다.
//서브루틴, Branch, JBE 등등
<12.1.4 Number of Addresses> //Operand가 위치하는 곳 = Address
■ 한 명령어에서 필요한 주소의 최대 숫자는 무엇인가?
■ Y = A-B/(C+(D*E))를 계산하기 위한 프로그램 예
//Operand의 개수 따라 숫자 올라간다.
//Three-address = Y(destination), A(Source), B(Source)
//Two-address = Y(Destination, Source), A(Source)
//One-address = AC를 Destination operand, Source operand로 가정한다. 디폴트
■ Zero-address 명령어는 p418과 같이 stack과 함께 사용
//13장에서 다룰 예정
■ 명령어에서 address 개수는 4개부터 0까지 가능한데,
-> 4개인 경우는 2개 source operands, 1개 destination operand, 1개 next instruction address이다.
-> 보편적으로는 one, two, three address로 다음 표와 같이 동작한다.
■ 명령어 당 더 적은 수의 address를 가지는 것은 더 적고 복잡한 프로세서를 요구로 하는것과 동시에 더 원시적인 명령어라는 뜻이다. 반면에 프로그램은 더 많은 명령어 개수를 담을 수 있다, 일반적으로 더 긴 실행시간, 복잡한 프로그램을 초래한다.
-> one-address 명령어는 프로그래머가 오직 한 개의 범용 레지스터, accumulator에만 접근 가능한 명령어다.
-> multiple-address 명령어, 요즘엔 보통 multiple 범용 레지스터를 가지는 것이 흔하다. 이 명령어는 일부 동작이 레지스터에서만
혼자 동작되는 것을 허용하는데, 이는 레지스터의 레퍼런스가 메모리 레퍼런스보다 빠르기 때문에, 실행의 속도를 높여준다.
■ 유동성을 높이고, 요즘 기계는 multiple registers를 사용할 수 있는 능력이 되기 때문에, 대부분 현대의 기계들은 two-, three- address 명령어를 채택한다.
■ 디자인 trade-off는 다른 요소들에 의해서 명령어 당 몇 개의 address를 선택할 것인지를 포함한다. address가 메모리 공간, 아니면 레지스터를 레퍼런스 할지의 문제다. 레지스터의 수가 더 적기 때문에, 더 적은 비트가 레지스터 레퍼런스에 필요하다.
<12.1.5 명령어 셋 디자인>
■ 가장 흥미롭고, 가장 많이 분석된 컴퓨터 디자인 측면 중 하나는 명령어 셋 디자인 (instruction set design)이다.
■ 명령어 셋은 프로세서에 의해 실행되는 많은 기능들을 정의한다. 명령어 셋은 프로세서를 제어하는 프로그래머의 수단이다.
■ 이 기초적인 디자인 중 가장 중요한 문제는 아래에 것들을 포함한다.
-> Operation repertoire : 얼마나 많이, 어떤 동작을 제공할지 그리고 동작이 얼마나 복잡해야 할지
//어떤 종류의 명령어를 설정할 것인지
-> Data types : 동작이 수행되는 데이터의 다양한 타입
//지원해주는 데이터 타입
-> 명령어 형식 : 비트 안에 명령어 길이, 주소의 숫자, 다양한 field의 크기, 등등
//명령어의 형식
-> 레지스터 : 명령어에 의해서, 그리고 그들의 사용에 따라 레퍼런스 될 수 있는 프로세서 레지스터의 수
//레지스터의 개수, 종류
-> Addressing : Operand의 주소가 구체적으로 명시되는 모드
//메모리 위치를 어떻게 지정할 것인지
■ 이러한 문제들은 명령어 셋을 디자인하는데 있어서 많이 연관되어 있고, 반드시 함께 고려되야 한다.
<12.2 Types of Operands>
■ 기계 명령어는 데이터를 베이스로 동작한다. 데이터의 가장 중요한 general 카테고리는 다음과 같다.
1. Address //레지스터의 이름, 메모리의 위치
2. Numbers
3. Characters
4. Logical data
■ Address
-> 챕터 13에서 addressing mode에 대한 것을 볼 것이다. 그런데 address는 사실 데이터의 form이다. 대부분 경우에 있어서, 어떤 계산이 메인과 가상 메모리를 결정하기 위해 명령어 안에 operand 레퍼런스에서 반드시 실행되어야 한다. 이러한 내용으로, address는 unsigned integers로 생각될 수 있다.
■ 다른 흔한 데이터는 타입들은 numbers, characters, 그리고 logical data이다.
<Numbers>
■ 모든 기계 언어는 (숫자 데이터 타입)numeric data types을 포함한다.
-> 컴퓨터안에 저장되는 숫자는 제한된다.
- 기계에서 표현되는 숫자 절대치의 제한
- floating-point 숫자의 경우에서, 그들의 precision의 제한??
■ 컴퓨터에서 흔한 3가지 타입의 numerical data이다 :
-> 2진 integer 혹은 2진 fixed point
-> 2진 floating point //IEEE 754
-> 10진수
//다 10챕터에서 학습했음
■ 10진 표현 : 많은 컴퓨터가 8비트를 묶어서 1바이트로 처리하기 때문에, 이런 환경에서 이진화 십진법을 저장하는 방법은 두 가지가 있다.
-> Zoned decimal : 한 바이트에 한 자리만을 저장하고, 남는 네 자리를 0000이나 1111(EBCDIC의 경우), 또는 0011(ASCII의 경우)로 채움
- 존 십진법으로 +729는 11110111 11110010 11001001 또는 16진법으로 F7 F2 C9가 되며, -729는 F7 F2 D9가 된다.
-> Packed decimal : 한 바이트에 두 자리를 저장하는데 다음 페이지에 예제를 보자
//Zoned decimal = Unpacked decimal
//1111(남는네자리) 0111(7) 1111(남는네자리) 0010(2) 1100(+)1001(9) = +729
//1111(남는네자리) 0111(7) 1111(남는네자리) 0010(2) 1101(-)1001(9) = -729
<Packed Decimal Format>
■ 각 10진 digit은 BCD 안에 저장된다.
-> 1바이트 안에 2 digit가 있다.
■ The most significant digit은 첫 번째 바이트의 high-order bits에 -를 먼저 저장한다,
■ 16바이트 안에 31digit까지 저장할 수 있다.
■ sign은 마지막 byte의 low-order bits에 저장된다.
-> Binary 1100은 “+”를 의미한다.
-> Binary 1101은 “-”를 의미한다.
-> Binary 1111은 unsigned number를 의미한다.
■ Decimal point는 저장되지 않는다: 반드시 어플리케이션 소프트웨어로 유지되어야 한다.
//맨 마지막 니블에 부호비트를 저장
<Packed Decimal 예제>
■ Unsigned number
10진 숫자 값 : 1 0 3 5 7,unsigned
Packed decimal: 0001 0000 0011 0101 0111 1111
Byte1 Byte2 Byte3
//바이트화 되면 이걸로 끝난다.
■ 음수
10진수 값 : - 9 0 4 1 3
Packed decimal: 1001(9) 0000(0) 0100(4) 0001(1) 0011(3) 1101(-)
//이것도 바이트 화 됨
■ 양수
10진수 값 : + 5 8 5 2
Packed decimal: 0000(빈자리) 0101(5) 1000(8) 0101(5) 0010(2) 1100(+)
//바이트화가 되려면 4비트가 부족하기 때문에 앞에 0000을 채워줌
//숫자 수(부호비트 포함) * 4 / 8을 올림하면 바이트수와 같다.
<Characters>
■ 데이터의 흔한 형식은 텍스트 혹은 문자열이다.
■ 문자 형식의 텍스트 데이터는 데이터 프로세싱에 의해 쉽게 저장되고, 통신에 의해 쉽게 전송될 수 없다. 그들은 binary data로 디자인 되어 있기 때문이다.
■ 대부분 공통적으로 사용되는 character code는 International Reference Alphabet(IRA)이다.
-> 미국에서 American Standard Code for Information Interchange (ASCII)로 언급된다.
■ 문자를 인코딩에 사용되는 다른 코드는 Extended Binary Coded Decimal Interchange Code다. (EBCDIC)
-> EBCDIC는 IBM mainframes에 사용된다.
<Logical Data>
■ 정상적으로, 각 word 혹은 다른 addressable unit (byte, halfword, 등등)은 data의 단독 유닛으로 다뤄진다.
■ 하지만, n-bit 유닛을 n개의 1-bit의 데이터로 이루어져 있다고 고려하는 것은 때때로 유용하다. 각 아이템은 0 혹은 1의 값을 가진다.
■ 데이터가 이런 식으로 보일 때, 그들은 logical data로써 여겨진다.
■ bit-편향적 관점의 두 가지 장점
-> 메모리는 1(참)혹은 0(거짓) 두 가지의 값만 가질 수 있는 Boolean 혹은 binary data 아이템의 배열을 저장할 때 가장 효율적으로 사용될 수 있다.
-> 데이터 아이템의 bits를 조작하기 위함이다.
- 만약 floating-point 동작이 소프트웨어에서 실행된다면, 어떠한 동작에서 significant bits를 shift 하는 것이 필요하다.
- IRA를 packed decimal로 변환하기 위해서는, 각 바이트의 rightmost 4비트를 추출가능 하다.
'임베디드구조' 카테고리의 다른 글
임베디드구조)#13 Instruction Sets: Addressing Modes and Formats (3) | 2020.06.04 |
---|---|
임베디드구조)#12 Instruction Sets: Characteristics and Functions(2) (0) | 2020.05.28 |
임베디드구조)#1 Basic Concepts and Computer Evolution(1) (0) | 2020.05.26 |