WIPIVERSE

INT (x86 명령어)

INT (Interrupt) – x86 명령어

개요

INT는 x86 계열 프로세서에서 소프트웨어 인터럽트를 발생시키는 명령어이다. 지정된 인터럽트 벡터 번호를 인수로 받아, 현재 실행 흐름을 인터럽트 핸들러로 전환한다. 이 명령은 실시간 운영 체제, 시스템 콜, 디버깅 등 다양한 상황에서 사용된다.

형식

INT imm8            ; 8비트 즉시값을 인터럽트 벡터 번호로 사용
INT 3               ; 1바이트 형태의 브레이크포인트 인터럽트 (특수 코드)
  • imm8 : 0‑255 범위의 즉시값. 해당 값은 인터럽트 디스크립터 테이블(IDT)에서 엔트리를 선택한다.
  • INT 3 은 특수한 1바이트 인코딩 (0xCC)을 사용하며, 디버거가 브레이크포인트를 설정할 때 주로 사용된다.

동작 과정

  1. 스택에 상태 저장
    • 현재 EFLAGS(또는 RFLAGS) 레지스터, CS(코드 세그먼트), 그리고 EIP(또는 RIP)가 스택에 푸시된다.
  2. 플래그 조정
    • 인터럽트 플래그(IF)와 트레이스 플래그(TF)가 클리어되어, 인터럽트 핸들러 실행 중에 또 다른 인터럽트가 발생하지 않도록 한다.
  3. 핸들러 주소 로드
    • 현재 프로세서 모드(실모드, 보호 모드, 장기 모드)와 현재 특권 레벨(CPL)에 따라 IDT에서 해당 벡터 엔트리를 읽는다.
    • 엔트리에서 지정된 세그먼트 선택자와 오프셋을 CS:IP(또는 CS:RIP)에 로드한다.
  4. 핸들러 실행
    • 새로운 코드 흐름이 시작된다. 핸들러는 필요에 따라 스택에 저장된 레지스터를 복구하고 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 아키텍처에서 소프트웨어 인터럽트를 발생시키는 핵심 명령어로, 시스템 초기화, 운영 체제 서비스 호출, 디버깅 등 다양한 용도로 활용된다. 명령어 자체는 간단하지만, 실행 시점에 따라 실모드, 보호모드, 장기 모드에서의 동작 차이와 권한 검사가 적용되어야 한다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기