과목명 : 컴퓨터 구조(Computer Organization & Architecture)
수업일자 : 2022년 12월 01일 (목)
< 기계(프로세서) 명령어 세트(Machine(processor) instruction set) - 주소 지정 방식과 형식 chapter list>
(A) 주소 지정 방식
(B) 명령어 형식
1. 주소 지정 방식(Addressing modes)
1-1. 개요
- 전형적인 명령어 형식에서 주소 필드는 비교적 작은 부분을 담당하며, 사용자는 기억장치의 영역들을 적절히 사용하도록 설계하고 있습니다. 이러한 설계를 위해 여러 주소 지정 기법들이 사용되었으며 이번 파트에서는 일반적인 주소 지정 기법과 해당 방식들에 대해 알아보겠습니다.
- 해당 방식들을 설명할 때 아래와 같은 표기법이 사용됩니다.
(1) A
- 명령어 내부의 주소 필드 내용
(2) R
- 레지스터를 참조하는 명령어 내부의 주소 필드 내용
(3) EA
- 참조되는 오퍼랜드를 포함하고 있는 위치의 실제 주소
(4) (X)
- 기억 장치의 X번지 또는 레지스터 X의 내용
1-2. 즉시 주소 지정 방식(Immediate addressing)
오퍼랜드 = A
(A : 명령어 내 주소 필드의 내용)
(1) 오퍼랜드가 명령어에 직접 포함되어 있습니다.
(2) 오퍼랜드 = 주소필드[A]
- 오퍼랜드 필드의 내용이 연산에 사용될 데이터입니다.
- 상수 또는 변수의 초기값(Initialization value)을 세트하는데 사용됩니다.
- 2의 보수 형태로 지정되어 있습니다.
(3) Example) ADD 5
- 누산기의 내용에 5를 더합니다.
- 5 = 오퍼랜드
(4) 오퍼랜드를 인출하기 위해 기억장치를 참조할 필요가 없습니다.
- 명령어 사이클에서 하나의 기억장치 또는 캐시 사이클을 줄일 수 있게 됩니다.
(5) 사용할 수 있는 크기가 주소 필드의 크기로 제한됩니다.
1-3. 직접 주소 지정 방식(Direct addressing) - 가장 일반적인 방식
*EA = A
(유효 주소[EA] = 주소 필드[A])
(A라는 값은 기억 장치의 주소를 나타냅니다.)
*EA(Effective Address) - 유효 주소, 참조되는 오퍼랜드를 포함하고 있는 실제 주소
(1) 명령어의 주소 필드가 오퍼랜드의 유효 주소를 가지고 있습니다.
(2) Example) ADD A
- A번지의 내용을 누산기에 더합니다.
- 오퍼랜드를 위해 주소 A의 메모리가 참조됩니다.
(3) 기억장치를 단 한 번만 참조하게 됩니다.
(4) 직접 주소 지정 방식처럼 주소 공간이 제한적입니다.
1-4. 간접 주소 지정 방식(Indirect addressing)
EA = (A)
- (A) : A번지의 내용
- A번지를 참조하여 해당 내용을 찾고, 찾은 주소로 실제 오퍼랜드를 탐색합니다.
(1) 주소 필드는 기억장치에 저장된 단어의 주소를 가리키고, 그 기억장치에 저장된 오퍼랜드에 대한 전체 주소를 저장합니다.
(2) Example) ADD (A)
- A의 내용에 의해 기억장치의 지정된 주소 번지의 내용을 누산기에 더합니다.
(3) 장점
- 넓은 주소 공간을 지정할 수 있습니다.
(4) 단점
- 2번의 기억 장치 참조가 발생합니다. (성능 저하 이슈가 발생할 수 있습니다.)
- 주소를 읽어오기(1회 참조) → 주소가 지정하는 위치(번지)로부터 오퍼랜드 가져오기(2번 참조)
1-5. 레지스터 주소 지정 방식(Register addressing)
EA = R
(R - 레지스터 번호)
(1) 직접 주소 지정 방식과 유사한 방식입니다.
(2) 주소 필드가 주기억장치의 주소가 아닌 레지스터를 가리키고 있습니다.
(3) 장점 : 명령어에서 주소 필드가 작아도 문제가 발생하지 않습니다.
- 레지스터를 지정하는 주소 필드의 경우, 3~5개의 비트를 가지므로 8~32개의 범용 레지스터를 지정할 수 있습니다.
- 기억 장치 액세스가 불필요해지므로 명령어 실행 속도가 향상됩니다.
(4) 단점 : 주소 공간이 매우 제한적입니다.
1-6. 레지스터 사용의 효율성
- 오퍼랜드가 레지스터 또는 주기억장치를 참조하는지에 대한 여부는 개발자가 직접 프로그래밍하는 방식에 따라 달라지게 됩니다.
- 레지스터는 시스템에서 매우 속도가 빠르지만, 공간이 극히 적은 시스템 자원이므로 효율성 있게 사용해야 시스템 성능 향상을 기대할 수 있습니다.
- 효율성 증가 : 레지스터에 적재된 오퍼랜드가 연산에 여러 번 사용되는 경우
- Example) 2의 보수에 대한 곱셈 알고리즘(Booth algorithm)
- 해당 알고리즘의 로직은 한 번 사용된 데이터가 이후에도 계속 사용되므로 성능 향상을 위해 레지스터에 데이터를 적재해야 합니다.
- 효율성 감소 : 오퍼랜드가 주기억장치로부터 레지스터로 적재됐으나 한 번만 사용되는 경우
1-7. 레지스터 간접 주소 지정 방식(Register indirect addressing)
EA = (R)
(1) 간접 주소 지정 방식과 유사한 방식입니다.
(2) 주소 필드에 의해 주소 공간이 제한되는 문제를 그 필드가 주소를 가지고 있는 단어의 위치를 가리키도록 합니다.
(3) 간접 주소 지정 방식보다 기억장치 액세스 횟수가 1회 더 적고 이를 통해 간접 주소 지정보다 더 빠른 지정 방식입니다.
1-8. 변위 주소 지정 방식(Displacement addressing)
EA = A + (R)
(1) 매우 강력한 주소 지정 방식으로 직접 주소 지정 방식과 레지스터 간접 주소 지정 방식의 기능을 조합한 형식의 주소 지정 방식입니다.
(2) 두 개의 주소 필드를 가지게 됩니다.
- A는 베이스 값으로 명시되어 있습니다.
- R은 변위를 가지는 레지스터입니다.
(주소 필드 또는 연산 코드(Opcode)에 따른 묵시적 참조가 진행됩니다.)
1-9. 상대 주소 지정 방식(Relative addressing)
EA = A + (PC)
- 유효 주소는 다음 명령어의 주소(PC, Program Counter)를 기준으로 한 상대적인 변위입니다.
- PC가 베이스 값이며 A가 변위입니다.
(1) 묵시적으로 참조되는 레지스터가 프로그램 카운터인 주소 지정 방식입니다.
(2) Example)
- JUMP 명령어가 450번지에 저장되었다면 해당 명령어가 인출된 후 PC의 내용에 451이 저장되었을 경우
오퍼랜드 필드에서 A가 21이라고 가정하면 분기 목적지 주소는 472가 됩니다. 만약 오퍼랜드 필드에서 A가 -50이라면 분기 목적지 주소는 401이 됩니다.
(3) 지역성의 개념을 활용한 방식입니다.
- 대부분의 기억장치의 참조들이 현재 실행되고 있는 명령어에 인접한 부분을 참조합니다.
(4) 명령어의 주소 비트가 절약됩니다.
- 전체 주소 필요 없이 변위값을 가지고 주소를 제어함으로써 주소 비트가 절약됩니다.
1-10. 베이스-레지스터 주소 지정 방식(Base-register addressing)
EA = (BR) + A
- BR이 베이스 값이며 A는 변위입니다.
(1) 참조된 레지스터(BR)는 기억장치의 주소를 가지고 있으며 주소 필드는 그 주소로부터 변위값을 가지고 있습니다.
- 레지스터의 참조는 명시적 또는 묵시적으로 진행됩니다.
(2) 참조의 지역성의 원리를 이용한 주소 지정 방식입니다.
1-11. 인덱싱(Indexing), 인덱스 주소 지정 방식(Indexed addressing)
EA = A + (R)
- A가 베이스 값이며 R은 인덱스 레지스터이며 초기값은 0이고 변위에 해당합니다.
(1) 주소 필드 : 기억장치의 주소를 가리키고 있습니다.
(2) 지정된 레지스터 : 해당 주소로부터 양(Positive)의 변위값을 가지고 있습니다
- 베이스-레지스터 주소 지정 방식과 반대입니다.
(3) 반복 연산 수행에 효과적인 메커니즘을 제공하고 있습니다
- Example)
- 기억 장치 A에서부터 시작하여 배열의 성분(Element)이 저장되어 있고 이때 배열의 각 성분에 1을 더하는 경우
- 배열의 경우 같은 자료형을 가진 데이터들이 연속적으로 나열된 공간에 저장되어 있으므로 필요한 주소의 형태는 A, (A + !), (A + 2)입니다.
- 주소 값 A는 주소 필드에 저장되고 인덱스 레지스터라고 불리는 레지스터는 0으로 초기화되어 있고 연산이 진행될 때마다 1씩 증가하게 됩니다. 이러한 방식을 자동 인덱싱이라고 합니다.
- 자동 인덱싱 : 명령어가 실행될 때마다 레지스터의 값이 1씩 순차적으로 증가하는 것.
1-12. 스택 주소 지정 방식(Stack addressing)
(1) 오퍼랜드는 스택 메모리의 최상위에 위치합니다.
- 스택과 포인터는 스택의 최상위 주소를 가르키고 있습니다.
- 묵시적 주소 지정 형태입니다.
(2) 기억장치 내부 스택 위치에 대한 참조 방식입니다
- 레지스터 간접 지정 방식
(3) Example)
- ADD : 스택 최상위의 2개의 요소를 pop한 후 더합니다.
1-13. 기본적인 주소 지정 방식들
방식 | 알고리즘 | 장점 | 단점 |
즉시 주소 지정 | Operand = A | No memory reference | Limited operand magnitude |
직접 주소 지정 | EA = A | Simple | Limited address space |
간접 주소 지정 | EA = (A) | Large address space | Multiple memory references |
레지스터 주소 지정 | EA = R | No memory reference | Limited address space |
레지스터 간접 주소 지정 | EA = (R) | Large address space | Extra memory reference |
변위 주소 지정 | EA = A + (R) | Flexibility(유연성) | Complexity |
스택 주소 지정 | EA = top of stack | No memory reference | Limited applicability (제한된 적용 가능성) |
2. 명령어 형식(Instruction format)
2-1. 개요
(1) 명령어 형식(Instruction format)이란, 구성 요소들에 대한 명령어 비트들의 배치를 정의를 정의해 주고 있는 개념입니다.
(2) 명령어 형식은 연산 코드(Opcode) + 한 개 이상의 오퍼랜드와 같습니다.
- 각 오퍼랜드는 여러 주소 지정 방식 중의 하나를 사용하여 참조되고 있습니다.
(3) 대부분의 명령어 세트에서 하나 이상의 명령어 형식들이 사용됩니다.
2-1. 명령어의 길이
(1) 기억 장치의 크기, 조직은 오퍼랜드의 길이에 영향을 주게 됩니다.
(2) 명령어의 종류를 늘리는 것과 공간을 절약하는 것 사이의 적절한 상호 조정(Trade-off)가 요구됩니다.
- 연산 코드(Opcode)의 종류와 오퍼랜드의 수는 프로그램의 코드 길이에 반비례합니다.
- 기억 장치 및 가상 기억장치의 증가는 명령어 길이를 증가시킵니다.
(3) 명령어의 길이는 기억 장치의 전송 폭(데이터 버스의 폭)과 같거나 배수가 되어야 합니다.
2-2. 기억장치의 전송률
(1) 프로세서가 명령어를 인출하는 속도보다 명령어를 실행하는 속도가 더 빠릅니다.
(2) 컴퓨터 시스템 관점에서 이러한 기억장치는 병목 현상의 원인이 됩니다.
(3) 해결 방안
- 캐시 기억 장치 사용
- 짧은 명령어를 사용
(예를 들어 16비트 명령어는 32비트 명령어보다 2배 빨리 인출되나 결과적으로는 16비트, 32비트 모두 동일한 실행 속도를 가지게 됩니다.
2-3. 명령어 비트 할당에 대한 고려사항
(1) 연산 코드의 종류와 주소 지정 능력 간에는 상호 조정(Trade-off)이 필요합니다.
- 연산 코드의 종류가 늘어날수록, 오퍼랜드의 주소 지정 비트 수는 감소합니다.
- 가변-길이 연산 코드를 사용해야 합니다.(명령어에 비트를 추가하여 연산의 수를 확대하는 것을 의미합니다.)
2-4. 주소 지정 비트의 용도를 결정하는데 영향을 주는 요인
(1) 주소 지정 방식의 수
- 주소 지정 방식 명시
- 한 개 또는 그 이상의 비트가 필요합니다.
(2) 오퍼랜드의 수
- 최근 컴퓨터의 명령어는 일반적으로 2개의 오퍼랜드를 사용합니다.
(3) 레지스터 대 기억장치
- 누산기를 묵시적으로 사용하는 단일 레지스터 프로그래밍은 자칫하면 코드의 길이가 난해해질 수 있게 됩니다.
- 여러 개의 레지스터를 사용 → 주소 지정에 사용되는 비트의 수가 감소하게 됩니다.
- 이에 따라 8개에서 32개 사이의 레지스터 개수가 가장 적절합니다.
(4) 레지스터 세트의 수
- 2개 이상의 세트 구조는 사용될 비트의 수를 줄일 수 있게 됩니다.
Example) 8개의 레지스터들로 구성된 두 개의 레지스터 세트
- 레지스터 지정에 3비트 소요, 연산 코드가 2개 세트 중 하나를 묵시적으로 결정하는 구조
(5) 주소 영역
- 기억장치 주소들을 이용하여 액세스할 수 있는 주소 영역은 주소 비트 수와 관계가 있습니다.
(6) 주소의 세분화
- 주소는 설계자의 선택에 따라 단어 또는 바이트 단위로 결정됩니다.
- 바이트 주소 지정의 경우 문자 조작은 편리하지만 더 많은 주소 비트 수를 필요로 하게 됩니다.
2-5. 가변 - 길이 명령어
(1) 장점
- 길이가 다른 더 많은 종류의 연산 코드(Opcode)들을 제공합니다.
- 레지스터와 기억장치의 참조가 주소 지정 방식들과 다양하게 결합하여 주소 지정의 융통성이 생깁니다.
(2) 단점
- 프로세서의 복잡도가 증가합니다.
- 그러나 프로세서 복잡도 문제는, 하드웨어 가격이 하락함에 따라 큰 문제 요인으로 선정되진 않습니다.
2-6. 다양한 명령어 형식(PDP-11)
3. 어셈블리 언어(Assembly Language)
3-1. 어셈블리 언어의 정의
- 프로세서가 사용하는 머신 코드(기계어, Machine code)는 바이너리 코드(Binary code)이기에 인간이 이해하는 것은 불가능에 가까우며, 이러한 바이너리 코드를 인간의 자연 언어에 가깝게 기호화한 로우 레벨 수준(Low-level) 프로그래밍 언어이며 머신 코드와 동일하게 로우 레벨 언어에 해당됩니다.
3-2. 어셈블리 언어의 특징
(1) 프로세서는 바이너리 코드로 이루어진 명령어만을 이해합니다.
(2) 예시로 BASIC문 형태로 작성된 해당 코드 N = I + J + K를 머신 코드로 프로그래밍하고 각각의 I, J, K값은 2, 3, 4로 초기화되고 된다고 가정하면
- Code의 형태
(a) 201번지의 내용을 AC로 적재할 것
(b) 202번지의 내용을 AC로 적재할 것
(c) 203번지의 내용을 AC와 더할 것
(d) AC의 내용을 204번지에 저장할 것
- 하지만 이러한 머신 코드 형태로 작성된 언어는 인간이 이해하기 어렵고 난해하며 오류가 발생할 위험이 상당히 높아지게 됩니다.
3-3. 기계어(Machine code) 프로그래밍의 난해함을 개선한 사항
(1) 첫 번째 방법, 16진수(Hexadecimal)을 이용
- 코드를 작성하며, 바이너리 형태 대신 16진수 형태로 코드를 작성합니다.
(16진수 코드 기반 + 16진수 기반 메모리 주소)
- 해당 방식은 자체적인 프로그램으로 바이너리 코드 형태로 번역이 이루어져야 합니다.
(2) 두 번째 방법, 기호 코드 프로그램 사용
- 연산 코드를 기호화한 니모닉 코드를 이용하여 코드를 작성합니다.
- 코드 한 라인은 3개의 필드로 구성됩니다.
(a) 기억장치의 주소
(b) 연산 코드(Opcode, 니모닉 기반 코드)
(c) (절대) 주소 - 기억장치 참조 시 사용할 주소
- 데이터 영역 : 유사 명령어인 DAT를 사용합니다.
- 니모닉 코드를 이용한 프로그래밍은 절대 주소를 사용해야 한다는 단점이 존재합니다.
(3) 세 번째 방법, 어셈블리 언어 프로그래밍
- 1번째 필드 영역 : 주소 (숫자로 표현되는 절대 주소 대신 기호가 사용됨)
- 2번째 필드 영역 : 연산 코드(니모닉 형태 코드)
- 3번째 필드 영역 : 기억장치 참조 시 사용할 주소 - 기호적 주소
- 이러한 어셈블리 언어로 작성된 코드는 어셈블리어에 의해 머신 코드로 변환되어 프로그램이 실행됩니다.
- 어셈블리 언어는 주로 시스템 프로그래밍을 위한 언어로 많이 사용되며 컴파일러, I/O routines을 구현하는데 많이 사용됩니다.
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.
'전공 수업 > 컴퓨터 구조(Computer Architecture)' 카테고리의 다른 글
[13주 차] - 기계 명령어의 특성, 오퍼랜드, 연산의 종류 (0) | 2023.01.04 |
---|---|
[12주 차] - 컴퓨터 산술(Computer arithmetic) (2) | 2022.12.20 |
[11주 차] - 프로그램 I/O, 인터럽트-구동 I/O, 직접 기억 장치 액세스(DMA) (0) | 2022.11.24 |
[10주 차] - 외부 기억 장치 (2), I/O Module (0) | 2022.11.15 |
[8주 차] - 내부 기억 장치 (2), 외부 기억 장치 (1) (0) | 2022.11.11 |
댓글