[Chapter 2] Instructions: Language of the Computer_2

slchoi·2022년 1월 4일
0

컴퓨터구조

목록 보기
5/15
post-thumbnail

KOCW에 공개된 영남대 최규상 교수님 컴퓨터 구조 강의를 수강 후 정리한 내용입니다.

2.8 Supporting Procedures in Computer Hardware


1. 함수(function, procedure)의 실행 단계

용어 정리

  • caller: 함수를 부르는 것
  • callee: 불려지는 함수

실행 단계

  1. caller가 callee가 접근할 수 있는 곳에 argument를 가져다 놓음
    • $a0 - $a3: argument를 저장하는데 사용되는 네 개의 register
  2. caller가 callee에게 컨트롤을 넘겨줌
  3. callee가 필요한 메모리 공간을 할당받음
  4. callee가 해야할 일을 수행
  5. callee가 일을 마친 후 caller가 접근할 수 있는 위치에 return 값을 저장
    • $v0 - $v1: return value를 저장하기 위해 사용되는 두 개의 register
  6. callee가 caller에게 컨트롤을 넘겨줌
    • callee가 caller에게 컨트롤을 넘길 때 return address를 알고있어야 함
    • $ra: return address를 저장하는데 사용되는 register

2. Procedure Call Instructions

1. Procedure call: jump and link

  • jal ProcedureLabel: ProcedureLabel의 다음 명령어 주소를 $ra에 저장한 후 ProcedureLabel로 jump

2. Procedure return: jump register

  • jr $ra: $ra의 값을 program counter(PC, 현재 실행하고 있는 명령어의 메모리 주소 값을 가지고 있는 레지스터)에 복사해 프로그램이 $ra로 jump

Leaf Procedure Example

  • Leaf Procedure: 함수 내에서 다른 함수를 부르지 않는 것
    • f는 로컬 변수이므로 $s0에 저장되어 있다고 가정

3. Non-Leaf Procedure

  • 함수 내에서 다른 함수를 호출
  • 함수 내에서 다른 함수를 호출할 경우 caller가 가지고 있던 return address의 값을 다른 곳에 저장해야함. 또한 호출한 함수의 argument 값을 stack에 저장해야함
  • callee에서 caller로 온 후에 stack에 저장된 값을 복원해야 함

3. Local Data on the Stack

  • 보라색 상자: activation record(procedure frame). 하나의 함수를 부를 때마다 activation record가 할당됨. b에 나와있는 값들을 저장
  • $sp: stack pointer, 스택의 시작 위치
  • $fp: frame pointer, 현재의 activation record의 시작 위치. 끝 위치를 가리키는 것이 $sp

4. 메모리 구조

  • Text: 프로그램 명령어 저장
  • Static data: global variables(전역 변수), static 변수 저장
    • $gp: Static data 부분의 중간을 가리켜 Static data에 접근하기 훨씬 수월하게 만듦
  • Dynamic data(heap): C언어의 malloc, Java에서의 new를 사용할 경우 할당됨
  • Stack: activation record가 할당되는 부분
  • heap은 위쪽 방향으로 증가, Stack은 아래쪽 방향으로 증가

2.9 Communicating with People


Character Data

  • character data는 byte로 구성: ASCII(128 characters), Latin-1(256 characters)
    • 문자열을 8bit로 표현
  • Unicode: 32bit character set
    • UTF-8, UTF-16: 여러 바이트를 사용해서 표현 가능

2.10 MIPS Addressing for 32-Bit Immediates and Addresses


32bit Constants

  • MIPS에서 상수는 16bit. 32bit의 상수를 다루기 위해서는 두 개의 instruction이 필요
    • constant의 값이 rt의 상위 16bit로 가게됨
    • 하위 16bit의 값을 지정해서 넣어주면 32bit constants를 만들 수 있음

1. Adressing

1. Branch Addressing

  • branch는 특정 타켓 address로 가게됨
    • PC-relative addressing
      • Target address = PC + offset X 4
      • PC는 현재 명령어가 수행되고 있으면 다음에 수행될 명령어의 주소를 가지고 있기 때문에 이미 4만큼 증가되어 있음. 따라서 Target address를 계산할 때에 고려해줘야함

