INT (Interrupt) – x86 명령어
개요
INT는 x86 계열 프로세서에서 소프트웨어 인터럽트를 발생시키는 명령어이다. 지정된 인터럽트 벡터 번호를 인수로 받아, 현재 실행 흐름을 인터럽트 핸들러로 전환한다. 이 명령은 실시간 운영 체제, 시스템 콜, 디버깅 등 다양한 상황에서 사용된다.
형식
INT imm8 ; 8비트 즉시값을 인터럽트 벡터 번호로 사용
INT 3 ; 1바이트 형태의 브레이크포인트 인터럽트 (특수 코드)
imm8: 0‑255 범위의 즉시값. 해당 값은 인터럽트 디스크립터 테이블(IDT)에서 엔트리를 선택한다.INT 3은 특수한 1바이트 인코딩 (0xCC)을 사용하며, 디버거가 브레이크포인트를 설정할 때 주로 사용된다.
동작 과정
- 스택에 상태 저장
- 현재
EFLAGS(또는RFLAGS) 레지스터,CS(코드 세그먼트), 그리고EIP(또는RIP)가 스택에 푸시된다.
- 현재
- 플래그 조정
- 인터럽트 플래그(
IF)와 트레이스 플래그(TF)가 클리어되어, 인터럽트 핸들러 실행 중에 또 다른 인터럽트가 발생하지 않도록 한다.
- 인터럽트 플래그(
- 핸들러 주소 로드
- 현재 프로세서 모드(실모드, 보호 모드, 장기 모드)와 현재 특권 레벨(CPL)에 따라 IDT에서 해당 벡터 엔트리를 읽는다.
- 엔트리에서 지정된 세그먼트 선택자와 오프셋을
CS:IP(또는CS:RIP)에 로드한다.
- 핸들러 실행
- 새로운 코드 흐름이 시작된다. 핸들러는 필요에 따라 스택에 저장된 레지스터를 복구하고
IRET명령으로 복귀한다.
- 새로운 코드 흐름이 시작된다. 핸들러는 필요에 따라 스택에 저장된 레지스터를 복구하고
주요 사용 사례
| 상황 | 예시 인터럽트 | 설명 |
|---|---|---|
| 디버깅 | INT 3 |
디버거가 브레이크포인트를 삽입할 때 사용. 1바이트 크기로 코드 크기와 패치가 최소화됨. |
| DOS 시스템 콜 | INT 0x21 |
MS‑DOS API 호출에 사용. 파일 I/O, 프로세스 제어 등 다양한 서비스 제공. |
| 리눅스 시스템 콜 (32‑bit) | INT 0x80 |
리눅스 커널에 시스템 콜을 전달 (현대 커널에서는 sysenter/syscall이 주로 사용). |
| BIOS 서비스 | INT 0x10, INT 0x13 등 |
비디오, 디스크, 키보드 등 하드웨어 초기화 및 서비스 제공. |
| 소프트웨어 예외 | INT 0x0~INT 0x1F |
CPU 정의 예외(분할 오류, 무효 연산 등)와 연관된 벡터. 일반적으로 하드웨어 인터럽트와 구분됨. |
특수 고려 사항
- 권한 수준: 보호 모드에서
INT는 현재 CPL이 인터럽트 게이트의 DPL(Descriptor Privilege Level)보다 낮거나 같은 경우에만 허용된다. 그렇지 않으면#GP(General Protection Fault)가 발생한다. - 실모드와 보호모드 차이: 실모드에서는 인터럽트 벡터가 1KB 크기의 인터럽트 벡터 테이블(IVT)에서 직접 주소를 가져오지만, 보호모드에서는 IDT 엔트리의 형식에 따라 세그먼트 선택자와 오프셋을 해석한다.
- 장기 모드 (64‑bit):
INT명령은 여전히 사용할 수 있지만, 대부분의 운영 체제는 빠른 시스템 콜 전이 메커니즘(SYSCALL/SYSENTER)을 선호한다.INT는 여전히 예외 처리(예:#BP와#OF)에 사용된다. - 명령어 크기:
INT imm8: 2바이트 (CD xx)INT 3: 1바이트 (CC)
관련 명령어
IRET/IRETD/IRETQ: 인터럽트 핸들러 종료 시 원래 흐름으로 복귀.INT1(ICEBP) : 디버그 예외를 발생시키는 1바이트 명령어 (F1).INTO: 오버플로우 플래그가 설정된 경우#OF예외를 발생시킨다.
문서 및 표준
- Intel® 64 and IA‑32 Architectures Software Developer’s Manual, Volume 2 (Instruction Set Reference) –
INT명령어 설명. - AMD64 Architecture Programmer’s Manual, Volume 3 – 인터럽트 및 예외 처리 절차.
결론
INT는 x86 아키텍처에서 소프트웨어 인터럽트를 발생시키는 핵심 명령어로, 시스템 초기화, 운영 체제 서비스 호출, 디버깅 등 다양한 용도로 활용된다. 명령어 자체는 간단하지만, 실행 시점에 따라 실모드, 보호모드, 장기 모드에서의 동작 차이와 권한 검사가 적용되어야 한다.