전공/컴퓨터구조

[컴퓨터구조] #3 명령어 종류, 기능과 형식

Campus Coder 2023. 4. 15. 17:01
728x90
반응형

어셈블리 명령어

Assembly

  • High-level Language vs. Compiler, Interpreter

 

CISC - Intel x86/x86-64

RISC - MIPS/ARM/RISC-V

 

명령어의 종류

  • 레지스터/메모리번지(주소)에 데이터 로드
  • 레지스터와 메모리 주소에서 읽기/쓰기(덮어쓰기)
  • 산술연산 - +/-
  • 논리연산 - and/or/nor/shift
  • 분기 - 조건, 무조건

 

피연산자(operand)의 개수

명령어/피연산자의 개수에 따른 분류

parameter/argument

오퍼랜드(operand) 개수

add a, b, c → 3 주소 명령어

 

Word

CPU가 한 사이클/틱에 처리하는 데이터 크기

  • 보통 8/16/32/64비트
  • 데스크톱/모바일 64비트가 주류
  • 메모리접근 시 동시에 읽을 수 있는 값

 

뱅크

  • 한 개의 메모리 출력이 8비트인 경우 32비트 워드값과 맞추려면 램 4개 필요
  • 램의 데이터출력 핀 개수와 워드값을 맞추기 위한 개념

 

채널

  • cf. 램 2/3/4개를 꽂는 것이 램 1개 쓰는 것보다 메모리대역폭이 큼
  • 메모리컨트롤러 워드값을 CPU보다 크게 만들어 메모리 대역폭을 늘리는 기술

 

정렬제약

데이터를 워드크기에 맞춰 저장하는 기법

 

3바이트 색상표현과 4바이트 워드값이 틀림

→ 속도(1바이트의 저장용량 포기) vs. 저장효율(1바이트 다른 용도로 사용)

→ 그대로 저장하면 특정한 점의 컬러값을 읽는데 메모리접근을 2번 이상 해야 하는 경우가 생김

 

MIPS의 특징

MIPS는 명령어는 오퍼랜드가 3개인 경우 대부분 → 하드웨어 단순해짐

MIPS는 레지스터 32개

MIPS는 메모리 최대 1GB 지원

MIPS의 워드 값은 4바이트

 

숫자의 signed(부호 있음-+/-)/unsigned(부호 없음/+) 지원

메모리 word(4바이트)/half word(2바이트)/byte 접근 지원

 

메모리 접근주소 계산

베이스(base) 레지스터와 옵셋(offset)

메모리 접근 주소: base register + offset

 

리틀엔디안/빅엔디안

메모리의 워드값을 어떤 값을 쓰는가에 따른 분류

 

빅엔디언 vs. 리틀엔디언

더보기

엔디언(Endianness)은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻하며, 바이트를 배열하는 방법을 특히 바이트 순서(Byte order)라 한다.

 

엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-endian)과 작은 단위가 앞에 나오는 리틀 엔디언(Little-endian)으로 나눌 수 있다.

 

예시

더보기

메모리에 0x12345678을 대입

 

Big-endian

메모리 주소 ... 0x100 0x101 0x102 0x103 ...
    0x12 0x34 0x56 0x78  

 

Little-endian

메모리 주소 ... 0x100 0x101 0x102 0x103 ...
변수 값   0x78 0x56 0x34 0x12  

 

 

인텔 x86(리틀엔디언) vs. 나머지 대부분 MIPS, …(빅엔디언)

 

레지스터 vs. 메모리

속도는 레지스터가 훨씬 빠르지만 개수가 작음

 

 

signed vs. unsigned

2의 보수

- 음수를 표현할 때 1의 보수(0->1/1->0)를 만들고 1을 더한 수

 

부호가 없으면(음수가 없으면) 더 큰 수를 표현 가능

- 1바이트로 0~255(unsigned) / -128~127(signed)

 

부호확장

- 16비트 정수에서 32비트 정수로 변환할 때 최상의 비트값을 빈 곳에 채움

 

명령어 형식

필드: 명령어의 각 부분

  • op(6): 명령어가 실행할 연산의 종류로서 연산자(opcode)라고 부름
  • rs(5): 첫 번째 근원지(source) 피연산자 레지스터
  • rt(5): 두 번째 근원지 피연산자 레지스터
  • rd(5): 목적지(destination) 레지스터. 연산 결과가 기억됨
  • shamt(5): 자리이동(shift) 량
  • funct(6): 기능(function). op 필드에서 연산의 종류를 표시하고 funct 필드에서 는 그중의 한 연산을 구체적으로 지정함

 

