우리는 지금까지 MIPS의 산술,논리 연산 명령어에 대해 배웠다. 이제는 데이터를 전달하는 명령어에 대해 배워보자!
high-level language에서 a+b = c 코드를 해석하는 순서
a = 3, b = 4, c = 7 / a:s5, c:$s6
1) data segement에 변수 a,b,c가 존재한다
- 메모리 주소는 32bits로 표현된다.
2) 연산을 위해서 $4, $5, $6(내가 정해둔 register)에 값을 전달한다.
3) processor에서 연산을 한다.
4) 연산된 값이 $6에 담겨 있고 이것을 변수 c의 값을 전달한다.
위에 2,3번을 보면 메모리에서 데이터를 가져올 수 있고,
반대로 연산된 정보를 register에 담아서 메모리에 업로드 할 수도 있다.
MIPS에서는 lw/sw를 통해서 이 과정을 구현할 수 있다.
=> memory에서 register
lw: 메모리로부터 레지스터에 1워드를 전송하는 Instruction
형식 : lw rd offset(base register) ex) lw $4, 8($5)
sw: 레지스터로부터 메모리에 1워드를 전송
형식: sw rd offset(base register) ex) sw $4, 8($5)
왜 주소를 offset(base register)로 표현하는걸까?
그 이유는 iformatdㅔ서 16비트까지 밖에 표현할 수 없기 때문에 32비트 표현이 되지 않는다 그래서 baseregister + offset형태로 주소를 표현한다.
ex) 메모리의 주소 : 0x10040011
$5 : 0x10040000 => 17($5)식으로 표현을 한다.
lw,sw는 I-format 형식으로 변환할 수 있다.
- rt : lw때 값을 받아오는 destination이나
sw때 값을 보내주는 source 역할의 register- rs : base register
- constant or address : offset(-2^15 ~ +2^15-1)
.data # -- 1)
a1: .word 3
b1: .word 4
c1: .word 5
.text
.globl main
main:
lui $t1 0x1001 # 주소할당을 위한 코드
lw $s4, ($t1) # -- 2)
lw $s5, 4($t1) # -- 2)
lw $s6, 8($t1) # -- 2)
add $s6, $s4, $s5 # --3)
sw $s6, 8($t1) # -- 4)
la(load address): 레지스터에 해당 주소를 로드하는 유사명령어
레이블의 주소를 옮길 때 많이 사용한다!
ex) la $5 A