ETC/CS

[컴퓨터구조] ch.2-2 산술 동작

지과쌤 2020. 10. 24.
반응형

간단한 산술동작

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로 복사됨!

 


  1. 메모리에 있는 값을 물리적인 구성인 버스를 통해 읽어온다. (load)
  2. 읽어온 값을 컴파일러가 매핑한 임의의 레지스터에 저장한다.
  3. 저장한 값을 가져다 ALU 중 가산기에서 더하기를 한다.
  4. 더한 결과를 일시적으로 임의의 레지스터에 저장한다.
  5. 레지스터의 내용을 메모리로 다시 보낸다 (store)

MIPS operands (참고)

 


Signed and Unsigned Numbers (Ch 2.4)

msb vs lsb

 

Signed binary number 를 표기하는 세가지 방법

  1. 제일 앞자리를 부호로 생각한다. 0이면 +, 1이면 -1
  2. 1의 보수
  3. 2의 보수

참고) N의 (r-1)의 보수는 $(r-1)^n$-N이 된다.

 

 

binary 1010 에 대한 3가지 방법 각각 구해보기.

  1.  -2
  2. 1의 보수 : 0101
  3. 2의 보수 : 0110

 

 

 

 

반응형

댓글

💲 추천 글