어셈블리 언어 - 인터럽트 내

중단 CPU가 아래로 수행하지만,이 특정 정보를 처리하기 위해 설정하는 (명령이 바로 실행) 다음되지 않지만,이 특정 정보를 우리가 인터럽트 정보를 호출 할 수있는 수단. 인터럽트 정보를 즉시 CPU 처리의 일종을 요구되면, 처리는 통지 정보에 필요한 파라미터를 제공하기 위해 수행된다.

인터럽트 세대 내

내부 CPU의 발생에 응답하여 발생하는 다음 갖는다 8086CPU위한 인터럽트 메시지 .

  • 나누기 오류, 예를 들면, 분할 실행 명령 생성 DIV 오버플;
  • 단일 단계 실행;
  • 실행에 대한 지침;
  • INT 명령 실행.

그리고 인터럽트 정보가 있어야합니다 인터럽트 타입 코드를 단말기 식별 정보 소스에 대한 데이터를. 인터럽트 소스 코드를 나타낼 수 있고, 데이터 바이트 (256) 정보는 인터럽트 소스의 다양한.
8086CPU 단말기 타입 코드는 다음과 같다.

  • 나누기 오류 : 0
  • 단일 단계 : 1
  • 명령 실행에 : 4
  • 명령 실행 INT, INT 명령의 포맷 명령의 수 (n)가 즉시 바이트 타입 코드 인터럽트 CPU에 공급되고, N이다.

인터럽트 핸들러

우리는 인터럽트 정보를 처리 할 수있는 프로그램을 작성하는 것은이라고 인터럽트 핸들러 .
팔 개 터미널 유형 코드 세그먼트 주소와 오프셋 주소에서 핸들러를 얻을 수있는 방법 인터럽트 핸들러를 실행하려면?

인터럽트 벡터 테이블

  • 인터럽트 벡터 인터럽트 핸들러 항목 주소입니다.
  • 인터럽트 벡터 테이블은 인터럽트 핸들러 엔트리 주소의 목록입니다.

인터럽트 벡터 테이블 인터럽트 핸들러의 엔트리에 대응하는 저장된 인터럽트 정보 소스 (256)는, 엔트리 주소는 세그먼트 어드레스 및 오프셋 어드레스, 포함 03FF 기억 부 1024 : 메모리 0000에 0000-0000 엔트리가 2 바이트 상위 어드레스 워드 세그먼트에 저장된 어드레스, 오프셋 어드레스 저장 로우 어드레스 워드를 차지한다. 그냥 CPU 인터럽트 타입 코드를 알고, 해당 테이블 항목을 찾을 수 인터럽트 핸들러의 엔트리 주소를 얻기 위해, 인터럽트 타입 코드 엔트리 수 규모에 인터럽트로 사용할 수 있습니다.

프로세스를 중단

이 과정은 유형 코드를 발견하고, CS 및 IP를 설정하는 데 사용하는 인터럽트 처리 인터럽트 벡터에 의해 중단됩니다.
여기에 프로세스를 중단으로 인한 중단 정보를받은 후 8086CPU이다.

  • (인터럽트 정보에서) 인터럽트 타입 코드를 가져옵니다;
  • (인터럽트 플래그 레지스터, 제 스택에 저장된 값을 변경하는 과정에서와 같이) 상기 플래그 레지스터의 값을 푸시;
  • 제 8 플래그는 IF (9)을 등록하고 TF가 0으로 설정하는 단계;
  • 스택의 CS 내용;
  • 컨텐츠 IP 스택;
  • 메모리 어드레스로부터 인터럽트 소스 코드 (4) 및 인터럽트 소스 코드 엔트리 주소 개의 서브 유닛 4 + 2 IP 및 CS 제공된 인터럽트 핸들러를 읽는다.

더 간결하게 표현 인터럽트 처리 등 다음과 같습니다 :

取得中断类型码 N;
pushf
TF=0,IF=0
push CS
push IP
(ip)=(N*4),(CS)=(N*4+2)

인터럽트 핸들러와 지침 IRET

인터럽트 핸들러는 제조 방법 및 루틴, 다음과 같은 기존의 단계와 매우 유사합니다 :

  • 저장 레지스터를 사용;
  • 인터럽트;
  • 사용 레지스터를 복원;
  • IRET 명령으로 돌아갑니다.

IRET 명령 기능 어셈블러 구문을 설명한다 :

pop ip
pop cs
popf

IRET 일반적으로 자동으로 수행 및 하드웨어 함께 사용하여 프로세스를 인터럽트. 중단과 정확하게 일치 IRET 레지스터 스택의 순서 동안.

0 인터럽트 처리 쓰기

;因为除法溢出随时可能发生,CPU随时都可能将CS:IP只想程序的入口,执行程序,所以我们将程序放入内存中。
;因为系统要处理的中断事件远没有达到256个,所以在中断向量表中,有许多单元是空的。

assume cs:code

code segment
start:

;安装:将中断处理程序代码送入中断向量表中。
    mov ax,cs
    mov ds,ax
    mov si,offset do0   ;ds:si指向源地址

    mov ax,0
    mov es,ax
    mov di,200h         ;es:di指向目的地址
    mov cx,offset do0end-offset do0 ;设置cx为传输长度 ;-是编译器识别的运算符号,编译器可以用它来进行两个常数的减法。
    cld     ;设置传输方向为正
    rep movsb
    
;设置中断向量:将do0的入口地址,写入中断向量表的0号表项中,使do0为0号中断的中断处理程序
    mov ax,0
    mov es,ax
    mov word ptr es:[0*4],200h
    mov word ptr es:[0*4+2],0

    mov ax,4c00h
    int 21h
    
;中断处理程序代码
    do0: jmp short do0start 
        db "overflow!"  ;放在data段执行完后内存被系统释放数据可能被覆盖

    do0start:
        mov ax,cs
        mov ds,ax
        mov si,202h     ;ds:si指向字符串,复制到0:200处
        
        mov ax,0b800h
        mov es,ax
        mov di,12*160+36*2  ;显示位置

        mov cx,9
        s:
            mov al,[si]
            mov es:[di],al
            inc si
            add di,2
            loop s
        mov ax,4c00h
        int 21h
    do0end:nop
code ends
end start

단일 단계 인터럽트

모니터링되는 경우, 기본적으로, 명령의 실행이 완료된 후, CPU는, 상기 플래그 레지스터는 TF의 비트가 1이고, 생성되는 인터럽트 단일 단계는, 인터럽트 처리가 시작된다. 인터럽트 타입 코드 1 인터럽트 한 단계는, 상기 인터럽트 처리는 다음과 같이 제기이다.

  1. 트랩 플래그 TF (트랩 플래그) 디버깅을위한 단일 단계로 동작;
  2. TF = 1은 각각의 명령이 실행 된 후 트랩은, 컴퓨터 시스템을 제어;
  3. TF = 0 CPU가 제대로 작동 할 때.
  4. 인터럽트 플래그 (인터럽트 플래그) IF;
  5. IF = 1은 CPU 마스크 가능 인터럽트 요청을 허용;
  6. IF = 0 닫기 중단.
  • 인터럽트 타입 코드 1을 얻으십시오;
  • 플래그 레지스터 스택은, TF는, IF는 0으로 설정된다;
  • CS, IP 스택;
  • (IP) = (1 4) (CS) = (1 4 + 2).

전술 한 바와 같이, TF = 1, 그 다음 좋은 지시를 실행하면, CPU (1)는, 인터럽트 핸들러를 실행하도록 설정된다.

추천

출처www.cnblogs.com/chengmf/p/12499339.html