본문 바로가기
ੈ✩‧₊˚Computer Science/컴퓨터구조

[컴퓨터구조] 데이터패스(Datapath) 명령어 실행(MIPS)

by 샨샨 2020. 10. 30.
반응형

Datapath로 우리가 실행해 볼 명령어

1. 메모리 접근 명령어(memory-reference instructions) : lw , sw

2. 산술 논리 연산 명령어(arithmetic-logical instructions) : add, sub, and, or, slt

3. 흐름 제어 명령어(control flow instructions) : beq, j

 

Datapath에서 명령어를 수행하는 과정

Fetch

1.PC 값을 이용해 명령어가 들어있는 주소(instruction address)를 찾는다.

2.메모리로부터 그 주소에 들어있는 명령어를 가져온다.(get intruction from memory)

Decode

3.조합회로 내에서 간단하게 어떤 명령어인지 해석한다.

Execute

4.필요한 레지스터값을 읽는다.

5.레지스터값으로 연산을 진행한다.

 

Add 연산

add rd, rs, rt ( rd <- rs + rt )

  • IR <- mem[PC]  // PC값을 이용해 intruction을 memory로부터 fetch하고 그 값을 instruction register(IR)에 저장한다.
  • R[rd] <- R[rs] + R[rt] //IR의 처음 6bit(opcode)를 보고 add 임을 확인하고 rs + rt 값을 rd register에 저장한다.
  • PC <- PC + 4 //다음 명령어 실행을 위해 PC + 4를 해준다.

Sub 연산

sub rd, rs, rt ( rd <- rs - rt )

  • IR <- mem[PC]  // PC값을 이용해 intruction을 memory로부터 fetch하고 그 값을 instruction register(IR)에 저장한다.
  • R[rd] <- R[rs] + ~R[rt] + 1 //IR의 처음 6bit(opcode)를 보고 sub 임을 확인하고 rs + rt의 2의 보수 값(= -rt)을 rd register에 저장한다.
  • PC <- PC + 4 //다음 명령어 실행을 위해 PC + 4를 해준다.

lw 연산

lw rt, rs, imm16 ( rt <- memory[rs+imm16] )

  • IR <- mem[PC]  // PC값을 이용해 intruction을 memory로부터 fetch하고 그 값을 instruction register(IR)에 저장한다.
  • Addr <- R[rs] + SignExt(imm16) //메모리 주소를 계산한다. (rs 레지스터 값 + 32bit로 sign extension한 Immediate 상수값)
  • R[rt] <- Mem[Addr]  /계산한 메모리주소를 이용해 rt register로 값을 load
  • PC <- PC + 4 //다음 명령어 실행을 위해 PC + 4를 해준다.

sw 연산

sw rt, rs, imm16 ( rt <- memory[rs+imm16] )

  • IR <- mem[PC]  // PC값을 이용해 intruction을 memory로부터 fetch하고 그 값을 instruction register(IR)에 저장한다.
  • Addr <- R[rs] + SignExt(imm16) //메모리 주소를 계산한다. (rs 레지스터 값 + 32bit로 sign extension한 Immediate 상수값)
  • Mem[Addr] <- R[rt]   //rt register의 값을 미리 계산된 메모리 주소로 store
  • PC <- PC + 4 //다음 명령어 실행을 위해 PC + 4를 해준다.

beq 연산

beq rt, rs, imm16 ( rt <- memory[rs+imm16] )

  • IR <- mem[PC]  // PC값을 이용해 intruction을 memory로부터 fetch하고 그 값을 instruction register(IR)에 저장한다.
  • Cond <- R[rs] + ~R[rt] + 1 //rs 레지스터 값과 rt 레지스터 값이 같은지 다른지 계산한다. ( if  Cond = 0 rs = rt , otherwise, rs != rt)
  • PC <- Cond ? PC + 4 : PC + 4 + (SignExt(imm16) << 2)  // if Cond != 0 , 다음 명령어 실행을 위해 PC + 4를 해준다. if Cond ==0 , 32bit로 sign extension 한 immediate 상수값 << 2 + ( PC + 4 ) 

* 상수값이 명령어의 주소일 경우에는 shift left 2 ( 곱하기 4 ) 를 해서 PC 값에 더해야 한다.

* branch를 할 때는 다음 번 명령어를 기준으로 한다.(PC + 4)

 

 

 

 

 

반응형