컴퓨터 구조(2)

이정훈·2024년 12월 29일
0

대학강의

목록 보기
13/19
post-thumbnail

자연어와 기계어

사람이 자연스럽게 사용하기 좋은 언어는 자연어
그러나 자연어로 프로그래밍 하기에는 컴퓨터 시스템이 그렇게까지 발전하지 않았음.
언젠간 자연어만으로 프로그래밍 되는 날이 올 것임.
자연어 대신에 이에 가까운 언어들을 사용함. 이를 고수준 언어라고 한다.
고수준 언어에는 imperative language, procedural language, OOP language 등이 있다.

고수준 언어에서 기본이 되는 것은 상태(state)

imperative language에서 절차적으로 하면서 발전한게 Procedural language
Procedural language를 structured programming이라고도 부른다.
여기서 더 발전하면 OOP

코드는 아스키 파일이다. 기계가 읽을 수 없다.
그렇기 때문에 코드를 변환해줘야 하는데 이 일을 하는 것이 컴파일러이다.
컴파일러를 거치면 실행파일이 나온다.

Java는 컴파일된 바이트코드를 실행하는 언어이며, JVM은 바이트코드를 실행하는 가상 머신이다.
인터프리터 언어는 실행과 동시에 변환도 한다.
Java는 컴파일된 바이트코드를 생성하며, JVM에서 실행 시 인터프리터와 JIT 컴파일 방식이 혼합되어 사용된다.
Java는 JVM에서 실행되는 바이트코드(.class 파일)를 생성하며, JVM은 이 바이트코드를 실행한다.
그래서 Java는 어느 컴퓨터에서든지 실행 가능하다.
가상 머신 위에서 변환을 하기 때문이다.

어셈블러는 컴파일러의 일부분이다.
기계어는 사람이 읽고 해독하기 정말 힘들다 0과 1로 이루어져 있다.
어셈블리 프로그래밍 언어는 기계어와 매핑된 명령어가 있는 언어이다.

imperative language

방법(how)에 집중한다.

functional language

imperative language와 달리 무엇(what)에 집중한다.
모든 상황에서 functional language가 좋은 것이 아니라 특정 상황에서 좋다.

컴파일러

일반적으로 A 언어로 작성된 언어를 B 언어로 변환하는 것이다.
소스 프로그램은 C나 Python같은 언어로 작성된 언어
타겟 프로그램은 실행하려는 기기의 명령어를 말한다.

코드를 정확하게 컴파일 해야 한다.
컴파일 한 결과인 실행파일의 실행이 빨라야 한다.
컴파일하는 시간이 짧아야 한다.
각각 따로 컴파일 해야 한다.(뒤에서 제대로 다룬다.)
어디서 에러가 났는지 정확하게 알려줘야 한다.

컴파일 과정

컴파일러 단계

Machine State

ISA는 단순하게 instruction set만 정의하는 것이 아니다. 머신의 상태도 정의한다.
명령어의 역할은 레지스터를 변경하거나 메모리의 상태를 변경한다.

Register

CPU내부에 명령어를 저장하는 공간
메모리로부터 가져온 데이터를 저장하는 공간, 스토리지.
일반적으로 단일 싸이클에 읽고 쓸 수 있다.
가장 빠른 메모리이다.
메모리 계층 구조에서 탑 레벨에 속한다.
레지스터 <-> 캐시 <-> 메모리 <-> 하드 디스크

Memory

메모리 엑세스 하는게 점점 멀어지면서 캐시가 많이 들어가기 시작했다.
메모리로부터 레지스터 이게 전부이다.
모든 메모리가 가상 메모리로 취급된다.
프로그램의 입장 프로세서 입장에서 메모리는 모두 가상 메모리다.
바이트 하나 마다 주소를 가진다.
메모리는 각 번지마다 하나의 바이트를 가리키는 주소를 가진다.
주소크기가 프로그램 크기를 결정한다.
32비트는 4기가가 최대
프로그램의 크기는 코드는 명령어와 데이터를 포함한다.

Data Size & Alignment

워드는 연산의 기본 단위이다.
읽어오는 단위는 명령어에서 바꿀 수 있다.(하프 워드, 더블 워드 등등)

