"어셈블리 언어"- 왕쌍 12 장 인터럽트 내

https://zhidao.baidu.com/question/130424698.html

 

예컨대 8086 등의 기능이 제공되는 공통의 CPU 중 임의의 특정 메시지를 통해 검출하거나 내부적으로 생성되고 외부의 CPU에서 송신되어, 현재 실행중인 명령의 실행이 완료된 후에 수행 될 수 있고, 즉시 수신 할 정보가 처리된다. 이 특정 정보는, 우리는 그것을 호출 할 수 있습니다 : 인터럽트 정보를.

정보 인터럽트 CPU는 내부 및 외부에서 올 수

이 장에서 우리는 정보 인터럽트 내부 CPU 논의

인터럽트가 발생된다 12.1

인터럽트 소스 코드는 데이터의 바이트이며, 이는 정보의 인터럽트 2백56가지 소스를 나타낼 수있다.

내부 CPU 다음을 갖는 경우, 대응하는 인터럽트 정보를 발생한다.

1 : 나누기 오류, 예를 들면, 오버 플로우 실행 명령 생성 DIV 계열

2 : 단일 단계 실행

3 : 명령 실행에

4 : INT 명령 실행

8086CPU 정보의 인터럽트 소스를 식별하는 코드라는 데이터 형식에 의해 중단.

인터럽트 소스, 8086CPU 유형 코드는 다음과 같이의 전술 사가지 :

1. 제산 오류 : 0

2. 단일 단계 : 1

3. 명령 실행에 4

명령 실행 INT 4. 명령 INT 포맷 명령의 수 (n)가 즉시 바이트 타입 코드 인터럽트 CPU에 공급되고, N이다.

12.2 인터럽트 핸들러

CPU는 인터럽트 정보의 처리에 필요한 인터럽트 정보를 수신 한 후. 그것은 우리의 프로그램에 의해 결정될 수있다 중단하고 정보를 어떻게 처리됩니다. 일반적으로, 다른 인터럽트 기입 다른 정보 처리 프로그램에 대한 필요가있다.

본 첫 번째 문제는, CPU의 인터럽트 정보를 수신 한 인터럽트 핸들러의 입구를 결정하는 방법의 정보에 기초한다.

CPU 디자이너는 CPU 인터럽트 정보에 따라 실행되는 핸들러를 찾을 수 있다는 정보와 인터럽트 핸들러의 해당 항목 주소 사이에 링크를 설정해야합니다.

CPU의 설계는, 인터럽트 타입 코드는 인터럽트 핸들러의 효과 위치에 사용된다.

수 부수적 인 문제는 세그먼트와 오프셋 주소의 주소를 알아야, 어떻게 코드의 8 종류 않습니다에 따라 터미널의 인터럽트 핸들러의 세그먼트 주소와 오프셋 주소를 얻기 위해, 인터럽트 핸들러를 찾을 수있다?

12.3 인터럽트 벡터 표

인터럽트 타입 코드 8 비트 CPU 인터럽트는 인터럽트 벡터 테이블 핸들러의 적절한 엔트리 주소를 찾을 수 있습니다. 그래서 인터럽트 벡터는 무엇인가? 또는 인터럽트 핸들러 엔트리 주소.

상기 저장된 인터럽트 소스 (256)는 인터럽트 핸들러의 엔트리에 대응하는 상기 인터럽트 벡터 테이블이 메모리에 저장된다.

이 방식에서는 기본 문제는 CPU 인터럽트 벡터 테이블을 찾는 방법입니까? 이제, 인터럽트 벡터 테이블은 인터럽트 핸들러 항목의 전제 조건 주소에 의해 발견 인터럽트 타입 코드가되었다 찾을 수 있습니다.

인터럽트 벡터 테이블 메모리 인터럽트 벡터 테이블 주소 0에 지정, 8086PC 기용 메모리에 저장된다. 03FF 1,024 부에 기억 인터럽트 벡터 테이블 0000 : 0000-0000.

