- 저급언어(어셈블리어): MOV AX, 1 (AX 레지스터에 1을 저장)
- 고급언어(C언어): int a = 1; (정수형 변수 a에 1을 저장)
-> 컴파일 언어(C언어): 소스 코드를 기계어로 변환한 후 실행
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
-> 인터프리터 언어(Python): 소스 코드를 한 줄씩 해석하며 실행
print("Hello, World!")
- 목적 파일: main.o (C언어 소스 코드를 컴파일한 결과물)
- 실행파일: main.exe (목적 파일을 링크한 최종 실행 파일)
- 어셈블리어: ADD AX, BX (AX 레지스터와 BX 레지스터의 값을 더하여 AX 레지스터에 저장)
1. 연산코드(opcode): ADD
2. 오퍼랜드(operand): AX, BX
- 데이터 전송: MOV AX, BX (BX 레지스터의 값을 AX 레지스터로 이동)
- 산술/논리 연산: AND AX, BX (AX와 BX 레지스터의 값에 대한 비트 AND 연산 결과를 AX 레지스터에 저장)
- 제어 흐름 변경: JMP label (프로그램 실행 흐름을 label로 변경)
- 입출력 제어: IN AL, 60h (포트 60h로부터 데이터를 읽어 AL 레지스터에 저장)
- 텍스트 즉시 주소 지정 방식: 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 레지스터로 이동)
-> 스택 예시 (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