Alignment

시작하는 주소가 자기 데이터나 명령어의 배수에 저장되게 되어있다.
예를 들어 워드 32비트 배수로 저장

Machine Instruction

operation

연산자
ADD, MULT, LOAD, STORE, JUMP

operrands

피연산자
input data
output data

Instruction Types

Arithmatic and Logical Instruction

산술과 논리 연산
명령어 예시) ADD, MULT, XOR, SHIEFT, FDIVIDE, FADD

Data Transfer Instruction

데이터 전송 명령어는 한 위치에서 다른 위치로 데이터를 이동하거나 복사하는 데 사용되는 프로세서 명령어
memory mapped i/o =>메모리에 i/o가 매핑되어있는 상태

명령어 예시) LOAD, STORE

Conditional Branch Instructions

조건에 따라 프로그램의 실행 흐름을 변경하는 명령어
프로그램의 실행 순서를 바꾼다.
for 루프나 if에 사용된다.

  • 프로그램 카운터
    명령어의 주소를 저장하고 있는 레지스터
    Instruction Pointer라고도 한다.

명령어 예시 )JUML, CALL, RETURN

MIPS Instruction Format

MIPS(Microprocessor without Interlocked Pipeline Stages)는 간단하고 효율적인 설계를 목표로 개발된 RISC(Reduced Instruction Set Computer) 아키텍처

R-type(레지스터 타입)

R-type 명령어는 산술 및 논리 연산이 주요 구성 요소
R-type의 명령어는 Opcode는 모두 0이다.
마지막 function 필드를 통해 특정 연산을 지정.

I-type

base adressing
op: opcode (명령어의 종류를 지정)
rs: 기준 레지스터(Base Register) – 메모리 주소 계산 시 기준이 되는 레지스터
rt: 목적 레지스터(Destination Register) – 계산된 주소로 데이터를 읽거나 쓸 레지스터
immediate: 즉시값(Immediate) – 주소를 계산할 때 더할 상수값

궁금해서 찾아봤는데 rs에 주소가 아닌 어느 레지스터인지 저장하고 거기에 즉시 값을 더해 기준 레지스터에서 특정 부분을 가져오던거더라.

J-type

op (opcode): 명령어의 종류를 나타내는 6비트 필드입니다. 예를 들어, J 명령어의 경우, opcode는 00001.
address: 26비트 주소 필드. 이 주소는 점프할 위치를 나타내는 값

MIPS Addressing Modes

  • Register addressing
    레지스터 주소 지정은 연산에 사용되는 데이터를 레지스터에서 직접 가져오거나, 결과를 레지스터에 저장하는 방식

  • Base addressing
    기준 레지스터(Base Register)와 오프셋(Offset) 값을 합쳐서 메모리 주소를 계산하는 방식

  • Immediate addressing
    즉시값(Immediate)을 연산에 직접 사용하는 방식

  • PC-relative addressing
    프로그램 카운터(PC)를 기준으로 상대적인 주소를 계산하는 방식

  • Pseudodirect Addressing
    26비트 주소는 PC의 상위 4비트와 결합하여 실제 주소를 계산하는 데 사용

Procedure Call & Return

프로시져 콜을 할 때는 파라미터를 전달해줘야 한다.
콜러가 콜리한테 전달해줘야 한다.
레지스터를 통해 전달해준다.(메모리로 보내는건 오버헤드가 크다.)

먼저 콜리가 접근할 수 있는 곳에 파라미터를 넣어둔다.(넣는 곳은 레지스터이다.)

콜리는 보내준 데로 파라미터를 읽는다.
참고로 파라미터 순서대로 a0, a1, a2, ... , an레지스터에 저장된다.

파라미터를 전달했다면 점프 앤 링크를 해야한다.
이때 콜리에게 컨트롤 권한을 넘긴다. 프로그램 카운터는 콜리쪽으로 간다.
콜리는 돌아갈 주소를 PC+4에 저장한다.

콜리는 자신만의 스토리지가 필요한데 스택 프레임이라고 불린다.

profile
기록으로 흔적을 남깁니다.

0개의 댓글