Chapter 3. 명령어 [혼자 공부하는 컴퓨터구조 + 운영체제]

수집가 루브도·2023년 8월 10일
0
post-thumbnail

3. 명령어


3-1. 소스코드와 명령어

1) 고급 언어와 저급 언어

  • 프로그래밍 언어 : 고급 언어와 저급 언어로 구분

(1) 고급 언어

  • 사람이 이해하고 작성하기 쉽게 만들어진 언어
    • c, c++. Java, Python 등
  • 컴퓨터는 이를 그대로 이해할 수 없다.

(2) 저급 언어

  • 컴퓨터가 직접 이해하고 실행할 수 있는 언어
    • 기계어, 어셈블리어
  • 명령어로 구성
  • 고급 언어로 작성된 소스코드는 반드시 저급 언어로 변환 필요
<기계어>
  • 0과 1로 이루어진 비트 조합의 명령어 모음
  • 오로지 컴퓨터를 위해 만들어진 언어라 의미 파악 어려움
<어셈블리어>
  • 기계어를 읽기 편한 형태로 번역한 언어

  • 니모닉 기호를 사용하여 연산 과정을 단어화

    • 아래 C#으로 작성한 코드의 어셈블리와 메모리 형태
 class Program   
 {   
   static void Main()
   {   
     int a = 10;   
     int b = 20;   
     Console.WriteLine(a + b);    
   }


어셈블리어 역시 고급 언어로 작성된 것보다는 한눈에 파악하기 어렵다는 것을 알 수 있다.


2) 컴파일 언어와 인터프리터 언어

  • 고급 언어의 저급 언어 변환 방식
  • 명확하게 구분 가능한 언어도 있지만 현대의 많은 언어는 경계가 모호

(1) 컴파일 언어

  • 컴파일 (Compile) : 컴파일 언어로 작성된 소스 코드 전체가 저급 언어로 변환되는 과정
    • 컴파일 과정에서 문법 적 오류, 실행 가능 여부, 불필요한 코드 파악
  • 컴파일러 (Compiler) : 위 컴파일 과정을 수행하는 도구
  • 컴파일 언어 : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환 이후 실행
    • C, C++ 등
  • 목적 코드 (Object Code) : 컴파일러를 통해 저급 언어로 변환된 코드

(2) 인터프리터 언어

  • 인터프리터 (Interpreter) : 소스 코드를 한 줄씩 변환하는 도구
    • Python 등
  • 컴파일 언어와의 비교
    • 전체를 변환하는 대기 시간 불필요
    • 오류가 있으면 실행이 불가능한 컴파일 언어와는 달리 오류가 있는 직전 줄까지는 실행
    • 한 줄 씩 해석하며 실행하기 때문에 일반적으로 컴파일 언어보다 느림

3) 목적 파일 vs 실행 파일

  • 목적 파일 : 목적 코드로 이루어진 파일
  • 실행 파일 : 실행 코드로 이루어진 파일
  • 링킹 (Linking) : 목적 코드 -> 실행 파일

3-2. 명령어의 구조

1) 연산 코드와 오퍼랜드

  • 명령어 = 연산 코드 + 오퍼랜드
    • 연산 코드(opreration code = 연산자) : 명령어가 수행할 연산
    • 오퍼랜드(operand = 피연산자) : 연산에 사용할 데이터
  • ALU 명령 코드 예
연산코드니모닉(mnemonic)설명
0000clr결과의 모든 비트를 0으로 만든다.
0001set결과의 모든 비트를 1으로 만든다.
0010notA의 비트 중 0은 1로, 1은 0으로 만든다.
0011negA에 2의 보수를 취한 -A를 결과값으로 반환한다.
1001andA and B
1010orA or B
1011xorA xor B
1100addA + B
1101subA - B

