3장 컴퓨터명령어
목차
명령어 구성
컴퓨터 명령어는 연산코드(operation code)와 오퍼랜드(operand)로 나누어져있다.
연산코드 : 처리해야할 연산의 종류. 1+2의 +의 개념이 연산코드이다. ex) ADD, SUB, MUX, LOAD ...
오퍼랜드 : 처리할 정보. 1+2의 1과 2가 오퍼랜드의 개념이다.
명령어의 기능
- 함수 연산
- 전달 : 레지스터 사이에 정보 전달
- 제어 : 조건분기
- 입출력 : 기억장치와 입출력장치 사이의 정보이동
명령어 형식
기억장소에 따른 명령어 형식
누산기(AC, accumulator)
누산기란 연산을 위해 오퍼랜드를 저장하기 위해 준비한 전용 레지스터이다.
누산기를 사용하는 CPU에서는 다음과 같은 명령어를 사용한다.
AC : 누산기
X : 메모리 주소값
M[X] : 메모리에서 해당 주소를 가져온다는 의미이다.
명령어 | 의미 | |
ADD X | AC <- AC + M[X] | AC에서 값을 가져와 덧셈한 결과를 AC에 넣는다. |
LOAD X | AC <- M[X] | 메모리의 값을 AC에 저장 |
STORE X | M[X] <- AC | AC의 값을 메모리에 저장 |
특징
- 필요한 오퍼랜드는 X 1개이다.
- AC가 있기 때문에 데이터를 어디서 가져오고 저장할지를 생략할 수 있다. (다중 레지스터와 비교하면 이해할 수 있다.)
다중 레지스터
AC가 없는 경우 2개 이상의 레지스터를 사용하여 명령어를 처리한다.
R1, R2, R3 : 서로다른 레지스터 주소
명령어 | 의미 | |
ADD R1, R2, R3 | R3 <- R1 + R2 | R1, R2 값을 더하고 R3에 저장한다 |
ADD R1, R2 | R2 <- R1 + R2 | R1, R2 값을 더하고 R2에 저장한다 |
LOAD X, R1 | R1 <- M[X] | 메모리의 값을 R1에 저장 |
STORE R1, X | M[X] <- R1 | R1의 값을 메모리에 저장 |
스택(stack)
흔히 알고 있는 LIFO 구조이다. 마지막에 넣은 데이터가 가장 먼저 빠져나온다.
TOS : Top Of Stack. stack의 가장 위쪽 데이터라는 의미이다.
명령어 | 의미 | |
ADD | TOS <- TOS + TOS-1 | stack에서 두 값을 꺼내 더하고 stack에 저장한다 |
PUSH X | TOS <- M[X] | 메모리의 값을 TOS에 저장 |
POP X | M[X] <- TOS | TOS의 값을 메모리에 저장 |
특징
- 필요한 오퍼랜드가 없다. stack에서 가져온다는 가정을 하기 때문이다.
오퍼랜드 수에 따른 명령어 형식
필요한 오퍼랜드 갯수에 따라 구분지었다.
예시 | |
3-주소 | ADD R1, R2, R3 |
2-주소 | ADD R1, R2 |
1-주소 | ADD X |
0-주소 | ADD |
필요 명령어 수 : 0-주소 > 1-주소 > 2-주소 > 3-주소
필요 비트 수 : 3-주소 > 2-주소 > 1-주소 > 0-주소
필요 명령어 수에 대해 설명할 필요가 있겠다.
X = (A + B) * C 를 계산한다고 하면아래와 같다.
필요 명령어 | |
3-주소 | ADD A, B, R1 MUL R1, C, X |
2-주소 | LOAD A, R1 ADD B, R1 MUL C, R1 STORE R1, X |
1-주소 | LOAD A ADD B STORE X LOAD C MUL X STORE X |
0-주소 | PUSH A PUSH B ADD PUSH C MUL POP X |
3에서 1로 갈수록 명령어가 늘어나는 것을 알 수 있다.
0-주소 명령어 스택의 경우, 1-주소와 갯수는 같지만 데이터의 입출력이 빈번하여 비효율적이다.
주소지정방식
주소지정방식이란 오퍼랜드가 데이터를 가져오는 방식에 대한 내용이다.
여기서 주소는 데이터가 위치하고 있는 주소를 의미한다.
유효주소 : 실제 데이터가 존재하는 주소
의미 주소지정 | 암묵적으로 생략된 주소. 1-주소 명령어의 경우 AC가 생략이 되어 있다. | ADD X; AC <- AC + M[X] |
즉치 주소지정 | 오퍼랜드 그 자체가 값이다. | ADD 100; AC <- AC + 100 |
직접 주소지정 | 오퍼랜드 그 자체가 유효주소이다. | ADD X; AC <- AC + M[X] |
간접 주소지정 | 유효주소를 저장하고 있는 주소. | ADD [X]; AC <- AC + M[M[X]] |
레지스터 주소지정 | 레지스터의 주소 | ADD R1, R2 ; R2 <- R1 + R2 |
레지스터 간접 주소지정 | 레지스터가 데이터가 저장된 메모리 주소를 가진 경우 | ADD (R1), R2; R2 <- M[R1] + R2 |
상대 주소지정 | 유효주소를 계산하기 위해 프로그램 카운터를 이용 | ADD $X; AC <- AC + M[X + PC] |
인덱스된 주소지정 | 주소와 레지스터 내용을 더해서 유효주소를 얻는다 | ADD X(R1); AC <- AC + M[X + R1] |
명령어의 종류
데이터 전송 | LOAD | LD | 기억장치로부터 레지스터로 전송 |
STORE | ST | 레지스터로부터 기억장치로 전송 | |
MOVE | MOVE | 기억장치에서 다른 기억장치로 | |
EXCHANGE | XCH | 두 기억장치간 데이터 교환 | |
PUSH | PUSH | 레지스터로부터 스택에 전송 | |
POP | POP | 스택으로부터 레지스터에 전송 | |
INPUT | IN | 레지스터와 입출력장치 간의 전송 | |
OUTPUT | OUT | ||
데이터 처리 | INCREMENT | INC | 1 증가 |
DECREMENT | DEC | 1 감소 | |
ADD | ADD | 덧셈 | |
SUBSTRACT | SUB | 뺄셈 | |
MULTIPLY | MUL | 곱셈 | |
DEVIDE | DIV | 나눗셈 | |
ADD WITH CARRY | ADDC | 올림을 포함한 덧셈 | |
SUBSTRACK WITH BORROW | SUBB | 내림을 포함한 뺄셈 | |
NEGATE | NEG | 2의 보수 | |
프로그램 제어 | BRANCH | BR | 조건 혹은 무조건적으로 유효주소로 분기 |
JUMP | JMP | ||
SKIP NEXT INSTRUCTION | SKP | 조건이 만족되면 다음 명령어를 수행하지 않고 넘어감 | |
CALL PROCEDURE | CALL | 서브루틴 호출 | |
RETURN FROM PROCEDURE | RET | 서브루틴 실행 후 복귀 | |
COMPARE | CMP | 뺄셈을 통해 상대 레지스터 값 반환 | |
TEST | TEST | 논리 AND 연산만 구현 |