티스토리 뷰

ISA(Instruction Set Architecture)

한국어로 직역하면 "명령어 집합 구조"

ISA는 최하위 레벨의 프로그래밍 인터페이스로, 프로세서가 실행할 수 있는 모든 명령어들을 포함한다. 
명령어 집합, 곧 명령어 집합 구조는 자료형, 명령어, 레지스터, 어드레싱 모드, 메모리 구조, 인터럽트, 예외 처리, 외부 입출력을 포함한 프로그래밍 관련 컴퓨터 아키텍처의 일부이다. 

 

덧셈, 곱셈, 같은 약속들을 CPU에서 정해둔것!

 

MIPS Instruction Set

Type에 따라서

  • Arithmetic Instruction
  • Memory(Data Transfer) Instruction
  • Logical Instruction
  • Conditional Instruction
  • Branch/Jump Instruction
  • Floating Point Instruction
  • Pseudo Instruction
  • 그 외

Format에 따라서

  • R-format
  • I-format
  • J-format
  • Floating point instruction format

MIPS로 산술계산하기

add a, b, c 
# a = b+c
sub a, b, c
# a = b-c

 

실제로 c 코드 짤 때

a = b + c + d;

와 같이 썼다면,

add a, b, c

add a, a, d

로 내부적으로는 MIPS로 돌아가고 있는 것이다..!

 

또, 다른 예로 실제로 c 코드 짤 때

f = (g+h) - (i+j);

와 같이 썼다면,

add t0, g, h
add t1, i, j
sub f, t0, t1

 

로 내부적으로는 MIPS로 돌아가고 있을 것이다. 

 

사실 근데 MIPS는 a, t0, t1같은 변수를 내부적으로 쓰지 않는데,,, 'Register'을 연산할 때 변수 대신 사용한다. 

Register Operand

'레지스터'는 프로세서 내부에 있는 작은 메모리 공간이다. 

MIPS에는 32개의 32-bit register가 있는데, '$0'부터 '$31'까지이다. 

  • $v0, $v1 : 리턴 값 보관 ( reg: 2-3 ) -> 만약 8byte 이상이면 memory로.
  • $a0, ..., $a3: 함수 인자 보관 ( reg 4-7 )
  • $t0, ,..., $t9: 임시 변수 ( reg: 8-15, 24-25 )
  • $s0, ..., $s7: 저장된 변수 ( reg: 16-23 )
  • $gp : pointer to global area ( reg: 28 )
  • $sp : 스택 포인터 ( reg 29 ) 
  • $fp: 프레임 포인터 ( reg 30 )
  • $ra: 리턴 주소 ( reg 31 )
  • $zero : 진짜 0이다. 

위 예제를 실제 MIPS 코드로 작성하면, 

add $t0, $s1, $s2
add $t1, $s3, $s4
sub $s0, $t0, $t1

와 같이 되는 것이다. 

Stack

stack은 register가 아니라 memory에 저장되어서, stack pointer와 함께 사용된다. 

  • stack pointer은 가장 최근, 즉 low한 memory address를 가르키고 있다. 
  • stack은 high-> low memory로 저장된다. 

Memory Operand

레지스터가 용량이 작으니까, 모든 데이터를 저장할 수 없다. 

그래서 Load와 Store을 통해서 레지스터와 메모리 사이에서 데이터를 옮긴다. 

  • load word(lw): Memory -> Register
    • destination register, offset, base address 형식
    • lw $t0, 32($s3)
    • A[4]라면 $s3 = A의 주소, 4*8 = 32
  • store word(sw): Register -> Memory
    • sw $t0, 48($s3)
    • $t0의 값을 48($s3)에다가 보관한다는 뜻이다. 

ex) c코드

A[12] = h + A[8];

MIPS 코드)

lw $t0, 32($s3)
add $t0, $s2, $t0
sw $t0, 48($s3)

 

  • store word(sw): Register -> Memory

 

MIPS R-format Instruction

구성 요소

  • op: operation code, R인지 I인지 J인지 구분
    • R이면 000000
  • rs: first source register number
  • rt: second source register number 
  • rd:  destination register number
  • shamt: shift amount - 몇 칸이나 이동할지. 
    •  
  • funct: function code( op의 연장)
    • add이면 100000

예시

  • add
  • sub
  • and
  • or
  • nor : not을 표현하기 위해서!
    • a NOR b == NOT (a OR b)
    • !t1 를 표현하려면, nor $t0, $t1, $zero
  • slt (set-on-less-than)
    • slt rd, rs, rt : rs<rt이면 rd =1 , 아니면 rd=0
  • sll ( Shift left logical )
    • sll $t2, $s0, 4
    • sll하면 왼쪽으로 이동하므로, i bit 이동한다면 2^i를 곱하는 것과 같은 효과이다. 
  • srl ( Shift right logical )
    • sll하면 왼쪽으로 이동하므로, i bit 이동한다면 2^i로 나누는 것과 같은 효과이다.
  • jr (jump register)
    •  