2. Jump Addressing

  • Target address = PC의 상위 4bit(31~28bit) + (address X 4)
  • Example

2. Branching Far Away

  • branch의 경우 16bit offset 값을 넘어가는 경우가 있음. branch target이 너무 멀리 있어 16bit offset으로 커버가 안되는 경우 어셈블러는 명령어를 아래처럼 바꿔 씀
    • branch 명령어 대신 jump 명령어 사용. jump 명령어는 26bit를 커버하기 때문에 훨씬 멀리 있는 곳까지 jump 가능

3. Addressing Mode Summary


1. Immediate addressing

  • 상수를 사용하는 경우
  • ex) addi

2. Register addressing

  • R-type

3. Base addressing

  • load/store와 관련된 명령어

4. PC-relative addressing

  • branch 명령어

5. Pseudodirect addressing

  • jump 명령어

2.12 Translating and Starting a Program


Translation and Startup

  • Linker: 작성한 프로그래밍 언어와 library를 합쳐 실행 파일을 만들어줌
  • loader: 프로그램이 실행되기 위해서는 저장장치에서 memory로 올라와야하는데 이 과정을 load라고 함. loader는 작성한 프로그램을 memory로 올려줌
  • Static linking: 작성한 프로그램 안으로 library가 들어오는 것. 반대되는 개념이 Dynamic linking

Assembler Pseudoinstructions

  • MIPS에서는 사용 불가능하지만 어셈블러에서 사용할 수 있는 가짜 명령어
  • 어셈블러가 MIPS의 실제 명령어로 자동으로 바꿔줌
    • move, blt 명령어는 실제 MIPS 명령어에는 존재하지 않지만 어셈블러에서는 사용 가능
    • $at이라는 어셈블러만 사용할 수 있는 명령어를 사용해 실제 명령어로 바꿔줌

1. Producing an Object Module

  • 어셈블러가 프로그램을 machine instructions으로 변환해주는 것
  • 변환할 때 object module은 아래 정보를 가지고 있음
    • Header: object module에 대한 내용
    • Text segment: 변환된 명령어
    • Static data segment: 전역 변수등이 저장
    • Relocation info: 프로그램이 로딩될 때 의존하는 절대적인 주소에 대한 contents
    • Symbol table: 코드에서 사용하는 global variable, 함수에 대한 정보
    • Debug info: 디버깅을 위한 소스코드 정보가 포함

2. Linking Object Module

  • 실행 파일로 만들기 위한 과정
    1. segments 병합
    2. 서로 다른 object module에서 사용한 labels를 해결
    3. location-dependent 정보와 함수를 위치에 맞춰줌
  • 가상 메모리는 같은 공간을 사용하기 때문에 location dependencies 정보는 필요 없게 됨. 가상 메모리에 존재하는 절대 주소를 사용

3. Loading a Program

  • 실행 파일을 디스크에서 메모리로 load
  • 실행 과정
    1. header를 읽어 segment의 크기를 결정
    2. 가상 주소 공간(virtual address space) 생성
    3. text와 data를 생성한 공간에 올림
    4. stack을 위한 argument를 세팅
    5. 레지스터 초기화
    6. 시작 루트로 jump (C언어의 경우 main). 끝나면 exit를 호출

4. Dynamic Linking

  • library를 link/load하는 과정을 library가 호출된 경우에만 수행
    • Static Linking의 경우 호출 여부 상관없이 모든 library를 link/load함
  • 실제 사용되는 library의 정보만 가져오기 때문에 실행 파일의 크기가 커지는 것을 방지할 수 있음
  • 함수 관련 코드가 실행 파일에 저장되는 것이 아니라 dynamic linking 파일에 별도로 존재하기 때문에 새로운 버전의 library가 나올 경우 실행 파일을 새롤 만들 필요없이 dynamic linking 파일을 업데이트만 해주면 됨
  • 장점: 실행 파일의 크기가 커지는 것을 막을 수 있음. 새로운 버전의 라이브러리를 생성하더라도 실행 파일을 다시 컴파일하지 않아도 됨
  • 단점: static linking에 비해 성능이 떨어질 수 있음

4주차 끝!!!
게시물에 사용된 사진은 강의 내용을 캡쳐한 것입니다.

profile
예비 백엔드 개발자

0개의 댓글