· 목차
- R-format Instructions
- D-format Instructions
- I-format Instructions
- Logical Operations
- Shift Operation
안녕하세요, 지난 시간에 Arithmetic Operand, Register Operand, Memory Operand 그리고 Immediate Operand에 대해서
살펴봤었습니다. 이번에는 해당 Operand와 관련된 R,D,I - format instructions과 bitwise에 대해서 살펴보도록 하겠습니다.
R-format Instructions
위는 R-format Instructions의 명령어 구조이고, 각 의미는 아래와 같습니다.
1. opcode : Operation code. 여기서 오퍼레이션 코드란 ADD, SUB는 각자 고유의 bit을 가지게 됩니다. CPU는 해당 opcode를
해석하여 어떤 연산을 실행할지에 대해서 결정하게 됩니다.
2. Rm : second register source operand. 두 번째 소스 레지스터의 주소를 지정하는 필드입니다.
3. Shamt : Shift amount의 줄임말로 시프트 연산을 할 때 사용되는 시프트 양을 나타내는 필드입니다. 만약 시프트 연산이 필요없을
경우 0으로 설정될 수 있습니다.
4. Rn : Rn은 첫 번째 소스 레지스터의 주소를 지정하는 필드입니다.
5. Rd : 연산 결과를 젖아할 대상 레지스터를 나타냅니다. 연산 후 이 레지스터에 최종 결과가 저장됩니다.
위의 정의만 보면 이해가 어려울 수 있으니, 아래에 예시를 함께 보시면 이해가 더 쉬우실 것 입니다.
$ADD \; \text{x}9,\; \text{x}20, \; \text{x}21$
위의 예시를 살펴보시면 정의에 따라서 X20 + X21 register의 값을 X9 register에 저장한다는 것을 아실 수 있습니다.
그렇다면, 여기서 실제 필드에 입력되는 값들은 어떻게 될까요?
$1112_{10}$ | $21_{10}$ | $0_{10}$ | $20_{10}$ | 9_{10} |
십진법으로 표현된 필드가 위와 같다면, 이진법으로 표현된 필드는 어떻게 되시는지 예상가실거에요.
$10001011000_{2}$ | $10101_{2}$ | $000000_{2}$ | $10100_{2}$ | $01001_{2}$ |
위의 ADD명령어를 수행한다면 필드가 십진법과 이진법은 위와 같이 표현됩니다.
D-format Instructions
위 구조는 D-format Instructions의 명령어 구조입니다.
1. opcode : Operation code. 여기서 오퍼레이션 코드란 ADD, SUB는 각자 고유의 bit을 가지게 됩니다. CPU는 해당 opcode를
해석하여 어떤 연산을 실행할지에 대해서 결정하게 됩니다.
2. address : 메모리 주소를 나타내는 값입니다. Rn 레지스터가 기본 주소를 제공하고, address 필드가 추가적인 오프셋으로 작용하여
메모리에서 읽거나 쓸 데이터를 찾게 됩니다.
3. Rn : 베이스 주소를 제공하는 소스 레지스터 입니다.
4. Rt : 데이터를 읽거나 쓸 레지스터를 지정하는 필드입니다. 예를 들어서 $Load$ 명령어에서는 메모리에서 읽은 데이터를 저장할 레지스터를 나타내고, $Store$ 명령어에서는 메모리에 저장할 데이터를 제공하는 레지스터를 나타냅니다.
위의 D-format Instructions는 주로 memory와 register간의 데이터를 이동하는 명령어에서 사용됩니다.
당연히 이전 시간에 알아봤던 것과 같이, STUR과 LDUR명령어가 있다는 것은 아실 것이라고 생각합니다.
그렇다면 I-format Instructions는 무엇일까요?
I-format Instructions
위 구조는 I-format Instructions의 명령어 구조입니다.
1. opcode : opcode는 위의 설명과 동일합니다.
2. immediate : immediate는 즉시 값으로 연산의 피연산자로 사용됩니다. 해당 필드는 상수를 나타내며, 연산에 사용될 값이 미리 명령어
자체에 포함되어 있어 메모리나 레지스터에서 데이터를 불러오는 대신 바로 사용할 수 있습니다.
3. Rn : 첫 번째 소스 레지스터를 나타냅니다.
4. Rd : 연산 결과를 저장할 대상 레지스터를 나타냅니다.
I-format은 즉시 값을 피연산자로 사용하는 명령어 형식입니다.
예를 들어, Rn 레지스터에 저장된 값과 Immediate 값을 더하거나 뺄 수 있습니다.
해당 명령어를 통해서 메모리 접근을 줄이고, 명령어 내에 상수를 직접 포함할 수 있어 특정 연산을 빠르게 처리할 수 있는 장점이 있습니다.
아래의 예시를 보시면 이해에 도움이 될거에요.
$ADDI \; \text{x}0, \text{x}1, \#20$
위의 예시를 보면 20이라는 값을 Rn에 해당하는 $\text{x}1$의 register의 값을 더해서 Rd register에 저장하게 됩니다.
이전 시간에 이야기 했듯이, 여기에는 주의할 점이 두 가지 존재합니다.
첫 번째로, immediate값은 제한된 값의 범위를 가진다는 것 입니다.
immediate필드는 12bits로 제한되어 있기 때문에 $-2^{11} \; \text{~} \; 2^{11}$의 범위를 가지게 됩니다.
두 번째로, immediate는 zero-extended(unsigned)가 이뤄진다는 것입니다.
쉽게 예를 들어서 십진수 2는 0010으로 표현할 수 있습니다. 하지만 함께 계산되는 $\text{x}1$의 값은 64bit입니다.
두 값을 계산하기 위해서 bit가 맞아야 하기 때문에, 4bit인 십진수 2의 앞에 '0'으로 zero-extended가 이뤄지는 것 입니다.
이제 마지막으로 bitwise를 살펴보고 이번 포스팅을 마치도록 하겠습니다.
Logical Operations
Operation | C | JAVA | LEGv8 |
Shift left | << | << | LSL |
Shift right | >> | >>> | LSR |
Bit-by-bit AND | & | & | AND, ANDI |
Bit-by-bit OR | | | | | ORR, ORRI |
Bit-by-bit XOR | ^ | ^ | EOR, EORI |
Bit-by-bit NOT | ~ | ~ | MVN |
기본적으로 비트 단위 연산자에 대해서 아실 것이라고 생각합니다.
만약에 비트 단위 연산자에 대해서 잘 모르실 경우에는 아래의 포스팅을 참고하시면 쉽게 이해하실 수 있습니다.
2024.02.23 - [전자전기공학/디지털논리회로] - [Digital Logic #3][논리게이트(Logic Gate)]
위의 글을 참고하시면 비트 단위 연산자가 무엇을 수행하는지에 대해서 자세히 아실 수 있으실 것 입니다.
해당 부분은 특별히 헷갈릴만한 부분이 없을 것 같아요.
이제 마지막으로 위에서 Shift Operation에 대해서 짤막하게 설명하고 글을 마치겠습니다.
Shift Operation
위의 표에서 Shift Operation 명령어는 $LSL$과 $LSR$인 것을 알 수 있습니다.
$LSL$은 'Logical Shift Left'입니다. 그렇다면 $LSR$은 무엇인지 예상이 가시죠?
예상하신 것과 같이 'Logical Shift Right'입니다.
Shift Operation의 명령어 구조는 R-format Instructions와 같습니다. 바로 아래에 보여지는 필드입니다.
각 필드가 어떤 것을 의미하는 것인지 R-format Instructions에서 설명했기 때문에 예시를 들어서 설명하고 넘어가겠습니다.
$LSL \; \text{x}0, \; \text{x}1, \#2$
위의 의미는 $\text{x}0$에 $\text{x}1 * 4$의 결과 값을 넣는 것을 말합니다.
여기서 갑자기 왜 $4$를 곱했는지 궁금하실 것 입니다.
위의 그림을 가지고 설명하자면, 0010을 왼쪽으로 두번 shift하게 되면 1000이 되고 8이라는 숫자가 나옵니다.
하지만 저희는 각 자리가 $2^{n}$의 weight를 가지고 있는 것을 알고 있습니다.
그렇다면 4개의 bit에서 각 자리고 하나의 비트가 올라갈 때마다 어떻게 될까요?
각 자리에 들어가는 비트가 하나씩 올라갈 때 마다, 시작된 곳에 따라서 2씩 곱해지는 것을 확인하실 수 있습니다.
여기까지 쫓아왔다면, 만약에 $LSR$은 어떻게 될까요? 이해하셨다면 2씩 나눠진다는 것을 아실 수 있습니다.
그렇기 때문에 시프트 하는 방향과 횟수에 따라서 다음과 같이 나타낼 수 있습니다.
$LSL$ → $\#N*2^{i}$ (i는 왼쪽으로 이동하는 횟수, N은 정해지지 않은 비트 수)
$LSR$ → $\#N/2^{i}$ (i는 오른쪽으로 이동하는 횟수, N은 정해지지 않은 비트 수)
이제 시프트까지 확인해봤습니다.
지금까지 제 설명을 듣고 쫓아오기 수월하셨기를 바랍니다.
이제 다음에는 Branch Operation이라는 명령어가 있는데,
해당 명령어에 대해서 배워보도록 하겠습니다.
글 읽어주셔서 감사합니다.
'전자전기공학 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조][CPU의 기본역할 및 성능] (0) | 2024.09.27 |
---|---|
[컴퓨터구조][Arithmetic/Floating point] (10) | 2024.09.25 |
[컴퓨터구조][Procedure] (2) | 2024.09.24 |
[컴퓨터구조][Branch, Conditional Operation/ Procedure] (0) | 2024.09.20 |
[컴퓨터구조][기본배경 및 Operand] (4) | 2024.09.17 |