<명령어 카테고리 개요>
■ 다른 opcode의 수는 기계에 따라 다양하지만, 같은 범용 종류의 동작도 다른 머신에서 찾아진다.
유용하고 전형적인 카테고리는 아래와 같다:
-> 데이터 전송 //Data storage
-> Arithmetic //Data processing
-> Logical //Data processing
-> Conversion //Data processing
-> I/O //Data movement
-> System control //Branch
-> Transfer of control //Branch
■ Table 12.3([HAYE98]를 기초로 하는)은 각 카테고리 안에 공용 명령어 타입을 나열한다.
■ 이 섹션은 특정 타입의 동작(Table 12.4에 의해 요약된)을 실행하기 위해 프로세서에 의해 취해지는 행동을 간단한 토론과 함께, 다양한 타입의 동작의 간단한 조사를 제공한다 -> 후자의 주제는 챕터 14에서 자세하게 다뤄진다.
<12.4 동작의 타입>
//Test는 연산 결과가 플래그에 들어간다.
//Set Control Variable은 flag, interrupt를 설정하는 명령어
//Rotate는 LSB가 MSB쪽으로 가거나, MSB가 LSB로 가는 명령어
//Branch 개념의 명령어들이다.
//I/O에 해당하는 명령어들이다.
<명령어에 따른 프로세스 동작>
■ 각 명령어 그룹에 따른 processor 동작 개요
<데이터 전송>
<Arithmetic>
■ 대부분의 머신들은 기본 arithmetic 동작인 덧셈, 뺄셈, 곱셈, 나눗셈을 제공한다.
-> 이것들은 signed integer (fixed-point) 숫자에게 제공 된다.
-> 그들은 종종 floating-point와 packed decimal number로 제공되기도 한다.
■ 다양한 single-operand 명령을 포함하는 다른 동작들:
-> Absolute : Operand의 절댓값을 취한다.
-> Negate : Operand를 negate(?)한다.
-> Increment : Operand에 1을 더한다.
-> Decrement : Operand에 1을 뺀다.
<기본 Logical 동작>
■ (R1) = 10100101
■ (R2) = 00001111
■ (R1) and (R2) = 00000101
<Shift and Rotate Operations>
//오른쪽으로 한 비트씩 민다.
//MSB에 빈자리가 생기므로 0을 채움
//의미적으로 나누기 2와 같다.
//의미적으로 곱하기 2와 같다.
//부호는 유지한 채로
//오른쪽으로 한 비트씩 민다.
//LSB에 있던 놈은 버린다.
//부호는 유지하면서, 왼쪽으로 민다.
//밀려서 MSB 온 놈은 버린다.
//빈자리는 0으로 채운다.
//오른쪽으로 민다.
// 왼쪽으로 민다.
//부호가 있는 것은 Arithmetic right shift, Arithmetic left shift로 해야한다.
<Shift and Rotate Operation 예제>
//3 비트만큼 실행했다는 소리
<Conversion>
■ 1. 형식을 바꾸거나 데이터의 형식에서 동작하는 명령어
■ 2. 예시는 10진에서 2진으로 변환하는 것이다.
■ 3. 더 복잡한 편집 명령어의 예시는 EAS/390 Translate (TR) 명령어
<Input/Output>
■ 다양한 접근법이 취해질 수 있다:
-> Isolated programmed I/O
-> Memory-mapped programmed I/O
-> DMA
-> I/O 프로세서의 활용
■ 많은 실행들이 변수, 코드, 혹은 명령어 word에 의해 구체화되는 특정 동작과 함께 오직 몇 개의 I/O 명령어만 제공한다,
<System Control>
<Transfer of Control>
■ 왜 동작의 전송과 제어가 필요한지? :
1. 각 명령어를 1번 이상 실행가능하게 하는 것이 필수다.
2. 가상적으로 모든 프로그램이 어떤 결정 생성을 포함한다.
3. 만약 임무를 한 번에 처리할 수 있는 작은 조각으로 쪼개는 기술이 있다면 도움이 될 것이다.
■ 대부분 흔한 동작의 전송과 제어는 명령어 셋에서 찾아진다.
-> Branch
-> Skip
-> Procedure call
<Branch Instructions>
<Skip Instruction>
■ 1. 내포된 주소를 포함한다.
■ 2. 전형적으로 한 개의 명령어가 skip되면, 내포된 주소는 다음 명령어의 주소 더하기 한 개의 명령어 길이와 같은 것을 의미
■ 3. skip 명령어는 목적지 주소 영역을 필요로 하지 않기 때문에, 다른 일을 하는데 자유롭다.
■ 4. 예시는 increment-and-skip-if-zero (ISZ) 명령어다.
<Nested Procedures>
//메인 상의 프로그램 자체는 간결한 것처럼 보이지만, 서브루틴이 많아지면 실행이 느려진다.
//프로세서의 관점에서는 좋지 않다.
<12.3 x86 데이터 타입>
■ x86은 8(byte), 16(word), 32(doubleword), 64(quad-word), 128(double quadword) bits 길이의 데이터 타입을 다룰 수 있다.
■ 데이터 구조에서 최대치의 유연성과 효율적인 메모리 사용을 가능하게 하려고, word는 짝수 숫자의 주소에는 할당 될 필요가 없다; doubleword는 4로 나누어지는 짝수 주소에 할당 될 필요가 없다; 그리고 quadword는 8로 나누어지는 짝수 주소에 할당 될 필요가 없다. 등등
■ 그러나, 데이터가 32-bit 버스를 통해 접근될 때, 데이터 전송은 4에 의해 나눠지는 주소에서 시작하는 doubleword 단위에서 발생한다. 프로세서는 잘못 할당된 값에 대한 요청을 버스 전송에 대한 요청의 순서로 변환한다.
■ 인텔 80x86 머신의 모든 것에서, x86은 little-endian 스타일을 사용한다. 이것은, least significant 바이트가 가장 낮은 주소에 저장된다.
■ 바이트, 워드, 더블워드, 쿼드워드, 그리고 더블쿼드워드는 general 데이터 타입으로 언급된다. 그리고, x86은 일부 명령어에 의해 인식되고 동작되는 특정 데이터 타입의 인상적인 배열을 지원한다.
■ Table 12.2는 이런 타입을 요약한다.
<X86 Numeric 데이터 형식>
<Single-Instruction-Multiple-Data [SIMD] Data Types>
■ 멀티미디어 어플리케이션의 성능을 최적화하기 위해서 x86 아키텍처를 명령어 셋 확장의 일부로서 도입했다.
■ 이런 확장은 MMX(multimedia extension), SSE(streaming SIMD extensions) 포함한다.
■ 데이터 타입:
-> Packed byte and packed byte integer
-> Packed word and packed word integer
-> Packed doubleword and packed doubleword integer
-> Packed quadword and packed quadword integer
-> Packed single-precision floating-point and packed double-precision floating-point
//나중에 SIMD 명령어 따로 공부할 때 알려준다.
<12.3 ARM Data Types>
■ ARM 프로세서 대부분은 부동소수점 데이터를 지원하지 않음
//ARM은 Unsigned Signed 고려하지 않고, 2의 보수로 표현
<ARM Data Types>
■ ARM Endian Support - Word Load/Store with E-Bit
//E-bit이 0이면 Little-endian, 1이면 Big-endian
//Little-endian은 하위 번지가 하위 바이트에 저장된다. Big-endian은 그 반대
<Big-endian과 Little-endian 비교>
■ 빅 엔디안 : 사람이 숫자를 읽고 쓰는 방법과 같아서 디버깅 과정에서 메모리의 값을 보는 데 편리하다.
-> 예를 들면, 0x51236412는 빅 엔디안으로 51 23 64 12로 표현 할 수 있다.
즉, 메모리에 위에서부터 아래로 순서대로 들어간다.
//보는 순서가 편하다.
■ 리틀 엔디안 : 메모리에 저장된 값의 하위 바이트들만 사용할 때, 별도의 계산이 필요 없다.
-> 예를 들면, 0x2A를 리틀 엔디언으로 표현하면 2A 00 00 00이 된다. 이것은 앞의 두 바이트 또한 한 바이트만 떼어내면 하위 16비트 또는 8비트를 바로 얻을 수 있다.
//아래 바이트 쪽을 우선적으로 읽고 쓰므로, 바로접근 할 수 있기 때문에 구조가 유리하다.
■ 반면에, 빅 엔디언에서는 하위 16비트나 8비트 값을 얻으려면 변수 주소에 2바이트 또는 3바이트를 더해야 하는 번거로움이 있다.
//덤으로 읽어야 한다, OD를 읽기 위해선 0A0B0C 다 읽어야 한다.
<12.5 ARM Operation Types>
■ ARM 아키텍처는 Operation 타입의 큰 모음집을 제공한다. 기본적인 카테고리는 다음과 같다 :
■ Load and Store 명령어
-> ARM 아키텍처에서, 오직 load와 store 명령어만이 메모리 공간에 접근 한다;
-> arithmetic 그리고 논리 명령어는 오직 레지스터와 상수 값(immediate values)을 명령어에 인코딩 한다. 이것은 RISC 디자인의 특징이자 한계이다. 이것에 대해서는 15장에서 더 자세히 다룬다.-> ARM 아키텍처는 두 개의 넓은 타입의 명령어를 지원한다, 이것은 single register, register 쌍의 값을 메모리로 불러오거나 저장하는 것이다 -> (1)32bit word 혹은 8bit unsigned byte를 불러오거나 저장한다. 그리고 (2)16bit unsigned halfword 를 불러오거나 저장한다, 그리고 16bit halfword 혹은 8bit byte 확장을 불러오거나 sign한다?
//메모리를 직접 건드리는 덧셈, 뺄셈은 없고, load와 store를 통해 메모리의 데이터를 register로 옮긴 상태에서 덧셈, 뺄셈과 같은 명령어를 수행해야 한다.
■ Branch 명령어
-> ARM supports a branch instruction that allows a conditional branch forwards or backwards
up to 32 MB.
-> As the program counter is one of the general-purpose registers (R15), a branch or jump
can also be generated by writing a value to R15.
-> A subroutine call can be performed by a variant of the standard branch instruction. As well
as allowing a branch forward or backward up to 32 MB,
-> the Branch with Link (BL) instruction preserves the address of the instruction after the
branch (the return address) in the LR (R14).
-> Branches are determined by a 4-bit condition field in the instruction.
//Conditional branch, 조건을 보고 수행하는 부분
■ 데이터 프로세싱 명령어
-> 이 카테고리는 논리적인 명령어(AND, OR, XOR), 덧셈과 뻴셈 명령어, 그리고 test, compare 명령어를 포함한다.
■ 곱하기 명령어
-> 정수는 word, halfword operands에 명령어 동작을 곱하거나, normal 혹은 long 결과를 생산한다. 예시로, 2개의 32bit operand를 받고, 64bit 결과를 생산하는 곱하기 명령어가 있다.
■ Parallel addition and subtraction 명령어
-> In addition to the normal data processing and multiply instructions,
-> there are a set of parallel addition and subtraction instructions, in which portions of two
operands are operated on in parallel.
-> For example, ADD16 adds the top halfwords of two registers to form the top halfword of the
result and adds the bottom halfwords of the same two registers to form the bottom halfword
of the result.
-> These instructions are useful in image processing applications, similar to the x86
MMX instructions
//SIMD 타입의 명령어
■ Extend 명령어
-> There are several instructions for unpacking data by sign or zero extending bytes
to halfwords or words, and halfwords to words.
■ Status register access instructions:
-> ARM provides the ability to read and also to write portions of the status register.
//인텔이 제공하지 않았던 명령어
<ARM Conditions for 조건부 명령어 실행>
■ ARM 아키텍처는 4가지 프로그램 status 레지스터 안에 저장되는 조건 플래그를 정의했다.
N, Z, C, 그리고 V (Negative, Zero, Carry and Overflow), 그런데 이것들은 본질적으로
x86 아키텍처 안에 S, Z, C, 그리고 V flag와 같은 의미를 가진다.
'임베디드구조' 카테고리의 다른 글
임베디드구조)#13 Instruction Sets: Addressing Modes and Formats (3) | 2020.06.04 |
---|---|
임베디드구조)#12 Instruction Sets: Characteristics and Functions(1) (0) | 2020.05.27 |
임베디드구조)#1 Basic Concepts and Computer Evolution(1) (0) | 2020.05.26 |