컴퓨터 구조#2 명령어의 구조

성찬홍·2025년 11월 2일

Computer Science

목록 보기
5/22
post-thumbnail

소스 코드와 명령어

고급 언어

: 개발자가 이해하기 쉽게 만든 언어

  • 컴파일 언어

→ 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고, 이 과정을 컴파일이라고 한다. 컴파일 결과로 저급 언어인 목적 코드가 생성된다.

  • 인터프리터 언어

    • 인터프리터에 의해 한 줄씩 실행된다.
    • 소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요가 없다.

차이점)

컴파일 언어는 컴파일 도중 오류가 발생하면 전체 코드가 실행되지 않는다.

인터프리터 언어는 인터프리트 도중 오류가 발생하면 오류 발생 전까지의 코드가 실행된다.

저급 언어

: 컴퓨터가 이해하고 실행하는 언어

  • 기계어

    • 기계어는 0과 1로 이루어진 명령어로 구성된 저급 언어이다.
  • 어셈블리어

    • 어셈블리어는 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어이다.

명령어의 구조

명령어의 구조

: 명령어는 연산 코드오퍼랜드로 구성된다.

오퍼랜드

: 연산자가 계산·처리하는 대상 값을 말한다.

연산 코드 종류

데이터 이동

  • 레지스터/메모리/즉시값 사이 복사·이동: MOV, LDR/STR, LEA, PUSH/POP
  • 블록/문자열 이동: REP MOVS, STM/LDM

산술 연산

  • 정수 덧셈/뺄셈/곱셈/나눗셈: ADD, SUB, MUL/IMUL, DIV/IDIV
  • 증감/부호 반전: INC, DEC, NEG
  • 누산·곱셈-누산: MAC, MLA(ARM)

논리·비트 연산

  • AND/OR/XOR/NOT: AND, ORR/OR, EOR/XOR, NOT
  • 비교/테스트(플래그만 갱신): CMP, TST
  • 시프트/회전: SHL/LSL, SHR/LSR, SAR, ROR/ROL

제어 흐름(분기)

  • 무조건/조건 분기: JMP/B, JE/BEQ, JNE/BNE, JG/BGT
  • 호출/복귀: CALL/RET, BL/RET
  • 루프: LOOP(x86), 조건 분기 조합

스택·프로시저 지원

  • 스택 조작: PUSH, POP, PUSHA/POPA, ENTER/LEAVE
  • 프롤로그/에필로그 생성 보조(아키텍처별)

부동소수점 연산(FPU)

  • FADD, FSUB, FMUL, FDIV, FSQRT, FLD/FST
  • IEEE 754 비교·변환: FCOM, FIST, VCVT

벡터/SIMD 연산

  • 패킹·언패킹·수평/수직 연산: ADDPS/ADDPD, PMULLW, VPADDQ
  • 미디어/행렬·신호 처리 최적화: SSE/AVX/NEON 등

메모리·원자적 동기화

  • 캐시·메모리 장벽: MFENCE, DMB/DSB/ISB
  • 원자적 read-modify-write: XCHG, LOCK ADD, LDXR/STXR(ARM)

시스템/특권

  • 인터럽트/예외: INT, IRET, SVC
  • 제어 레지스터 접근, 모드 전환: MOV CRx, MSR/MRS, HLT, WFI
  • TLB/캐시 관리: INVLPG, TLBI

입출력(I/O)

  • 포트 I/O(x86): IN, OUT
  • 메모리맵 I/O는 일반 LDR/STR, MOV로 접근

문자열/메모리 처리(x86 전통)

  • CMPS, SCAS, STOS, LODS(+ REP 접두사)

암호/특수 가속(현대 ISA)

  • AES/CRC/해시 보조: AESENC, SHA1H, CRC32

명령어 주소 지정 방식

  • 유효 주소

    • 연산에 사용할 데이터가 저장된 위치
  • 명령어 주소 지정 방식

    • 연산에 사용할 데이터가 저장된 위치를 찾는 방법
    • 유효 주소를 찾는 방법
    • 다양한 명령어 주소 지정 방식
  1. 즉시 주소 지정 방식
  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
  • 가장 간단한 형태의 주소를 지정하는 방식이다.
  • 연산에 사용할 데이터의 크기가 작아질 수 있지만 빠르다.
  1. 간접 주소 지정 방식
  • 오퍼랜드 필드에 유효 주소의 주소를 명시한다.
  • 앞선 주소 지정 방식들에 비해 속도가 느리다.
  1. 레지스터 주소 지정 방식

  • 유효 주소

    • 연산에 사용할 데이터가 저장된 위치
  • 명령어 주소 지정 방식

    • 연산에 사용할 데이터가 저장된 위치를 찾는 방법
    • 유효 주소를 찾는 방법
    • 다양한 명령어 주소 지정 방식

소스 코드가 명령어가 되기까지

C 언어 컴파일 과정

Step 1 전처리 과정

  • 본격적으로 컴파일하기 전에 처리할 작업들
  • 외부에 선언된 다양한 소스 코드, 라이브러리 포함
  • 프로그래밍의 편의를 위해 작성된 매크로 변환
  • 컴파일할 영역 명시

Step 2 컴파일 과정

  • 전처리가 완료되어도 여전히 소스 코드
  • 전처리가 완료된 소스 코드를 저급 언어로 변환

Step 3 어셈블 과정

  • 어셈블리어를 기계어로 변환
  • 목적 코드를 포함하는 목적 파일이 됨

Step 4 목적 파일 vs 실행 파일

  • 목적 파일과 실행 파일은 둘 다 기계어로 이루어진 파일
  • 목적 파일과 실행 파일은 다르다.
  • 목적 파일은 링킹을 거친 이후에 실행 파일이 된다.

정리

  • 고급 언어 ↔ 저급 언어, 컴파일 vs 인터프리트 차이
  • 명령어 = 연산 코드 + 오퍼랜드, 대표 연산군만 묶음
  • 주소 지정 핵심: 즉시·레지스터·메모리(직접/간접)·베이스+오프셋/인덱스·PC 상대·자동 증감
  • 컴파일 흐름: 전처리 → 컴파일 → 어셈블 → 목적 파일 → 링킹 → 실행 파일

출처

https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

profile
꾸준한 개발자

0개의 댓글