R타입 - 오른쪽 절반을 필드 3개로 볼 것인지

I타입 - 오른쪽 절반을 필드 하나로 볼 것인지

 

명령어

논리연산/쉬프트

- 쉬프트 연산: 왼쪽/오른쪽 쉬프트

- 비트 AND/OR/NOR/NOT -> NAND/NOR 중 하나로 나머지 모든 연산표현가능

- 비트마스크(bitmask): 특정비트만 뽑아내기

 

분기문

- 조건부(if)/무조건(loop)

- case/switch

 

함수(프로시져) 지원

함수는 리턴값 O/프로시져 또는 서브루틴은 리턴값 X

 

jal(Jump and Link)

- 함수의 복귀구조를 가짐

- PC 레지스터 -> 현재위치

- 스택포인터(SP) -> 리턴주소/인자리스트/리턴값

 

스택 vs. 힙

- 함수의 인자/리턴값은 스택에 저장(호출이 끝나면 사라짐)

- 상대적으로 오래남는 값은 힙에 저장

 

메모리 누출

- 할당받은 메모리를 돌려주지 않고 리턴(C/C++)

- 자바/C#에서는 Garbage Collection

- C/C++

  • 버퍼오버플로우 해킹에 취약 int a[10]; a[0]~a[9], a[15]=2;
  • 인자를 약속된 길이보다 긴 값을 기록해서 리턴값을 덮어씀(리턴주소 조작)

 

문자/문자열

ASCII

- 숫자를 문자로 해석

- 1바이트 사용

- 한글은 2바이트로 표현

 

문자열

- 문자열 앞에 길이표시

- 구조체 형태로 길이/문자열 표현

- 문자열의 끝을 표현하는 특수문자

 

유니코드

- UTF-16

- 모든 글자 2바이트 표현

- 평면개념 가져서 65000자 이상의 글자 표현 가능

 

UTF-8

- 1~4바이트 멀티바이트 유니코드

- 기존의 아스키코드는 1바이트

- 대역마다 2~4바이트

 

문자열 복사

- strcpy -> 경계값 취약

- strncpy -> 지정된 길이만큼만 복사, 취약X

 

MIPS의 주소 지정 방식

일반 분기

- 26비트 주소필드

- 하나의 프로그램 256MB이상 지원X

 

조건부 분기

- 16비트 주소필드

- PC값에 16비트 옵셋을 통한 간접지정

 

동기화

여러 개의 테스트 또는 프로세스가 동시에 동작할 때 데이터의 접근제어를 안전하게 만드는 기법

-원자성 제공

- DBMS의 트랜잭션

- Mutex(Mutual Exclusion) / Critical Section / Semaphore / Event / Inter-lock / ...

 

컴파일러/어셈블러

고수준 언어 -> 컴파일러 -> 어셈블리 -> 어셈블러 -> 링커/로더

 

인터프리터

속도: 컴파일러 > 인터프리터

- 인터프리터는 느리지만 바로 실행 가능(개발과정에서 장점)

- 컴파일러는 프로그램이 커지면 컴파일 시간이 따라서 증가

- 자바는 컴파일 언어지만 결과물인 클래스파일(.class)을 실행할 때는 인터프리팅 방식(JVM)으로 실행

 

JIT(Just In-Time)

- 실행시 컴파일 방식(일반적인 컴파일러 언어는 실행 전 컴파일)

- 컴파일이 종료되면 실행은 빠름

- 실행할 때마다 컴파일

 

AoT(Ahead-of-Time)

- 프로그램을 설치할 때 미리 컴파일을 진행하는 방식

 

2023.04.25 - [컴퓨터구조] - [컴퓨터구조] #3 명령어 종류, 기능과 형식 - 추가 사설 문제

 

[컴퓨터구조] #3 명령어 종류, 기능과 형식 - 추가 사설 문제

문제 프로세서의 클럭 속도와 성능 간의 관계는 무엇인가요? 전력 장벽이 프로세서의 클럭 속도에 어떤 영향을 미치나요? 시간이 지남에 따라 CPU 성능은 클럭 스피드와 멀티 코어 기술 측면에서

campus-coder.tistory.com

728x90
반응형