[Pep/8] Instruction 구조 및 Cycle
IT/Computer Science

[Pep/8] Instruction 구조 및 Cycle

728x90
반응형

Pep/8 Assembler & Simulator

Pep/8은 어셈블리 언어를 기계어로 번역하고, 기계어를 프로그래밍하여 실습 할 수 있는 16bit 가상머신이다.

다운로드 : http://computersystemsbook.com/4th-edition/pep8/

 

CPU, Register

  • NZVC (Status bits)
    - Instruction 결과의 상태를 나타내는 bit
      (Negative : 음수, Zero : 0, oVerflow : 오버플로우, Carry : 캐리)
  • Accumulator
    - 연산 시 사용되는 레지스터
  • Index Register
    - 인덱싱 시 사용되는 레지스터 (array, stack 등)
  • Program Counter
    - 다음에 수행할 Instruction의 주소 값을 저장
  • Instruction Register
    - 메인메모리에 있는 Instruction을 저장하는 레지스터

 

Instruction 구조

Pep/8의 경우 3Byte 명령어 체계이다.

3Byte 중 1Byte는 명령을 나타내는 Instruction Specifier이며, 2Byte는 피연산자를 나타내는 Operand Specifier이다.

Operand Specifier가 2Byte인 이유는 Pep/8 가상머신이 16bit 연산체계로 되어있기 때문이다.

(즉, Pep/8에서는 16bit 이상의 주소 및 값의 표현이 불가능하다)

 

Instruction Specifier는 8bit로 이루어져 있으며, Operation Code와 Register mode, Address mode 등의 정보를 포함하고 있다.

- Operation code (opcode) : 수행할 명령어를 나타내는 부호

- Register mode : 어느 레지스터를 사용할지 지정 (0 : Accumulator / 1 : Index register)

- Addressing mode (000 : Immediate mode / 001 : Direct mode)
   - Immediate mode : 뒤에 2Byte 값을 Operand(피연산자)로 사용

   - Direct mode : 뒤에 2Byte 값이 Operand Specifier(피연산자 지시자)  // 해당 주소에 있는 값을 피연산자로 사용

 

예를 들어, 01110001 00000000 00001111 라는 Instruction을 보자.

Instruction Specifier는 0111raaa 이며 "ADD to r" 이라는 뜻이다. (레지스터의 값을 더하라)

Register mode가 0이므로 Accumulator 레지스터를 가르키고, Addressing mode가 001로 Direct mode이다.

이를 토대로 해석해보면, Accumulator 레지스터에 있는 값에 메인메모리 1111 번지의 값을 더하라는 명령어임을 알 수 있다.

 

Pep/8 Instruction set은 아래 표를 참고하면 된다.

 

명령어 수행 Cycle

명령어는 Fetch → Decode → Execution 순서로 이뤄진다.

이를 코드로 설명하자면 아래와 같다

PC = 0                             // Program Count Register : 0번째 Instruction부터 실행

do{
  instruction fetch                // instruction의 앞부분 1byte를 가져옴
                                   // (1byte짜리 명령어인지 3byte짜리 명령어인지 모르기 때문)
  PC = PC + 1                      // 다음에 실행할 instruction 지정
  instruction decoding             // 1byte짜리인지 3byte짜리인지 판단
  if(instruction is not unary){    // unary instruction(1byte 명령어)가 아니면,
    operand fetch                  // 나머지 2byte를 가져옴 : 나머지 2byte는 operand(피연산자)
    PC = PC + 2
  }
  instruction execution            // instruction 실행
}while(it is not stop instruction) // stop instruction이 나오기 전까지 loop

Fetch 단계에서 Instruction Specifier을 가져오고 PC값을 1 증가시킨다. (이후에 다음 Instruction을 수행해야 하기 때문)

Instruction Specifier를 Decoding하여 unary 명령어인지 3Byte 명령어인지 구분한다.

3Byte 명령어라면 나머지 2Byte Operand Specifier를 가져오고 PC값을 2 증가시킨다.

이후 Execution 단계에서 명령어를 수행하는 것이다.

728x90
반응형