위에서 본 캡쳐에서 int = a = 10; 이라는 코드가 실행 될 때의 메모리를 확인할 수 있다.
초록색으로 표시한 주소의 명령어가 dword ptr 와 [rbh+2ch], 0Ah 로 구성되어 있음을 확인할 수 있다.
연산 코드 dword의 경우 앞서 Chapter 2. 에서 봤던 double word 를 의미하며 ptr은 포인터.
현재 코드에서 오퍼랜드가 [rbp+2Ch], 0Ah 두 개로 구성되어 있음을 알 수 있다.
rbp는 포인터를 저장하는 레지스터(스택 프레임에서 복귀 주소를 저장한다)
0A는 a 변수에 저장한 값 10과 일치한다.
이와 같은 명령어를 2-주소 명령어라고 한다.

  • 연산코드의 종류
    • 데이터 전송
      • MOVE / STORE / LAD(FETCH) / PUSH / POP
    • 산술/논리 연산
      • ADD / SUBTRACT / MULTIPLY / DIVIDE
      • INCREMENT / DECREMENT
      • AND / OR / NOT
      • COMPARE (TRUE/FALSE 반환)
    • 제어 흐름 변경
      • JUMP / CONDITIONAL JUMP / HALT / CALL / RETURN
    • 입출력 제어
      • READ(INPUT) / WRITE(OUTPUT) / START IO / TEST IO

2) 주소 지정 방식

  • 아키텍쳐에 따라 주소의 크기가 명령어의 길이를 결정하기 때문에 Opcode를 제외한 오퍼랜드에 주소 지정 방식(adressing mode) 필요

(1) 즉시 주소 지정 방식

  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
  • 표현할 수 있는 데이터의 크기가 작아지지만 메모리나 레지스터에서 검색하는 과정이 없어 가장 빠른 방식

(2) 직접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 유효 주소를 표현할 수 있는 범위가 Opcode를 제외한 만큼으로 한정

(3) 간접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소의 주소를 명시
  • 직접 주소 지정 방식에 비해 넓은 범위의 주소 표현이 가능하나 두 번의 메모리 접근으로 앞의 두 방식보다 느림

(4) 레지스터 주소 지정 방식

  • 오퍼랜드 필드에 연산에 사용할 데이터를 저장한 레지스터를 직접 명시
  • 메모리에 접근하는 것보다는 빠른 속도를 보여주나 직접 주소 지정 방식과 같이 표현 가능한 레지스터 크기에 제한

(5) 레지스터 간접 주소 주소 지정 방식

  • 연산에 사용할 데이터는 메모리에 저장하고 그 유효주소를 저장한 레지스터를 오퍼랜드 필드에 명시
  • 간접 주소 지정 방식에 비해 메모리 접근 횟수가 줄어듬

(Prefixes) [Opcode] (Mod R/M) (SIB) (Displacement) (Immediate)

(Prefixes): 4가지 그룹으로 구분되며 각 그룹에 속하는 접두사(각 1 바이트)가 선택적으로 붙을 수 있다.

[Opcode]: 1-3 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다. 이때 일부 SSE 명령어의 경우 prefix를 사용하는 것과 동일하게 인코딩되어 있으나(예: CVTDQ2PD: F3 0F E6h) 이는 opcode의 일부로, prefix로 취급되지 않는다.

(Mod R/M): 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다. 명령어에 따라 선택적으로 요구한다.

(SIB): [base + index * scale (+ disp.)] 형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다.

(Displacement): 1/2/4 바이트 크기의 displacement로 명령어에 따라 선택적으로 요구한다.

(Immediate): 1/2/4 바이트 크기의 immediate(명령어에 인코딩되는 숫자) 값으로 명령어에 따라 선택적으로 요구한다.


3) 스택과 큐

(1) 스택

  • Stack : Last In First Out (LIFO) 구조
    • 후입선출
    • PUSH : 스택에 새로운 데이터 저장 / POP : 스택 최상단 데이터 인출

(2) 큐

  • Queue : First In First Out (FIFO) 구조
    • 선입선출

참고자료

📚강민철, 『혼자 공부하는 컴퓨터 구조 + 운영체제』, 한빛미디어, 2022.
📹유튜브 공식 강의 6강, 7강
🐈‍⬛책 부록 GitHub
📚 조너선 스타인하트, 『한 권으로 읽는 컴퓨터 구조와 프로그래밍』, 오현석 옮김, 책만, 2021.
🖥️Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 2A

profile
다양하게 보고 배워 내 것으로 스케치하기

1개의 댓글

comment-user-thumbnail
2023년 8월 10일

많은 것을 배웠습니다, 감사합니다.

답글 달기

관련 채용 정보