ex) add, subtract, multiplication, division
operand
32개의 register중 하나가 선택됨
register
cpu 안에 위치하며 32bit 사이즈를 가진다. 총 32개가 있음.
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 단위로!
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
변수가 어느 register에 할당되어 있는지 확인
메모리에서 register로 A[8]의 값 불러오기
: A[8]의 값은 메모리에 저장되어 있음. 덧셈은 register에서만 가능하므로 A[8]의 값 불러오기
lw $t0,32,$s3
✅ 이때 8이 아닌 32가 offset인 이유는 alignment restriction에 때문. 배열 한 칸 당 메모리 상에서는 4byte 차이남.
값 더하기
add $s1,$s2,$t0
✅ sw로 메모리에 값을 다시 저장하지 않는 이유는, $s1은 saved register이므로 cpu에 값을 저장하고 있기때문
상수를 쓰려면 메모리에서 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
unsigned numbers
: 2진수 변환이랑 같음
signed numbers
: 맨 앞에 있는 비트가 sign 비트로 1인 경우 음수, 0인경우 양수
: 전부 1에서 전부 0이 되는 순간 부호가 바뀜 (- -> +)
: unsigned에 비해 표현할 수 있는 양이 줄어든다
signed <-> unsigned 방법
1. negation
: x + x바 = -1
📍 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
add 명령어에 op랑 function이 1:1 매핑되어 있음
나머지 값 맞추기
rd = $t0
rs = $s1
rt = $s2
(add에서는 shamt 값을 가지지 않고 항상 0임)