간단한 산술동작
add a, b, c # a = b + c
sub a, b, c # a = b - c
간단한 산술동작으로부터 규칙성을 가지도록 하면, 구현함에 있어 굉장히 간단해진다.
조금 복잡한 산술동작
f = (g+h) - (i+j);
각각의 부분 결과를 저장할 수 있어야한다. 즉
add t0, g, h # temp t0 = g + h
add t1, i, j # temp t1 = i + j
sub f, t0, t1 # f = t0 - t1
t0 와 t1은 각각의 계산을 잠깐 저장할 임시저장소이다.
즉. 임시 결과를 저장하는 요소가 필요한데, 그것을 레지스터(register) 라고 한다.
그리고 컴파일러가 각각의 값들을 여러 레지스터 중 어디로 매핑할것인지 작업하게된다.
연산에 필요한 값을 메모리로부터 가져오는 경우
g = h + A[8] // Assume g in $s1, h in $s2
// Base address of A in $s3
h : 임의의 레지스터에 들어있다.
A[8] : 메모리에 들어있는 배열의 한 요소
Compiled MIPS (Index 8 requires offset of 32)
lw $t0, 32($s3) #32 is offset, $s3 base register
add $s1, $s2, $t0 #g = h + A[8]
32($s3) 은 메모리 내의 위치 주소값를 나타낸다.
lw $t0, 32($s3) 는 32($s3) 에서 값을 가져와 임시 저장소인 $t0에 저장하는것이다. - 메모리로부터 값을 가져오는 load
MIPS Operands
MIPS는 load-store register architecture 라고 부른다
- 32개의 레지스터, 각각은 32-bit (4 bytes) 의 길이를 갖고있다.
- 메모리 주소는 32-bit의 길이를 갖고있다.
- 각각의 word는 32-bits (4bytes)
- 프로세서와 메모리 사이의 공통 전송 단위
- 일반적으로 레지스터 크기, 정수 크기 및 명령 크기와 일치한다.
Memory Content : Big Endian vs. Little Endian
word가 byte0 ~ byte3 또는 byte1 ~ byte4 ..... 이런식으로 저장이 되어있다.
이때 byte0 ~ byte3에 저장이 되어있다고 할때, word를 대표하는 주소는 byte0일까 byte3일까?
하나의 word 주소를 대표하는 byte를 0로 할것인지 3으로 할것인지 문제가 발생한다.
- Big Endian : word 주소를 표현할 때 제일 왼쪽의 byte를 기준으로 표현
- 제일 왼쪽의 byte가 이 word를 나타내는 주소가 된다.
- Little Endian : 제일 오른쪽의 byte를 기준으로 표현
- 제일 오른쪽의 byte가 word 주소가 된다.
왜 문제가 될까?
서로 다른 방식을 따르는 두 컴퓨터 사이에 데이터를 주고받는다면, 주소는 같지만 그 위치에 있는 내용은 다르게 되는 현상이 발생할 수 있다.
따라서 그 값을 일치시켜주는 작업 (swap) 을 해야한다.
즉각적인 산술동작
예를 들어 명령어 내에 상수 데이터가 표현이 되어야 할 때.
a = b + 5
addi $s3, $s4, 5
자주 발생하는 케이스에 대해서 빠르게 처리하기 위한 방법으로써 Immediate Operands 는 이렇게 표현하게 된다.
실질적으로 load를 덜 하게되면 성능면에서 이득이니깐.
Constant Zero
실제로 MIPS 에서는 register 0 을 상수 0 으로 활용하고있다.
주소는 $zero
레지스터값을 복사한다던가 할때 굉장히 유용하게 사용할 수 있다.
add $t2, $s1, $zero -> $s1 레지스터에 있던 값이 $t2로 복사됨!
- 메모리에 있는 값을 물리적인 구성인 버스를 통해 읽어온다. (load)
- 읽어온 값을 컴파일러가 매핑한 임의의 레지스터에 저장한다.
- 저장한 값을 가져다 ALU 중 가산기에서 더하기를 한다.
- 더한 결과를 일시적으로 임의의 레지스터에 저장한다.
- 레지스터의 내용을 메모리로 다시 보낸다 (store)
MIPS operands (참고)
Signed and Unsigned Numbers (Ch 2.4)
Signed binary number 를 표기하는 세가지 방법
- 제일 앞자리를 부호로 생각한다. 0이면 +, 1이면 -1
- 1의 보수
- 2의 보수
참고) N의 (r-1)의 보수는 $(r-1)^n$-N이 된다.
binary 1010 에 대한 3가지 방법 각각 구해보기.
- -2
- 1의 보수 : 0101
- 2의 보수 : 0110
'ETC > CS' 카테고리의 다른 글
[컴퓨터구조] ch.2-4 MIPS (0) | 2020.10.26 |
---|---|
[컴퓨터구조] ch.2-3 MIPS (0) | 2020.10.25 |
[컴퓨터구조] Ch.2-1 컴퓨터 언어 - Language of the Compute (0) | 2020.10.24 |
[컴퓨터구조] Ch.1 컴퓨터 추상화와 기술 - Computer Abstractions and Technology (0) | 2020.10.21 |
Lambert's cosine Law (0) | 2020.06.08 |
댓글