2-1) Instructions

서진·2023년 4월 15일
0

컴퓨터구조

목록 보기
3/8

Arithmetic Operations

ex) add, subtract, multiplication, division

  1. 하나의 라인에는 하나의 instruction만 주어짐
  2. 하나의 operation에는 3개의 operands를 가짐 (source 2개, destination 1개)
    add a, b, c # a = b + c
    add a, a, d # a = (b + c) + d

operand 32개의 register중 하나가 선택됨

register cpu 안에 위치하며 32bit 사이즈를 가진다. 총 32개가 있음.

  • $s0 ~ $s7 : saved register (변수 저장)
  • $t0 ~ $t9 : temporary register (잠깐 값 저장할 때)
  • 0 : 미리 저장되어 있음. (hard wiring)
  • 나머지 13개

Memory Operand

CPU <--> Main Memory (DRAM) 간에 데이터 transfer의 기능을 함
모든 arithmetic 연산은 register에서 이루어지므로 main memory에서 데이터를 가져와야 함!

📍 1. lw (load word)
: main memory -> cpu
: 메모리에서 register로 1 word size(32bit) 데이터 가져오기

main memory $s2 + 20 위치에서 cpu의 $s1으로 데이터를 가져오겠다

lw $s1 20 $s2 

$s1 : 목적지
20 : offset
$s2 : base address (기준이 되는 위치)

📍 2. sw (store word)
: cpu -> main memory
: 메모리에 1 word size(32bit) 데이터 저장하기

cpu의 $s1의 데이터를 메인메모리 $s2 + 20위치에 넣겠다.

sw $s1 20 $s2

❓ 왜 word 단위지?
=> register가 32bit (1 word) 단위이니깐 main memory에서 가져오거나 저장할 때도 word 단위로!


Alignment restriction

cpu와 main memory를 memory operand를 통해서 왔다갔다 할 때 byte 단위로 addressing 하겠다
=> MIPS에서 메모리의 주소는 항상 4의 배수!

메모리 하나의 slot = 1 word size = 32bit = 4 byte

4 byte (시작이 8 byte)
4 byte (시작이 4 byte)
4 byte (시작이 0 byte)

🚨 단위

1 word = 32bit
32 bit = 4 byte
1 byte = 8 bit

  1. 변수가 어느 register에 할당되어 있는지 확인

  2. 메모리에서 register로 A[8]의 값 불러오기
    : A[8]의 값은 메모리에 저장되어 있음. 덧셈은 register에서만 가능하므로 A[8]의 값 불러오기

    lw $t0,32,$s3
    
    ✅ 이때 8이 아닌 32가 offset인 이유는 alignment restriction에 때문. 배열 한 칸 당 메모리 상에서는 4byte 차이남. 
  3. 값 더하기

    add $s1,$s2,$t0
    
    ✅ sw로 메모리에 값을 다시 저장하지 않는 이유는, $s1은 saved register이므로 cpu에 값을 저장하고 있기때문

Constant, Immediate Operands

상수를 쓰려면 메모리에서 register로 lw해와서 써야 했음

lw $t0 AddrConstant4 $s1
add $s3,$s3,$t0

-> 상수가 엄청 자주 등장하는데 너무 비효율적!

📍 addi (add immediately)
메모리에 접근 안 하고 상수를 바로 쓸 수 있는 instruction을 만들자

addi $s3,$s3,4

subtract immediately는 없음
addi $s3,$s3,-1

📍 $s0
0은 자주 쓰이니까 0번 register를 0으로 hard wiring 해둠

📍 move operation
pseudo instruction : operand가 3개가 등장하지 않음
register끼리 옮기는 경우 사용

$s1에 있는 데이터를 $s2에 옮겨올 때
addi $s2,$s1,0

move operation
move $s2,$s1

Signed and Unsigned Numbers

  1. unsigned numbers
    : 2진수 변환이랑 같음

  2. signed numbers
    : 맨 앞에 있는 비트가 sign 비트로 1인 경우 음수, 0인경우 양수
    : 전부 1에서 전부 0이 되는 순간 부호가 바뀜 (- -> +)
    : unsigned에 비해 표현할 수 있는 양이 줄어든다

signed <-> unsigned 방법
1. negation
: x + x바 = -1

  1. sign extension
  • unsinged extension : 왼쪽 16개를 0으로 채우기
  • signed extension : 왼쪽 16개를 1로 채우기

assembly -> binary

📍 1. R-format
: arithmetic operation (6개 필드 / add, subtract)

operation | register source | register target | register destination | shift amount | function

op | rs | rt | rd | shamt | funct

📍 2. I-format
: data transfer operation (4개 필드 / lw, sw)

op | rs | rt |  |

📍 3. J-format
: jump operation (2개 필드)

op |  |

add $t0,$s1,$s2 를 machine language로 바꾸려면?
1. instruction format 확인
-> add는 operation이니깐 R-format

  1. add 명령어에 op랑 function이 1:1 매핑되어 있음

  2. 나머지 값 맞추기
    rd = $t0
    rs = $s1
    rt = $s2

(add에서는 shamt 값을 가지지 않고 항상 0임)

profile
🫧 ☁️ 🌙 👩🏻•💻 🌿 🐱 🖱 🍟 🚀 ⭐️ 🧸 🍀 💗

0개의 댓글