section .data ; 데이터(변수) 선언 영역
section .bss ; 초기화되지 않은 변수 영역
section .text ; 실행 코드 영역
global _start ; 프로그램의 진입점
.data 초기값이 있는 변수 저장
.bss 초기값이 없는 변수 저장
.text 실제 명령어 저장
.start 프로그램 실행이 시작되는 위치
CPU는 프로그램을 명령어 단위로 읽고 실행한다.
1. 명령어 읽기
2. 피연산자 해석
3. 해당 동작 수행
4. 다음 명령어로 이동
명령어 목적지, 원본
| 종료 | 설명 | 예시 |
|---|---|---|
| Register | CPU 내부 고속 저장 공간 | eax,ebx,ecx |
| Immediate | 코드 안에 직접 적힌 상수 | mov eax, 5 |
| Memory | 실제 메모리 주소에 있는 값 | mov eax, [num] |
메모리 접근 시 반드시 대괄호 []를 써야한다.
| 키워드 | 의미 | 예시 |
|---|---|---|
| db | byte (1바이트) | msg db 'A' |
| dw | word (2바이트) | num dw 1234 |
| dd | double word (4바이트) | value dd 10 |
| dq | quad word (8바이트) | big dq 12345678 |
word는 CPU가 한 번에 처리할 수 있는 데이터 단위(Unit)를 말한다.
예시
section .data
num dd 10 ; 정수형 변수 num = 10
msg db 'A' ; 문자형 변수 msg ='A'
CPU는 명령어를 하나씩 실행하면서 현재 위치(Program Counter, PC)를 관리한다.
| 구조 | 설명 |
|---|---|
| 순차 실행 | 위에서 아래로 한 줄씩 실행 |
| 비순차 실행 | 분기문으로 흐름 변경 |
jmp같은 분기문이 등장하기 전까지 CPU는.text내부 명령을 순서대로 실행하는 단순한 구조다.프로그램의 종료 구조
mov eax, 1 ;sys_exit 호출 번호 mov ebx, 0 ;종료 코드 0 int 0x80 ;리눅스 커널에 "프로그램 종료" 요청 (프로그램 종료)
추가적으로 알아보고 싶은 것
왜 프로그램 종료 구조는 저렇게 되는가
NASM, MASM, GAS 등 어셈블러 별 차이점과 공통점