CS/컴퓨터 구조

[컴퓨터 구조] Instructions

윤곰이 2024. 6. 15. 22:20
학교에서 들은 컴퓨터 구조 강의 내용을 복습하면서 작성한 글입니다.
March 20, 2024 3:53 PM

Stored Program Computer (폰노이만 컴퓨터)

  • 프로그램(binary code로 구현), 데이터가 메모리 안에 저장되어 있는 구조
  • Binary Compatibility → 컴파일된 프로그램이 다른 컴퓨터들에서 작동할 수 있도록
  • ISA(Instructions Set Architecture)

MIPS instruction set

  • 입력 operand는 2개까지만 가능
  • Arithmetic Operations

Registers

  • small amount of fast storage
  • MIPS: 32x 32bit registers

Using Memory Values

  1. memory의 값을 register에 load
  2. register의 값 Processor의 ALU에서 계산 후 결과 다시 register로
  3. register에 있는 결과값을 memory로 store

Register Operands

  • t0 ~t9: temporart values
  • s0~s7 : saved values

Memory Operands(메모리 주소 체계)

  • 메모리는 byte-addressed (1byte=8bit)
  • words(4bytes = 1word) are aligned → 주소는 4의 배수
  • MIPS : Big Endian

Endiannes

  • data가 메모리에 저장되는 방식

UTF-16

  • 16bit(2byte) Unicode transformation : 한글, 타문자..
  • 1 character = 2bytes or 4 bytes
    • 예: 가 = 0xAC00 → big Endian: AC 00/ Little Endian: 00 AC

Byte Order Mark

  • UTF-16 파일의 앞부분에 있는 dummy character = 0xFEFF
  • 순서 나타내는 mark(Endian 다른 machine이 이상하게 읽는 것 방지
    • FEFF 로 읽힌다면 Big Endian 사용, FFFE로 읽힌다면 Little Endian 사용해서 만들어졌음을 알수 있음

Example

  1. C code: g = h + A[8];
  2. (g는 $s1, h는 $s2, A의 시작주소는 $s3)

A[0] 의 시작주소: 0x1000

A[8]의 주소(pointer): &A[0] + 8*sizeof(int) = &A[0] + 32 = 0x1032

→ compiled MIPS code

	lw $t0, 32($s3) //load word
	add $s1, $s2, $t0

lw Rd, A(Rm)

  • Rd: 메모리에서 값이 load되는 레지스터
  • A: 메모리 offset (byte) - 기존주소에서 얼만큼 떨어졌는지!
  • Rm: 메모리 주소가 저장된 레지스터(base address의 주소)

  1. C code: A[12] = h + A[8]; 
  2. lw $t0, 32($s3) //load word add $t0, $s2, $t0 sw $t0, 48($s3) //store word
  3. (h는 $s2, A의 시작 주소는 $s3)
  4. C code(sum: $s1, i: $s2, A: $s3)
    addi $t0, $t0, 4
    lw $t1, 0($t0)
    add $s1, $s1, $t1
    
  5. → compiled MIPS code
  6. for (i = 0 ; i < 10; i++) sum += A[i];

Instructions

Immediate Operands(상수 Operand)

  • 명령어에 상수 포함 addi $s3, $s3, 4
  • subtract(뺄셈은 따로 없음 → 뺄셈도 덧셈임: 음수 더하기) X addi $s2, $s1, -1

The Constant Zero

  • MIPS register 0 ($zero) 는 상수 0 임 → overwritten 안됨
  • userful
    • move between registers: add $t2, $s1, $zero ($t2 ← $s1)
    • loading immediate value: addi $t2, $zero, 10

Load Immediate Value

  • li 명령어
  • li $d, immediate_value
    • li $t0, 100
    • li $t0, 0x10
    • add $t3, $t1, $ t2
  • real instruction이 아닌 합성명령어임(coding의 편리를 위해)

Multiply

  • 값 2개 받고, 결과 쪼개서
    • 32bit X 32bit → 64bit(32bit 두개의 결과값)
    • 예) $11_2 \times 11_2 = 110_2 + 11_2 = 1001_2$
  • mult $r, $s → 곱하고 결과를 HI, LO (결과값 담는 register) 에 PUTHI LO
  • mfhi $d
    • HI에 있는 곱셈 결과를 $d로 이동
  • mflo $d
    • LO에 있는 곱셈 결과를 $d로 이동
  • mul $d, $r, $s
    • $r 과 $s를 곱하고 [31:0]의 결과를 $d 로 put → 값 크지 않으면 결과를 바로 register에

Divide

  • div $r, $s
    • $r을 $s로 나누고, 결과를 LO에, 나머지는 HI에

  • binary인 경우에 곱셈길를 나눗셈기로 사용가능

 

Data Transfer

  • lw, lh, lb: load (word, halfword, byte)
  • sw, sh, sb: store
  • lui :load upper immediate (upper bit에 값 복사)
    • lui, $t0, 0x2 → $t0: 0x20000