그런 다음 벡터 테이블, 그것은 휴식 공간이 얼마나되는지에 대한 계정에 항목? 인터럽트 벡터의 엔트리를, 인터럽트 엔트리 주소 8086CPU위한 핸들러이고, 엔트리 주소는 세그먼트 어드레스 및 오프셋 어드레스 단어를 나타내는 항목을 상위 워드 어드레스 세그먼트 저장 어드레스, 로우 어드레스를 포함 오프셋 어드레스 워드를 저장하는 단계를 포함한다.

4N이다 인터럽트 핸들러 항목의 오프셋 어드레스에 대응하는 인터럽트 소스 N 번호를 기억하는 어드레스 기억 수단

인터럽트 핸들러 입력 세그먼트 어드레스의 인터럽트 소스에 대응 N 번호를 기억하는 어드레스 기억 수단 4N + 2

12.4 인터럽트 처리

궁극적 인 목표의 엔트리 주소를 검색하면 CS와 IP를 설정하는 데 사용하는 것입니다, CPU는 인터럽트 핸들러가 실행됩니다.

타입 코드 인터럽트 인터럽트 벡터를 발견하고, CS 및 IP를 설정하는 데 사용할,이 작업은 자동으로 CPU의 하드웨어에 의해 수행된다.

CPU 하드웨어는이 인터럽트 처리라고 할.

CPU는 인터럽트 처리를 우선 인터럽트 루틴을 실행 한 정보를, 인터럽트 정보를 수신한다. 단말 하드웨어 프로세스가 완료되면, CS : IP 인터럽트 핸들러 엔트리를 가리, CPU 시작 인터럽트 핸들러를 실행.

중단, 세트 CS시 : IP, 원래 CS와 IP 값을 저장해야합니다. 서브 루틴 호출 명령이 같은 문제를 호출뿐만 아니라 서브 루틴 후 계속 실행의 원점으로 돌아가 사용할 때,이 때문에, 호출 명령은 CS와 IP의 현재 값을 저장 한 다음 CS 및 IP 설정합니다.

여기에 프로세스를 중단으로 인한 중단 정보를받은 후 8086CPU이다.

1. (인터럽트 정보)에서 인터럽트 형태 코드를 가져옵니다

2. (인터럽트 플래그 레지스터의 값을 변경하도록 스택에 먼저 저장하는 방법에서와 같이) 상기 플래그 레지스터 스택의 값

3. 플래그의 값 (이하,이 단계의 목적을 설명한다)를 TF IF 8의 0-9 레지스터

스택의 내용 4.CS

스택의 내용 5.IP

인터럽트 타입 코드 및 4 * 4 + 2 워드 단위는 IP 및 CS 제공된 인터럽트 핸들러의 엔트리 주소를 판독 * 인터럽트 타입 코드의 메모리 주소 6..

 당신은 스택에서 그들을 저장 CPU를 볼 수 있습니다. 우리는 할 수있는 작업의 중단 기간 동안 비트, 그렇게하기위한 목적으로, 다음 페이지에 설명한다 IF 플래그는, TF 등록을 설정하는 것입니다 점에 유의.

때문에 사이트를 복원하는 인터럽트 핸들러, CPU 요구 실행 한 후 (시간에이 상기 CPU의 각 레지스터의 값) 인터럽트 핸들러에 들어가기 전에. 그래서 로고를 수정하기 전에, 그것은 스택의 값을 저장합니다 등록해야합니다.

다음과 같이 우리 인터럽트 처리는 더 간결하게 설명되어 있습니다 :

인터럽트 유형 코드 N 받기 1

2kpushfa

3.TF = 0, = 0 IF

CS 밀어 4.

5.push IP

6.IP = N * 4, CS = N * 4 + 2

마지막 단계 후, CPU는 프로그래머가 작성한 인터럽트 처리 프로그램을 실행한다.

12.5 인터럽트 핸들러와 분노 지침

