ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MIPS, Memory Operands and Constant(Immediate) Operands
    Computer Science/Computer Architecture and Organization 2021. 4. 4. 16:25

    Memory Operands

    위의 예시에서는 간단한 더하기 빼기였지만, 실제 프로그래밍에서는 훨씬더 복잡한 컨셉이 등장한다. 예를들어 Array, Tree, Linked List 또는 Map과 같은 것들이다. 어떻게 컴퓨터는 이런 큰 Data Structure를 접근하고 나타낼 수 있을까? 프로세서는 아주 작은 양의 데이터를 registers에 보관할 수 있는데, 컴퓨터의 메모리는 수십GB부터 수TB까지, 더 큰 컴퓨터는 그 이상의 방대한 양의 정보가 저장되어있고 처리를 기다리고 있다. 위에서 말했든, Arithmetic Operations(사칙연산)들은 MIPS instructions에서는 오직 프로세서의 registers에서만 처리될 수 있고, 그렇기때문에 MIPS는 registers와 memory간에 데이터를 옮기는 역할을 해야한다. 

     

    이전에 설명했던 것 중, 32 bit의 CPU라고 하면, register의 사이즈가 32bits인데, 이때 하나의 그룹, 즉 32bits를 word로 표현한다.

     

    메모리에서 하나의 word를 access하려면, instruction은 메모리의 주소, 즉 adress를 제공해야한다. 메모리는 아주아주 큰 1차원 Array이다. 아래 예시 이미지에서, 아주 길다란 Array인 메모리에 주소가 있고, 0번에는 1이라는 데이터가, 1에는 101이, 2번에는 10이 3에는 100이 저장되어있다.

     

    David A. Patterson and John L. Hennessy. 2013.  Computer Organization and Design, Fifth Edition: The Hardware/Software Interface  (5th. ed.). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.

     

    lw, load word

    커다란 Memory에서 우리가 연산에 사용할 값들만 Processor에 복사를 해서 처리를 하고, 다시 값을 반환하는 구조라고 생각하면 된다. 이 과정에서 memory에서 CPU에있는 하나의 register로 데이터를 복사하는것을 load라고 한다. 이것을 MIPS에서는 lw 라고 하는데, 이는 load word라는 뜻이다. 

     

    다음의 문제를 보자.

    Compiling an Assignment When an Operand Is in Memory

    Let’s assume that A is an array of 100 words and that the compiler has associated the variables g and h with the registers $s1 and $s2 as before. Let’s also assume that the starting address, or base address, of the array is in $s3. Compile this C assignment statement:

    g = h + A[8];

    거의 모든 프로그래밍에 있는 Array를 활용한 덧셈으로, h라는 숫자와, A라는 Array의 9번째값, index 8에 있는 값을 더해서 g에 저장하는 내용이다. 이 과정에서, 우리는 A[8]에 있는 값을 register에 옮겨줘야한다. 즉 load word (lw)를 사용해서 temp 저장소에 저장해준다. 

    # 임시 register $t0에 A[8]을 저장
    lw $t0, 8($s3)

    # $s2에 저장되어있는 h값과 t0에 우리가 저장해둔 값을 더해서 $s1에 저장.
    add $s1, $s2, $t0

    여기서 8을 offset이라고 부르고 array의 주소를 알기위해 사용된 register ($s3)를 base resgister이라고 부른다.

     

     

    sw, store word

    위의 예시에서, Adress를 표현할때, 1, 2, 3,,, 으로 보여졌지만, 사실 MIPS에서 offset은 4byte씩 계산한다. 그러므로 A[8]의 주소를 계산한다면, base register인 $s3에서 4 * 8, 즉 32만큼 이동한곳이 A[8]이 위치한곳이다. 이렇게 값을 읽어서 앞에서 보여준대로 register에 load를 할수도 있지만, register에서 memory로 보내는것도 필요한데, 이것을 store word라고 하고 MIPS에서는 sw라는 instruction을 사용한다. 아래 예시를 보자:

    Assume variable h is associated with register $s2 and the base address of the array A is in $s3. What is the MIPS assembly code for the C assignment statement below?

    A[12] = h + A[8];

    간단한 연산처럼 보여지지만, 다르다. 이미 만들어져있는 A[8]의 메모리에 있는 값을 register에 load해서 A[12], 즉 메모리에 다시 저장을 해야한다. 이는 아래와같이 계산할 수 있다.

    # A[8]에 있는 값을 t0의 레지스터에 카피한다.
    lw $t0, 32($s3)

    # h 에 t0값을 더해서, t0에 다시 저장한다.
    add $t0, $s2, $t0

    # t0값을 A[12], (12 * 4), 즉 48($s3)의 메모리에 저장한다.
    sw $t0, 48($s3)

     

    addi, add immediate

    프로그램이 돌아갈 때, 숫자는 많이 쓰여진다. 예를 들면, for loop을 돌릴 때, index를 하나씩 올리는 로직을 떠올린다면, 아래와 같다.

    # t0 는 constant 4이다.
    lw $t0, AddrContant4($s1) 

    # $s3에 4를 더한 후 다시 저장한다.
    add $s3, $s3, $t0

    그런데, 만약 이 과정을 한번에 할 수 있다면? 이것이 바로 addi, add immediate 이다. 말 그대로 바로 더해버리기! 정도로 생각하면 된다. 위에서 보여졌던 instruction이 아래처럼 표현될 수 있다.

     

    addi $s3, $s3, 4

    s3에 있는 값에 4를 더해서 다시 register $s3에 다시 저장하는것이다.

     

    Reference

    David A. Patterson and John L. Hennessy. 2013. Computer Organization and Design, Fifth Edition: The Hardware/Software Interface (5th. ed.). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.

    댓글

Designed by Tistory.