Computer Science/Computer Architecture

[컴퓨터구조] Lecture 06: Instructions - Language of the Computer - Part3

kangkyunghyun 2026. 2. 8. 16:11
728x90
반응형

경희대학교 김정욱 교수님의 컴퓨터구조 강의를 기반으로 정리한 글입니다.

Explanation of 32 Registers

  • $zero: 0 value
  • $a0 ~ $a3: function argument
  • $v0, $v1: return values
  • $t0 ~ $t9: temporary 레지스터
  • $s0 ~ $s7: saved register (반드시 값이 저장되어야 하는 레지스터)
  • $gp: global pointer (static 데이터 핸들링 시 사용)
  • $sp: stack pointer (stack에서 현위치)
  • $fp: frame pointer (stack의 first item을 point)
  • $ra: 이전 함수의 주소 값

Supporting Procedures in Computer Hardware

  • Procedure(=Function): 코드 재사용을 더 쉽게 만들어주는 도구
  • 다른 procedure로 jump하기 전에 이전 값들을 저장해야 함
  • 함수를 호출하는 함수를 Caller, 호출된 함수를 Callee

  • 함수의 argument가 4개 이상인 경우, $s나 $t가 역할을 대신할 수는 없음 → $a가 값을 받아서 $t에 저장하고 다음 argument를 받음 → 즉, $a가 일을 여러번 함
  • 상황에 따라 4개의 $a와 2개의 $v보다 많은 레지스터를 사용할 수 있음
  • Callee preocedur를 수행할 때, register에 저장된 값이 사라질 수 있음 → Callee procedure를 마치고 Caller procedure로 복귀할 때 다시 활용하게 될 수 있는 변수 값을 memory에 미리 저장

→ memory는 역방향 스택 → 아래로 내려감

  • Stack pointer($sp) register: 스택에서 가장 최근에 할당된 주소를 가리킴

→ 위 예제에서 스택포인터는 값을 2개 저장해야하니 2칸 공간을 만들고(8만큼 포인터를 내리고) 두 개를 저장 다시 돌아올 때는 값을 꺼낸 후 포인터를 다시 2칸(8) 위로 올림

  • 함수가 호출되면 스택 포인터를 내려 $s0가 저장될 공간을 메모리에 만들고 저장
  • 연산을 수행하고 $s0에 아까 저장했던 값을 다시 불러온 후 스택 포인터를 올려 값을 버림
  • jr: jump register, $ra: 호출한 함수의 주소 → 항상 함께 쓰임

Nested Procedures

jal: jump and link

Allocation Space for New Data on the Stack

  • Frame: 함수에서 저장되는 값들
  • Frame Pointer ($fp): procedure frame의 첫 word point → $sp 범위의 기준점
  • Stack Pointer ($sp): procedure 과정에서 바뀔 수 있음 → push/pop 할 때

Allocation Space for New Data on the Heap

  • Heap: procedure의 변수를 동적으로 할당

  • Global Pointer ($gp): 스태틱 데이터 시작 지점과 끝 지점의 가운데를 가리킴. 16bit offset으로 접근
  • Text: 우리가 실행할 프로그램의 코드가 저장되는 영역
  • Static Data: 우리가 작성한 전역변수, 정적변수가 저장되는 영역
  • Dynamic Data: 사용자가 할당하는 메모리 공간 → 실제 프로그램이 동작할 때(run time) 크기가 결정
  • Stack: 함수 호출 시 생성되는 지역변수, 매개변수의 공간 → 설계자가 코드를 짜고 compile하는 단계(compile time)에서 크기가 결정

MIPS Addressing for 32-bit Immediate and Address

  • I-Format에서 immediate 파트에 16비트만 저장됨, 하지만 ALU에서는 32비트 레지스터끼리의 연산만 가능

  • 0이 저장된 $s0를 준비
  • Load Upper Immediate (lui)를 사용해 앞 16비트를 채움
  • Or Immediate (ori)를 사용해 뒤 16비트를 채움

Addressing in Branches and Jumps

Branch(I-Format)

  • beq, bne → PC-relative addressing
  • Program Counter: 현재 명령어의 주소를 저장
  • Target Address = (PC + 4) + Offset * 4

Jump(J-Format)

  • pseudodirect addressing: jump에서 사용하는 주소 접근법
  • j 타입의 address 부분은 26비트 밖에 없는데, 이 26비트 안에 32비트의 주소를 축소시켜 넣는 방법
  • 뒤의 00비트를 비우는 이유 → byte addressing (*4)
  • 앞의 4비트는 PC에서 가져옴 → jump의 목적지와 PC address가 인접한 곳에 위치했다 가정 → 점프를 해서 아무데나 이동하더라도 어느 정도 바운더리 안에서 이동해라

MIPS Addressing Mode Summary

Immediate addressing

  • operand에 명령어의 상수가 포함(addi)

Register addressing

  • 주소 필드가 메모리가 아닌 레지스터를 가리키는 경우(R-Format)

Base addressing

  • operand가 메모리에 위치하고, 명령어의 const와 register의 합으로 주소 알아냄 → Array의 시작점 + offset(lw, sw)

PC-relative addressing

  • branch address의 주소가 명령어의 const와 PC의 합(bne, beq)

Psudodirect addressing

  • Jump address가 PC의 upper bits와 명령어의 26bits가 합쳐진 상태(j, jal)

728x90
반응형