정보는 CPU가 중단 될 수있는 시간에 검출되기 때문에, 즉, 인터럽트 핸들러를 실행할 수있는 임의의 시간에서 CPU는 인터럽트 핸들러는 항상 소정 메모리 공간에 저장한다라고하는 것이다.

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

사용 1. 저장 레지스터

2. 인터럽트

사용 된 레지스터를 복원합니다

4. IRET 복귀 명령.

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

IP 팝

CS 팝

POPF

IRET 명령이 실행 된 후에, 인터럽트 핸들러의 실행 전에 지점 CPU에 저장된 프로그램을 계속한다.

12.6 분할 처리 에러 인터럽트

12.7 0 인터럽트 프로그래밍 프로세스

우리는 DO0라는 프로그램을 작성했습니다.

문제는 지금 : DO0이 그것을 넣어해야 어디?

우리는 운영 시스템에 적용해야 DO0 저장하는 메모리 영역의 조각을 얻고 싶었다 그래서 우리는 운영 체제의 상단에 컴퓨터를 사용하고 있기 때문에, 모든 하드웨어 자원, 운영 체제의 관리를 받고있다.

그러나 여기, 두 가지 이유로 우리는이 일을하지 않으려는 :

메인 라인에서 편차의 문제를 논의 할 것이다 너무 많은 메모리를 적용 (1)

2. 우리는 중요한 목표의 편집은 컴퓨터 프로그래밍 경험의 바닥을 얻을 수 있습니다 배운다. 가능한 경우에 따라서, 우리는 운영 시스템에 대한,하지만 직접 하드웨어 자원에 상관하지 않습니다.

문제는 단순하고 간단하게, 우리는 다른 절차를 적용하지 않습니다 메모리 영역을 찾아야합니다.

앞에 언급 된 메모리 0000 : 0000-0000 : 03FF, 공간 1킬로바이트 크기는 벡터 테이블 핸들러 엔트리 주소 시스템 인터럽트를 저장할 수있다. 그러나, 사실, 프로세스 인터럽트 이벤트 시스템은 256 훨씬 못 미친다.

일반적으로, 0000 : 0200-0000 : 인터럽트 벡터 테이블에 대응 02FF 256 바이트의 공간이 비어있다.

결론 : 우리는 0000 DO0 메모리로 전송할 수 있습니다 : 0200.

12.8 설치

12.9 DO0

12.10 설정 인터럽트 벡터

12.11 단일 단계 브레이크

하자 짧게는 한 단계 디버그 CPU의 사용이 인터럽트 기능을 제공하는 방법을 고려한다.

인터럽트 핸들러 단일 단계를 제공 인터럽트 우선 디버그 함수는 모든 레지스터의 내용을 입력 명령을 기다릴 표시. t와 명령어 실행이 디버그 TF가 1로 설정되었을 때, CPU 따라서 단일 단계 인터럽트 모드에서 동작 함.

인터럽트 핸들러에 들어가기 전에, TF = 0으로 설정. 따라서, 인터럽트 핸들러를 실행하는 경우 발생하는 인터럽트 CPU 단일 단계를 회피.

그 과정에서이 단계 인터럽트 TF = 0이 이유입니다.

(이 문제를 다시 궁리)

인터럽트 12.12에 응답하여 예외적 인 상황

어떤 경우에는, 현재 명령 후 CPU는 중단이 발생하더라도,이 응답하지 않습니다, 완료합니다. 예를 들어, 레지스터 SS로 데이터를 송신하기위한 명령은 인터럽트가 발생했을 경우에도, 실행 된 후, CPU는 반응하지.

우리는 명령어 세트가 바로 SS SP 명령 실행을 제공 그래서,이 기능 세트 SS 특검팀과 행에 저장된 명령을 활용해야하며,이 사이에, CPU는 인터럽트 처리가 발생하지 않습니다.

실험 12 쓰기 0 인터럽트 핸들러

추천

출처www.cnblogs.com/JasonPeng1/p/12110079.html