소스 코드와 명령어
고급 언어
: 개발자가 이해하기 쉽게 만든 언어

- 컴파일 언어

→ 컴파일 언어로 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고(이 과정을 컴파일이라고 한다.). 컴파일 결과로 저급 언어인 목적 코드가 생성된다.
- 인터프리터 언어
- 인터프리터에 의해 한 줄씩 실행
- 소스 코드 전체가 저급 언어로 변화되기까지 기다릴 필요 없다.
차이점)
컴파일 언어는 컴파일 도중 오류가 발생하면 , 전체 코드가 실행되지 않는다.
인터프리터 언어는 인터프리트 도중 오류가 발생하면, 오류 발생 전가지의 코드가 실행된다.
저급 언어
:컴퓨터가 이해하고 실행하는 언어
- 기계어
- 기계어는 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 등
명령어 주소 지정 방식

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

- 유효 주소
- 명령어 주소 지정 방식
- 연산에 사용할 데이터가 저장된 위치를 찾는 방법
- 유효 주소를 찾는 방법
- 다양한 명령어 주소 지정 방식들
소스 코드가 명령어가 되기까지
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