본문 바로가기
CS/Computer Architecture

Language of the Computer

by 테리는당근을좋아해 2019. 12. 23.

컴퓨터가 사람의 언어를 이해하는 과정

사람 -> High level language(C, C++, Java..) -> Assembly language(Instruction) -> machine language(Binary) -> CPU

 

ISA(Instruction Set Architecture) - Instruction의 집합

1) Instruction

    - 하드웨어와 소프트웨어의 인터페이스

    - 프로세서의 동작을 묘사하는 기본 명령

 

2) CISC (Complex Instruction Set Computer)

    - 비교적 오래됨

    - 복잡하고 많은 명령어로 이루어짐

    - 어셈블리 프로그래밍이 쉬운 반면에 CPU 설계가 어려움

 

3) RISC (Reduced Instruction Set Computer)

    - 비교적 최신

    - 작고 기본적인 명령어로 이루어짐

    - 어셈블리 프로그래밍 시 코드가 길어지지만 CPU 설계가 간단함

 

 

Instruction(In MIPS)

1) Arithmetic Instruction

    - 기본적인 산술연산을 수행하는 명령어(add, sub, mul, div, ...)

(예) 덧셈 연산

 

2) Data transfer Instruction

    - 레지스터는 메모리보다 훨씬 작기 때문에 필요한 데이터만 메모리에서 가져오거나 메모리에 저장해야함

    - lw(load word : from memory to register), sw(store word : from register to memory)

base address + (4*8)의 주소값에 있는 data를 load
$t0에는 0x00000020에 있는 88이 들어가게 됨

     - 메모리에 word는 4byte 단위로 저장되므로 offset은 접근한 데이터의 x번째 인덱스 * 4가 됨

     - base address + offset으로 접근할 데이터의 address를 계산해서 메모리에서 레지스터로 데이터를 가져오게 됨

 

 

Representing Numbers in Binary

1) Unsigned Binary

 - 부호없는 2진수

 - n 비트가 주어졌을 때, 0 ~ 2^n -1 까지 표현 가능

 

2) Signed Binary

    - 1's complement(1의 보수)

       : 부호가 있는 2진수로, n 비트가 주어졌을 때, -{2^(n-1) - 1} ~ {2^(n-1) - 1}까지 표현 가능(-0이 존재하기 때문)

 

    - 2's complement(2의 보수) -> 1's complement보다 산술 연산이 쉬움

       : 부호가 있는 2진수로, n 비트가 주어졌을 때, -2^(n-1) ~ {2^(n-1) - 1}까지 표현 가능

 

3) Signed extension

    - signed binary를 load 시 부호가 바뀌지 않고 load할 수 있도록 해줌

MSB로 비트 수를 늘려 부호가 바뀌지 않게 해줌
lb $t0 1($t0) : 1 byte의 데이터를 가져올 경우 4byte의 레지스터 비트 수에 맞게 signed extension 해줌

 

Representing Instructions in Binary(In MIPS)

1) R-format : Arithmetic, Logic Instruction을 표현하기 위한 형식

R - format

    (1) op : instruction의 기본 동작 (add, sub, mul, div, ...)

    (2) rs : source register 1 (피연산자)

    (3) rt : source register 2 (피연산자)

    (4) rd : destination register 

    (5) shamt(shift amount) : shift연산 시 이동하는 비트 수

    (6) funct : 같은 opcode 내에서 특정한 연산을 구별하기 위한 비트 (ex : R-format/add, R-format/sub)

 

ex) add $t0, $s1, $s2 -> 00000010 00011001 00100000 00010000

 

2) I-format : Data transfer, Arithmetic with Immediate, conditional branch instruction을 표현하기 위한 형식

I - format

    (1) op : instruction의 기본 동작 (lw, sw, addi, subi, branch...)

    (2) rs : source register 1 (피연산자)

    (3) rt : destination register 

    (4) constant or address : 상수 값으로 산술 연산 시, 상수 값이 저장되거나, 다른 연산 시에 필요한 주소값 저장

 

