[컴퓨터 시스템 구조] 2장 명령어: 컴퓨터 언어

[컴퓨터 시스템 구조] 2장 명령어: 컴퓨터 언어

Book Title : 컴퓨터 구조 및 설계
Author : David A. Patterson , L. Hennessy
Publisher : 한티미디어

이론보다 MIPS코드 짜는 법

2. 명령어: 컴퓨터 언어


2.1 서론


Instruction Set

  • 명령어 집합
  • 마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 기계어 명령어.
  • SW와 HW사이에서 동작(중재자)
  • 단순할수록 성능이 좋다.

설계 원칙

  1. 간단하게 하기 위해서는 규칙적인 것이 좋다.
  2. 작은 것이 더 빠르다.(항상 그런것은 아님)
  3. 좋은 설계에는 적당한 절충이 필요하다.

2.2 하드웨어 연산


MIPS 산술 명령어

  • 반드시 한 종류의 연산만 지시
  • 항상 변수 3개 가짐
  • 줄이 끝나면 주석도 끝남
  • 설계 원칙1
1
2
3
4
5
6
7
<C>
a = b + c;
d = a - e;

<MIPS>
add a, b, c
sub d, a, e

2.3 피연산자


  • MIPS 구조에서 레지스터의 크기는 32비트, 이를 한 워드(word)라고 부름
  • 레지스터의 개수 또한 32개다.
  • 설계 원칙2

메모리 피연산자

  • 데이터 전송 명령어 (전송 방향에 주의)
    • lw (load word) 메모리 <- 데이터
    • sw (store word) 메모리 -> 데이터
1
2
3
4
5
6
7
<C>
A[12] = h + A[8];

<MIPS>
lw $t0, 32($s3)
add $t0, $s2, $t0
sw $t0, 48($s3)
  • MIPS에서 워드의 시작 주소는 항상 4의 배수임.
  • MIPS는 빅엔디안(big-endian)을 사용함.

상수 피연산자

  • addi $s3, $s3, 4 #$s3 += 4
  • $zero #0
  • 자주 생기는 일을 빠르게의 좋은 예

2.4 부호있는 수와 부호없는 수


  • LSB(Least significant bit) : 가장 낮은 주소(오른쪽) 비트
  • MSB(most significant bit) : 가장 높은 주소(왼쪽) 비트
  • MSB가 0이면 양수, 1이면 음수
  • 역부호화 : 모든 비트를 뒤집고 1 더하기

2.5 명령어의 컴퓨터 내부 표현


  • 레지스터 이름을 숫자로 매핑하는 규칙

    • &t0 ~ $t7 은 8 ~ 15번
    • &s0 ~ $s7 은 16 ~ 23번
  • MIPS명령어의 필드

  • 위 명령어 형식을 R-format이라고 하는데 네번째 필드 길이가 R타입의 나머지 세 필드 길이를 더한 것과 같은 I-format도 있다.

  • 설계 원칙 3


2.6 논리연산 명령어


  • 명령어 a, b, c
    • a = b 명령어 c
  • sll (shift left)
  • srl (shift right)
  • and, andi (bit-by-bit AND)
  • or, ori (bit-by-bit OR)
  • nor (bit-by-bit NOT)

판단을 위한 명령어


  • beq rs, rt, L1
    • if (rs == rt) branch to L1;
  • bne rs, rt, L1
    • if (rs != rt) branch to L1;
  • blt, bge같은게 없는 이유는 클럭이 느려지기 때문(상대적으로 복잡)
  • slt, slti / sltu, sltui
    • slt $t0, $s3, $s4
    • slt(set on less than) : 왼쪽 값이 작으면 1, 크면 0으로 세팅

j는 점프


하드웨어의 프로시저 지원


프로그램이 프로시저를 실행할 때의 6단계

  1. 프로시저가 접근할 수 있는 곳에 인수를 넣는다
  2. 프로시저로 제어를 넘긴다
  3. 프로시저가 필요로 하는 메모리 자원을 획득한다
  4. 필요한 작업을 수행한다
  5. 호출한 프로그램이 접근할 수 있는 장소에 결과 값을 넣는다
  6. 프로시저는 프로그램 내의 여러 곳에서 호출될 수 있으므로 원래 위치로 제어를 돌려준다

레지스터 할당

  • $a0 - $a3 : 전달할 인수를 가지고 있는 인수 레지스터 4개
  • $v0 - $v1 : 반환되는 값을 갖게되는 값 레지스터 2개
  • $ra(return address) : 호출한 곳으로 되돌아가기 위한 복귀 주소를 가지고 있는 레지스터 1개

명령어

  • jal (jump-and-link-instruction)
    • jal ProcedureAddress
    • 지정된 주소로 점프하면서 동시에 다음 명령어의 주소를 $ra레지스터에 저장하는 명령
  • jr (jump register)
    • jr $ra
    • 레지스터에 저장된 주소로 무조건 점프

새 데이터를 위한 스택 공간의 할당


새 데이터를 위한 힙 공간의 할당