컴퓨터 구조, 운영체제 공부 (3)

나무에물주기·2023년 4월 30일
1
post-thumbnail

3장: 명령어

3-1: 저급언어와 고급언어, 컴파일 언어와 인터프리터 언어, 목적 파일과 실행파일

1. 저급언어와 고급언어

  • 저급언어: 기계어와 어셈블리어 등으로, 고급언어는 C언어와 파이썬 등을 포함한다.
  • 고급언어: 사람이 이해하기 쉬운 문법으로 작성되며, 컴파일러나 인터프리터를 통해 기계어로 번역된다.
  • 저급언어(어셈블리어): MOV AX, 1 (AX 레지스터에 1을 저장)
  • 고급언어(C언어): int a = 1; (정수형 변수 a에 1을 저장)

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

  • 컴파일 언어: 소스 코드를 한 번에 기계어로 번역하여 실행 파일을 생성하는 언어.
  • 인터프리터 언어: 소스 코드를 한 줄씩 해석하여 실행하는 언어.

-> 컴파일 언어(C언어): 소스 코드를 기계어로 변환한 후 실행

#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}

-> 인터프리터 언어(Python): 소스 코드를 한 줄씩 해석하며 실행

print("Hello, World!")

3. 목적 파일과 실행파일

  • 목적 파일: 컴파일러에 의해 생성된 기계어 코드가 포함된 파일.
  • 실행파일: 컴퓨터에서 직접 실행할 수 있는 파일로, 기계어 코드와 실행에 필요한 데이터 및 리소스를 포함한다.
  • 목적 파일: main.o (C언어 소스 코드를 컴파일한 결과물)
  • 실행파일: main.exe (목적 파일을 링크한 최종 실행 파일)

3-2: 명령어의 구조, 연산코드와 오퍼랜드, 연산코드의 유형, 주소 지정 방식, 스택과 큐

1. 명령어 구조

  • 연산코드(opcode): 수행할 연산의 종류를 나타내는 부분.
  • 오퍼랜드(operand): 연산 대상이 되는 데이터나 데이터의 위치를 나타내는 부분.
  • 어셈블리어: ADD AX, BX (AX 레지스터와 BX 레지스터의 값을 더하여 AX 레지스터에 저장)
1. 연산코드(opcode): ADD
2. 오퍼랜드(operand): AX, BX

2. 연산코드의 유형

  • 데이터 전송: 레지스터와 메모리 간의 데이터 이동.
  • 산술/논리 연산: 덧셈, 뺄셈, 곱셈, 나눗셈 등의 산술 연산과 AND, OR, NOT 등의 논리 연산을 수행.
  • 제어 흐름 변경: 조건에 따라 프로그램의 실행 흐름을 변경하는 명령어.
  • 입출력 제어: 외부 장치와 데이터를 주고받는 명령어.
  • 데이터 전송: MOV AX, BX (BX 레지스터의 값을 AX 레지스터로 이동)
  • 산술/논리 연산: AND AX, BX (AX와 BX 레지스터의 값에 대한 비트 AND 연산 결과를 AX 레지스터에 저장)
  • 제어 흐름 변경: JMP label (프로그램 실행 흐름을 label로 변경)
  • 입출력 제어: IN AL, 60h (포트 60h로부터 데이터를 읽어 AL 레지스터에 저장)

3. 주소 지정 방식

  • 즉시 주소 지정 방식: 명령어의 오퍼랜드로 직접 상수 값을 사용.
  • 직접 주소 지정 방식: 메모리 주소를 직접 참조하여 데이터를 사용
  • 간접 주소 지정 방식: 레지스터가 가리키는 메모리 주소에서 데이터를 사용.
  • 레지스터 주소 지정 방식: 레지스터에 저장된 데이터를 사용.
  • 레지스터 간접 주소 지정 방식: 레지스터가 가리키는 메모리 주소의 주소에서 데이터를 사용.
  • 텍스트 즉시 주소 지정 방식: MOV AX, 1 (AX 레지스터에 1을 저장)
  • 직접 주소 지정 방식: MOV AX, [1000h] (메모리 주소 1000h의 값을 AX 레지스터로 이동)
  • 간접 주소 지정 방식: MOV AX, [BX] (BX 레지스터가 가리키는 메모리 주소의 값을 AX 레지스터로 이동)
  • 레지스터 주소 지정 방식: MOV AX, BX (BX 레지스터의 값을 AX 레지스터로 이동)
  • 레지스터 간접 주소 지정 방식: MOV AX, [[BX]] (BX 레지스터가 가리키는 메모리 주소의 주소에 저장된 값을 AX 레지스터로 이동)

4. 스택과 큐

  • 스택(stack): 데이터를 저장하는 자료 구조로, 가장 나중에 들어온 데이터가 가장 먼저 나가는 LIFO(Last In First Out) 방식을 따른다. PUSH와 POP 명령어로 데이터를 삽입하고 제거한다.
  • 큐(queue): 데이터를 저장하는 자료 구조로, 가장 먼저 들어온 데이터가 가장 먼저 나가는 FIFO(First In First Out) 방식을 따른다. ENQUEUE와 DEQUEUE 명령어로 데이터를 삽입하고 제거한다.

-> 스택 예시 (x86 어셈블리어)

section .data
    value1 dw 1
    value2 dw 2
    value3 dw 3

section .text
    global _start

_start:
    ; 값을 스택에 넣기 (push)
    mov ax, [value1]
    push ax
    mov ax, [value2]
    push ax
    mov ax, [value3]
    push ax

    ; 값을 스택에서 꺼내기 (pop)
    pop cx
    pop bx
    pop ax

    ; 프로그램 종료
    mov eax, 1
    xor ebx, ebx
    int 0x80

-> 큐 예시 (x86 어셈블리어)

section .data
    queue db 0, 0, 0, 0, 0
    front dw 0
    rear dw 0

section .text
    global _start

_start:
    ; 값을 큐에 넣기 (enqueue)
    mov ax, [rear]
    mov byte [queue+ax], 1
    inc word [rear]
    mov ax, [rear]
    mov byte [queue+ax], 2
    inc word [rear]
    mov ax, [rear]
    mov byte [queue+ax], 3
    inc word [rear]

    ; 값을 큐에서 꺼내기 (dequeue)
    mov ax, [front]
    mov cl, [queue+ax]
    inc word [front]
    mov ax, [front]
    mov bl, [queue+ax]
    inc word [front]
    mov ax, [front]
    mov al, [queue+ax]
    inc word [front]

    ; 프로그램 종료
    mov eax, 1
    xor ebx, ebx
    int 0x80
profile
개인 공부를 정리함니다

0개의 댓글