ex) lw $t0, 1200($t1) -> 10001101 00101000 00000100 10110000

3) J-format : Unconditional Jump instruction을 표현하기 위한 형식

J-format

    (1) op : instruction의 기본 동작 (j...)

    (2) address : target address (다음 실행할 명령어의 주소)

 

 

Instruction and Addressing(In MIPS)

1) branch instruction

   - 분기문은 for, if문처럼 사용되는 명령어로 다음 실행할 명령어는 대게 분기문 근처에 존재. 따라서 PC-relative addressing 방식을 사용

 

  (1) PC(Program Counter) : CPU 내부에 있는 레지스터 중 하나로, 다음에 실행할 명령어의 주소를 저장하고 실행할 기계어의 위치 지정

  (2) PC-relative addressing: PC 값을 기준으로 offset 값을 더해 계산. branch instruction의 I-format은 주소를 16비트 밖에 표현할 수 없고, branch에서 근처에 있는 명령어로 분기하기 때문에 PC-relative addressing방식 사용

 

2) jump instruction

   - jump instruction의 target은 code segment의 어디든 존재할 수 있음. 따라서 Pseudodirect addressing 방식 사용

 

  (1) Pseudodirect addressing: PC의 상위 4비트와 address의 조합으로 주소를 지정. Jump instruction은 branch instruction과 다르게 주소를 26 비트까지 표현 가능. 32 비트 전부를 표현할 수 없기 때문에 PC의 상위 4비트를 가져옴. 즉, 아무리 프로그램 어디에나 jump할 수 있다고 해도 boundary가 있기 때문에 이를 고려해야함

 

  Target address = PC[31:28] : (address x 4)

 

 

Procedure calls

1) 프로시저란?

  - 서브루틴, 함수 등과 같은 의미로 특정 작업을 수행하기 위한 instruction의 집합

 

2) 프로시저 실행 과정

   (1) 인자를 프로시저가 접근할 수 있는 장소에 저장

   (2) 제어의 흐름을 프로시저로 변경

   (3) 특정 작업 수행

   (4) 수행 결과를 프로시저를 호출한 함수가 접근할 수 있는 장소에 저장

   (5) 제어의 흐름을 프로시저를 호출한 곳으로 반환

 

3) Supporting Procedure in MIPS - Registers

   (1) $a0 ~ $a3 : parameter에 전달하기 위한 4개의 argument register

   (2) $v0, $v1 : 반환 값을 저장하기 위한 2개의 register

   (3) $ra : 프로시저를 호출한 코드의 위치를 기억하기 위한 레지스터(return address)

 

4) Supporting Procedure in MIPS - Instruction

    (1) Procedure call instruction : jal ProcedureAddress (jump and link)

        - jump : 제어의 흐름을 프로시저로 이동

        - link : 제어의 흐름을 원래 위치로 복귀하기 위해 $ra 레지스터에 return address 저장

   

     (2) Procedure return instruction : jr $ra

          - PC(program counter)에 $ra에 저장된 return address를 복사해 프로시저를 호출한 원래 위치로 복귀

 

5) Register spilling

  - procedure에는 4개의 argument register와 2개의 return value를 저장하는 register, 1개의 return address를 저장하는 register가 있음. procedure가 중첩해서 호출되거나 더많은 매개변수, 리턴 값을 필요로할 경우에는 앞에서 말한 register보다 더 많은 register를 필요로 하게 되므로 제한된 수의 register를 사용하기 위해 caller procedure의 지역 변수를 메모리(stack)에 저장하게 됨

 

6) Stack

stack

  - stack은 register spilling 시에 register의 저장된 값을 메모리에 저장하기 위한 자료구조.

  - 후입선출(LIFO).

  - stack pointer($sp)가 가장 최근에 할당된 주소를 표시.

  - stack은 high addressd에서 low address로 이동.

  - frame pointer($fp)는 프로시저가 호출될 때의 stack pointer위치를 기억해 프로시저의 수행이 완료될 시에 stack pointer가 원래 위치로 돌아갈 수 있도록 함.

 

 

 Executing a Program

 

댓글