beq, bne와 slt, slti 합쳐서 모든 instruction 생성하기

if a < b:
	branch to L

이라는 코드를 어떻게 만들면 될까?

 

 

MIPS I-format Instruction

I-format은 "immediate"라는 뜻이다. immediate한 add, sub나 load/store같은 연산들에 쓰인다. 

구성 요소

  • op: operation code, R인지 I인지 J인지 구분
    • S중에, lw는 100011
    • S중에, sw는 101011
  • rs: first source register number
  • rt: second source register number 
  • constant/address: offset added to base address in rs
    • -2^15부터 2^15-1까지 가능. 16비트니까!

예시

  • addi
  • beq ( branch-if-equal )
    • beq rs, rt, L1 : rs==rt이면 L1으로
  • bne ( branch-if-not-equal )
    • bne rs, rt, L1 : rs!=rt이면 L1으로
  • slti (set-on-less-than-immediate)
    • slti rt, rs, constant: if rs< constant rt = 1 else rt =0
  • andi
  • lui ( load-upper-immediate) 
    • 16-bit 상수를 왼쪽 16bit에 복사하고, 오른쪽 16비트는 0으로 채워준다 .
  • ori ( or immediate )
    • lui 하고 나서 오른쪽 16비트를 채우기 위해서 사용한다. (addi보다 좋다..!)
  • lw, sw
  • lb, lh
  • lbu, lhu
  • sb, sh

MIPS J-format Instruction

jump라고 하는데 아직 안나옴

 

예시 ) Loop 만들기

 

C 언어로 된 while루프를 MIPS코드로 만들어 보자!

// C언어
while (save[i] ==k)
	i += 1;

i는 $s3에, k는 $s5에, save의 주소는 $s6에 있다고 가정한다. 

// WIP

MIPS Green Card

Function Calling

함수 실행의 단계를 알아보자!

 

1. register에 parameter(함수인자, 등등..)을 넣는다. 

2. 함수 부분을 실행한다. 

3. 스택

4. 함수를 실행한다.

5. 기존에 실행하던 함수를 위해서, register에 결과를 넣는다 .

6. 함수 실행 전에 실행되던 부분으로 돌아간다. 

 

* pc

* ra

 

  • jal (jump and link)
    • jal {Label}
    • 1) link: (Program counter +4) 를 $ra register에 넣는다. 
    • 2) jump: pc = (이동할 address)
  • jr ( jump register )
    • jr $ra
      • pc = $ra 를 시행한다! 

 

예시 ) Non-Leaf Procedures ( 반복적 호출 )

int factorial(int n) {
	if (n<1) return f;
    else return n*factorial(n-1);
}

// WIP

 

Memory Layout 

 

예시 ) string 복사하기

void strcpy(char x[], char y[]) {
	int i;
    i = 0;
    while((x[i]=y[i]) != '\0') {
		i += 1;
    }
}

예시 ) swap하기

void strcpy(char x[], char y[]) {
	int i;
    i = 0;
    while((x[i]=y[i]) != '\0') {
		i += 1;
    }
}

예시 ) bubble sort 하기

void strcpy(char x[], char y[]) {
	int i;
    i = 0;
    while((x[i]=y[i]) != '\0') {
		i += 1;
    }
}

quick sort, selection sort, insertion sort

PC-relative addressing for branch addressing

 

// WIP

 

 

Addressing Mode 정리하기

 

Assembler Pseudo-instructions

assembly에서만 쓰고, 실제로 assemble하면 다른 instruction으로 대체되는 명령어들

  • move
  • blt

Intel's x86 Instruction 

MIPS는 교육용 언어라서 모든 instruction이 32bit였다. 그러나 x86같은 경우에는 1~17byte로 다양한 instruction size가 존재한다. 

 

Register관련 특이점

보통 레지스터에 쓸 때 Rs에다가 바로 쓸거라고 생각했는데

전혀다르다. 

 

Read Register1, Read Register2, Write Register, Write Data가 있고

Read Data 1, Read Data 2가 있는걸 볼 수 있다. 

 

Write Register에 어떤 레지스터에 쓸건지, Write Data에 뭘 쓸건지 넣어야 쓸 수 있다..!

내가 헷깔렸던 부분이다...

 

 

 

[출처]

http://melonicedlatte.com/computerarchitecture/2019/01/30/192433.html

https://www.d.umn.edu/~gshute/mips/rtype.xhtml

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함