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

성찬홍·2025년 11월 2일

Computer Science

목록 보기
5/17
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
  • IEEE754 비교·변환: 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 전처리 과정

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

Step2 컴파일 과정

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

Step3 어셈블 과정

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

Step4 목적 파일 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개의 댓글