2. Instructions: Language of the Computer(4) - MIPS 명령어 형식 (Instruction Formats)
#Computer_Architecture
명령어 표현
- 명령어는 이진수로 인코딩되며, 이를 machine code라고 부릅니다.
- MIPS 명령어는 32비트 명령어로 인코딩됩니다.
- opcode의 경우 앞에 6bit를 보고 나머지 26비트가 어떤 필드로 구성되어 있는지 결정된다.
- add $t1, $s0, $s1
- add인지 아닌지(opcode), 어떤 레지스터를 활용하는지(5bit) X 3….
- 이 내용에 대한 세부 내용들은 아래에서 다룸
- 적은 수의 포맷으로 구성되어 있으며, 각 포맷은 연산 코드(opcode), 레지스터 번호 등을 포함합니다.
- Register numbers
- $t0 – $t7 are reg’s 8 – 15
- $t8 – $t9 are reg’s 24 – 25
- $s0 – $s7 are reg’s 16 – 23
여기서 레지스터들은 따로 배울 겁니다. 요런 식으로 레지스터가 구성되어 있다는 것만 알고 넘어가면 된다.
16진수
- 16진수는 비트 문자열의 압축 표현입니다.
- 4비트는 1개의 16진수 숫자로 표현됩니다.
- 예시:
eca8 6420 = 1110 1100 1010 1000 0110 0100 0010 0000
- 예시:
MIPS R-포맷 명령어 (R : Register)
R-포맷 : 레지스터가 3개 들어간다. add 명령어를 떠올리면 될 듯
피연산자가 두 개 있고 목적지가 하나인 명령어에 쓰인다. (add, sub, and 등의 산술 연산)
- 명령어 필드:
- op: 연산 코드 (opcode)
- ex)opcode를 보고 funct 코드봐서 add 명령어 임을 확인했으면, 뒤에 어떤 포맷으로 구성되어있는지 알 수 있다(dest 1개, source 2개, …)
- rs: 첫 번째 소스 레지스터 번호
- rt: 두 번째 소스 레지스터 번호
- 알파벳 s 다음 t라서… t에 다른 의미가 있는건 아님
- rd: 목적지 레지스터 번호
- 주의! 어셈블리는 목적지 소스 소스 순이지만, R포맷은 소스 소스 목적지임.
- shamt: 시프트 값 (현재는 00000으로 설정)
- funct: 함수 코드 (opcode를 확장)
- R-포맷임을 확인했다면 funct 코드도 확인해야 한다.
- op: 연산 코드 (opcode)
R-포맷 예시
아래와 같이 시험문제에서 코드는 알려준다. 포맷은 외워두자!
MIPS I-포맷 명령어(Immediate)
I-포맷 : 레지스터가 2개이다. addi나 lw를 떠올려보세요.
모든 명령어의 길이를 같게 하되, 명령어 종류에 따라 형식은 다르게 하는 방법
- Immediate arithmetic 및 load/store 명령어(lw, sw)는 I-포맷을 사용합니다.
- ex)
lw $s1, 32($t0)
- ex)
- constant에는 음수가 올 수 있다.
- Constant 범위는 -2^15 ~ 2^15 - 1
- 레지스터는 32비트이기 때문에 16비트를 sign extension 해줘야 한다.
- 여기서 rt는 destination이다. (or source register number)
- lw를 사용하면 rs에 주소 레지스터, rt에 저장할 레지스터, address에 오프셋이 들어감.
- 설계 원칙 4: 좋은 설계는 좋은 타협을 요구합니다.
- I-포맷은 32비트 명령어를 균일하게 유지하면서도 복잡한 디코딩을 피할 수 있습니다.
- 가능한 포맷을 단순하게 유지한다
저장 프로그램 컴퓨터
이 시점에서 "그렇다면 우리가 배운 이 명령어들은 데이터와 함께 어떻게 컴퓨터에 저장되고 처리될까?
- 명령어는 데이터처럼 이진수로 표현됩니다.
- 위에서 봤던 것처럼 32비트로
- 명령어와 데이터는 메모리에 저장됩니다.
- 프로그램은 프로그램에 대해 동작할 수 있습니다 (예: 컴파일러, 링커 등).
- 바이너리 호환성을 통해 컴파일된 프로그램이 다른 컴퓨터에서 작동할 수 있습니다.
- Standardized ISAs
- ex) x86 ISA로 컴파일 된 프로그램은 x86 아키텍쳐에서 동작하는 어떤 컴퓨터에서든지 동작한다.
Jump Addressing : J - 포맷
J 포맷과 관련된 내용은 뒤에서 자세히 다루게 된다. J - 포맷이 있다 정도만 알고 넘어가자.
j와 jal의 경우 무조건 점프한다. 따라서 타겟 주소만 있으면 된다. 이러한 포맷을 J-포맷이라고 함.
j
와jal
명령어의 목표는 텍스트 세그먼트 어디에든 위치할 수 있다.- 명령어에 전체 주소를 Encode 한다.