Lecture #12 인터럽트 Interrupt.

Slides:



Advertisements
Similar presentations
Family 의 개요 의 외부 Pin 기능과 내부 기능 Memory 구조 Timing 2 장 8051 의 구조.
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
마이크로프로세서설계 - 3 ATmega128 마이크로컨트롤러의 특징 LED 실습 1
ISA 심화 및 start.S code 분석 SIOR 15th 최재훈.
Basic of Buffer Over Flow
Shellcode 작성 김영성.
CRT 뽀개기 신영진.
Part01. 시스템 해킹을 위한 기초 지식 Chapter01. 운영체제에 대한 이해
제 2장 컴퓨터 구조.
리눅스 커널의 이해 중에서 4장. 인터럽트와 예외 이성현 네트워크 실험실.
9장 가로채기(Interrupt) Slide 1 (of 15).
4장 어셈블리 프로그램 작성의 기본 어셈블러 어셈블리 언어 요소 예제 프로그램 데이터 정의
제4장 어셈블리어.
제4장 어셈블리어.
기본 컴퓨터 프로그래밍 Lecture #6.
인터럽트 Interrupt 시스템 프로그래밍 - Lecture #8 신라대학교 컴퓨터공학과 시스템프로그래밍.
Lecture #5 어셈블리어 (2) 매크로 어셈블리어 시스템프로그래밍.
Department of Computer Engineering
10장 주변장치 (PIO) Slide 1 (of 28).
Lecture #7 어셈블리어 (4) 매크로 어셈블리어 시스템프로그래밍.
제7강 학습 내용 주소지정 방식의 예 값 즉시 지정 방식과 실행 예 레지스터 직접지정 방식 메모리 직접지정 방식과 실행 예
제 7 장 링커와 로더 설계.
제 1 장 마이크로프로세서의 기본동작.
2 AVR ATmega128 소개 마이크로컨트롤러 AVR ATmega128.
Lecture # 어셈블러 설계.
3장 MPU 내부구조 Slide 1 (of 28).
2 80×86 시스템에 대한 이해.
Software Exploit and Kernel Protection
출처: IT CookBook, 컴퓨터 구조와 원리 2.0 제 12장
어셈블리 문법 보강 4월 10일.
4장. 컴퓨터 시스템의 구성과 기능 다루는 내용 컴퓨터 분해를 통한 본체 살펴보기 컴퓨터 구성요소 컴퓨터의 기능
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
Lecture #8 어셈블리어 (5) 매크로 어셈블리어 시스템프로그래밍.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
10장 메모리 관리.
Department of Computer Engineering
Computer Architecture
제 5장 매크로 프로세서 설계.
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
6 중앙처리장치의 조직과 기능 IT CookBook, 컴퓨터 구조와 원리 2.0.
Chapter 06 명령어와 번지지정 방식.
제 6 장 8086 어셈블러 설계.
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
제3장 8086 프로세서의 내부구조.
제 2장 컴퓨터동작의 기본 개념.
Department of Computer Engineering
임베디드 소프트웨어 설계.
10장. 중앙처리 장치의 명령어 다루는 내용 어셈블리 프로그램의 이해 인터럽트(interrupt) 명령어 세트 주소 지정 방식.
명품 C++ 프로그래밍 1장. C++ 시작.
Buffer Overflow
제 장 학습내용 C 언어에서의 인터럽트 사용 레지스터를 위한 자료구조 인터럽트를 수행하기 위한 명령어
어셈블리어 (2) 매크로 어셈블리어 시스템 프로그래밍 - Lecture #4
SYSMAC GATEWAY 간이 매뉴얼.
PIC16C84의 외형 RA2 1 RA1 I/O PIN I/O PIN RA3 RA0 RTCC OSC1 발 진 RESET
8051 IO-PORT 정보통신•컴퓨터 공학부 송명규
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Copyrightⓒ ohta. All Rights Reserved.
11장. 마이크로 프로세서 내부 구조.
Chapter 4 변수 및 바인딩.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
컴퓨터활용능력1급필기 06 PC 운영체제(2) Windows 탐색기 제어판 인쇄.
제 3 장 운영체제와 입출력 방식 Section 1 입출력 기능 Section 2 입출력 방식 Section 3 입출력 버퍼링
쉽게 풀어쓴 C언어 Express 제1장 프로그래밍의 개념 C Express.
제4강 학습내용 인텔프로세서의 발전 과정 8086 프로세서와 80i86프로세서 개요 인텔 펜티엄 IV프로세서 개요
10장. 컴퓨터 구조에 대한 세 번째 이야기 작성자: 윤성우.
printf("Global Korea\n");
Assembly 05 방호남 07 반지훈 09 박상욱.
Lecture 7 7-Segment LED controller using u-controller
Presentation transcript:

Lecture #12 인터럽트 Interrupt

인터럽트 Interrupt (1) 인터럽트 interrupt 주변 장치가 요구된 동작을 완료하였거나 오류 등의 event가 발생하였을 때 또는 실행중인 프로그램에 오류가 발생하였을 때에 CPU에게 알려주기 위해 발생하는 신호 cf) Event Polling 인터럽트 핸들러 Interrupt Handler 인터럽트 서비스 루틴 인터럽트가 발생한 원인을 해결해주는 프로그램 루틴 인터럽트 벡터 테이블 Interrupt Vector Table 인터럽트 핸들러 주소를 저장하고 있는 테이블

인터럽트 Interrupt (2) 인터럽트 처리 CPU는 인터럽트가 발생하면 현재 실행하는 프로그램을 중지 CPU의 상태(CS, IP, Flag registers 등)을 스택에 저장 발생한 인터럽트의 핸들러를 실행하여 인터럽트를 처리 인터럽트 벡터 테이블에서 해당 인터럽트의 핸들러 주소를 찾고 CPU의 상태를 변경하여 인터럽트 핸들러를 실행 인터럽트 처리 완료 후에 원래 프로그램을 다시 실행 스택에 저장된 이전 프로그램의 상태를 복구하여 프로그램 실행을 resume

인터럽트 Interrupt (3) 인터럽트 처리 source : MOV AX, 1 MOV BX, 2 SUB AX, BX Interrupt Processing Routine CS/IP/Flag Register를 스택에 저장 인터럽트 번호를 통해 원인 파악 CALL ISP CS/IP/Flag Register를 스택에서 복구 RETURN Interrupt Service Routine Interrupt Processing RETURN INT

인터럽트 Interrupt (4) 인터럽트 중첩 처리 인터럽트 처리 루틴을 실행하는 중에 새로운 인터럽트가 발생하는 경우 Interrupt Pending 이전 인터럽트의 처리가 종료될 때까지 인터럽트 처리를 연기 Priority-based Preemption 인터럽트의 우선순위를 따져 새로운 인터럽트의 우선순위가 높으면 현재의 인터럽트 처리를 중지한 다음, 새로운 인터럽트를 먼저 처리하고 중지된 인터럽트를 처리

인터럽트 Interrupt (5) 인터럽트 종류 하드웨어 인터럽트 소프트웨어 인터럽트 예외상태에 따른 인터럽트 ROM BIOS 인터럽트 DOS 인터럽트 예외상태에 따른 인터럽트 트랩(Trap)

하드웨어 인터럽트 (1) 하드웨어 인터럽트 CPU 또는 주변 장치에서 발생하는 인터럽트 8259 인터럽트 컨트롤러를 사용하여 처리 주변 장치로부터 최대 8개까지의 인터럽트를 받아 우선순위에 기반하여 처리 XT – 1개의 8259 사용  8개의 IRQ(IRQ0~IRQ7) 를 처리 AT – 2개의 8259 사용  16개의 IRQ(IRQ0~IRQ15)를 처리 2개의 8259가 cascading Interrupt 번호가 우선순위를 의미 IRQ0 > IRQ1 >IRQ2 > IRQ8 > … > IRQ15 > IRQ3 > …> IRQ7

하드웨어 인터럽트 (2) 8259 인터럽트 컨트롤러 내부 구조 IRR, ISR, IMR 레지스터의 역할

하드웨어 인터럽트 (3) 8259 인터럽트 컨트롤러 Cascading

하드웨어 인터럽트 (4) 하드웨어 인터럽트 종류 Maskable Interrupt Non-maskable Interrupt 프로그램에서 마스킹 명령어에 의해 인터럽트 발생을 무시할 수 있는 인터럽트 CLI(Clear Interrupt) / STI(SeT Interrupt) Non-maskable Interrupt 어떤 상황에서도 마스킹할 수 없는 인터럽트 CPU가 기억장치나 I/O 채널을 통해 읽을 때의 데이터 오류 CPU Interrupt CPU가 발생시키는 인터럽트 Peripheral Device Interrupt 주변 장치에서 발생시키는 인터럽트

소프트웨어 인터럽트 (1) 소프트웨어 인터럽트 프로그램의 요구에 의해 발생하는 인터럽트 인터럽트 핸들러의 위치에 따라 ROM BIOS Interrupt DOS Interrupt DOS에 대한 응용 프로그램의 시스템 콜(System Call) 방법을 제공 응용 프로그램이 DOS에게 일련의 서비스를 요구할 때에 소프트웨어 인터럽트를 발생시킨다 INT 명령어

소프트웨어 인터럽트 (2) 어셈블리어에서의 인터럽트 사용 INT 명령어를 사용하여 원하는 인터럽트를 발생시킴 인터럽트 처리에 필요한 매개변수를 지정된 레지스터에 먼저 저장하도록 한다 예: MOV DL, ’A’ MOV AH, 2 INT 21H

소프트웨어 인터럽트 (3) 어셈블리어에서의 인터럽트 사용 어셈블리 프로그램에서의 인터럽트 사용 예: STACK SEGMENT STACK DB 1000 DUP(?) STACK ENDS ; DATA SEGMENT DATA MSG1 DB ‘I like Computer.’, 0DH, 0AH, ‘$ MSG2 DB ‘Do you like Computer?’, ‘$’ DATA ENDS PROG SEGMENT PARA ‘CODE’ ASSUME CS:PROG, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AH, 09H MOV DX, OFFSET MSG1 INT 21H MOV AH, 09H MOV DX, OFFSET MSG2 INT 21H ; MOV AH, 4CH PROC ENDS END START

소프트웨어 인터럽트 (4) C 언어에서의 인터럽트 사용 “dos.h” 헤드 파일에 DOS 인터럽트 호출과 관련된 데이터 타입과 함수 prototype을 정의 레지스터 구조체 예: struct WORDREGS { unsigned int ax, bx, cx,dx, si, di, cflag, flags; }; struct BYTEREGS { unsigned char al, ax, bl, bh, cl, ch, dl, dh; } union REGS { struct WORDREGS x; struct BYTEREGS h; struct SREGS { unsigned int es, cs, ss, ds;

소프트웨어 인터럽트 (5) C 언어에서의 인터럽트 사용 인터럽트 호출 함수 Prototype : int int86(int intno, union REGS *inregs, union *outregs); int int86x(int intno, union REGS *inregs, union *outregs, struct SREGS *segregs); int intdos(union REGS *inregs, union *outregs); int intdosx(union REGS *inregs, union *outregs,

소프트웨어 인터럽트 (6) C 언어에서의 인터럽트 사용 인터럽트 호출 C 언어 프로그램 예제 #include <stdio.h> #include <dos.h> union REGS reg; void main() { static char msg1[]=“I like Computer.\r\n$”; static char msg2[]=“Do you like Computer?$”; reg.x.dx = (int)msg1; reg.h.ah = 9; int86(0x21, &reg, &reg); }

인터럽트 핸들러 작성 (1) 인터럽트 핸들러 변경 원하는 인터럽트를 처리할 수 있는 인터럽트 처리 루틴을 작성 인터럽트 벡터 테이블에서 인터럽트 벡터(인터럽트 핸들러 주소)를 찾아 새로 작성된 인터럽트 핸들러 주소로 대치 원래의 주소는 저장하였다가 원 상태로 되돌릴 때에 사용

인터럽트 핸들러 작성 (2) 인터럽트 벡터 테이블 인터럽트 핸들러 주소를 저장하고 있는 테이블 메모리 영역 0000:0000H ~ 0000:03FFH (1KB)에 위치 구조: 인터럽트 번호를 인덱스로 사용하여 접근 31 16 15 0 4 8 : 세그먼트 주소 오프셋 : INT 0 인터럽트 핸들러 주소 INT 1 인터럽트 핸들러 주소

인터럽트 핸들러 작성 (3) DOS 시스템 콜을 이용한 인터럽트 벡터 접근 DOS 시스템 콜의 함수 35H를 이용  ES:BX (Segment Address:Offset) 반환 ; 인터럽트 벡터 테이블을 직접 접근 ; GET_INTVEC1 MACRO INTNO CLI XOR AX, AX MOV ES, AX MOV DI, INTNO SHL DI, 2 MOV BX, ES;[DI] MOV AX, ES;[DI+2] STI ENDM ; DOS 인터럽트 함수 35번 이용 ; GET_INTVEC2 MACRO INTNO CLI MOV AH, 35H MOV AL, INTNO INT 21H STI ENDM

인터럽트 핸들러 작성 (4) 인터럽트 벡터 변경 인터럽트 벡터 테이블을 직접 변경 DOS 시스템 콜 함수 25H를 사용 CLI/STI 명령을 사용하여 임계영역(Critical Area) 설정 DOS 시스템 콜 함수 25H를 사용 변경하고자 하는 인터럽트 핸들러 주소를 DS:DX (Segment Address:Offset) 에 지정 ; 인터럽트 벡터 테이블을 직접 접근 SET_INTVEC1 MACRO INTNO, SADDR, OADDR CLI XOR AX, AX MOV ES, AX MOV DI, INTNO SHL DI, 2 MOV AX, OADDR MOV ES;[DI], AX MOV AX, SADDR MOV AX, ES;[DI+2] STI ENDM ; DOS 인터럽트 함수 25번 이용 SET_INTVEC2 MACRO INTNO, SADDR, OADDR CLI MOV DX, OADDR MOV AX, SADDR MOV DS, AX MOV AH, 35H MOV AL, INTNO INT 21H STI ENDM

인터럽트 핸들러 작성 (5) 인터럽트 핸들러 작성 처리하고자 하는 인터럽트에 대한 처리 루틴을 작성 NEAR PROC을 이용하여 정의 반환 명령으로 RET이 아닌 IRET을 사용 앞에서 제시된 방법을 이용하여 인터럽트 벡터 테이블을 수정 이전의 인터럽트 벡터 테이블 내용은 보관하였다가 프로그램 종료 시에 원래 값으로 복원

인터럽트 핸들러 작성 (6) 인터럽트 핸들러 작성 예: DATA SEGMENT PARA ‘DATA’ GET_INTVEC MACRO INTNO CLI MOV AH, 35H MOV AL, INTNO INT 21H STI ENDM ; SET_INTVEC MACRO INTNO, SADDR, OADDR MOV DX, OADDR MOV AX, SADDR MOV DS, AX STACK SEGMENT STATCK DB 64 DUP(‘STACK’) STACK ENDS DATA SEGMENT PARA ‘DATA’ INT_NO EQU 0F3H ORI_CS DW 0 ORI_OF DW 0 SEGADDR DW 0 OFFADDR DW 0 DATA ENDS ; CODE SEGMENT PARA ‘CODE’ START PROC FAR ASSUME CS:CODE, DS:DATA, SS:STATCK PUSH DS MOV AX, DATA MOV DS, AX MOV ES, AX GET_INTVEC INT_NO MOV ORI_CS, ES MOV ORI_OF, BX

인터럽트 핸들러 작성 (7) 인터럽트 핸들러 작성 예: MOV AX, SEG CLEARP CLEARP PROC NEAR MOV SEGADDR, AX MOV AX, OFFSET CLEARP MOV OFFADDR, AX PUSH DS SET_INTVEC INT_NO, SEGADDR, OFFADDR POP DX INT INT_NO SET_INTVEC INT_NO, ORI_CS, ORI_OF POP DS RET START ENDP CLEARP PROC NEAR CLI PUSH DS MOV CX, 0 MOV DX, 2479H MOV BH, 7 MOV AL, 0 INT 10H POP DS STI IRET CLEARP ENDP CODE ENDS END START

어셈블리어와 상위레벨 언어의 링킹(1) 어셈블리 서브프로그램과의 링킹 세그먼트 지정 SEGMENT 디렉티브 seg-name SEGMENT [align] [combine] ['class'] 정렬(align) : BYTE, WORD, DWORD, PARA, PAGE 결합(combine) : NONE, PUBLIC, COMMON 클래스(class) : 'Stack', 'Data', 'Code’

어셈블리어와 상위레벨 언어의 링킹(2) 어셈블리 서브프로그램과의 링킹 세그먼트내에서의 호출 near CALL : NEAR 프로시저에 대한 호출(32K이내) CALL 연산은 IP를 스택에 push하고 호출 대상 프로시저 주소의 오프셋으로 설정 RET는 스택에서 pop한 값을 IP에 저장함으로써 CALL 다음의 명령으로 리턴 예: E8 2000 CALL nearproc ; Near call : push IP, ... nearproc PROC NEAR RET ;Near return: pop IP, return nearproc ENDP

어셈블리어와 상위레벨 언어의 링킹(3) 어셈블리 서브프로그램과의 링킹 세그먼트간 호출 EXTRN과 PUBLIC 속성 인자 전달 far CALL : FAR 혹은 EXTRN 프로시저에 대한 호출 CALL 연산은 CS와 IP를 push하고, 호출대상 프로시저의 세그먼트 주소 및 오프셋으로 설정 예: 9A 0002 AF04 EXTRN과 PUBLIC 속성 EXTRN 디렉티브 EXTRN name:type [, ... ] 타입:ABS, BYTE, WORD, DWORD, FAR, NEAR PUBLIC 디렉티브 PUBLIC symbol [, ... ] 인자 전달 스택 프레임 : 인자 전달 및 임시 저장 공간으로 사용

어셈블리어와 상위레벨 언어의 링킹 (4) TITLE P23MAIN5 (EXE) Call subprogram EXTRN P23SUB5:FAR ; ----------------------------------------- STACKSG SEGMENT PARA STACK 'Stack' DW 64 DUP(?) STACKSG ENDS DATASG SEGMENT PARA 'Data' QTY DW 0140H PRICE DW 2500H DATASG ENDS CODESG SEGMENT PARA PUBLIC 'Code' BEGIN PROC FAR ASSUME CS:CODESG,DS:DATASG,SS:STACKSG MOV AX,DATASG MOV DS,AX PUSH PRICE PUSH QTY CALL P23SUB5 ;Call subprogram MOV AX,4C00H ;Exit to DOS INT 21H BEGIN ENDP CODESG ENDS END BEGIN

어셈블리어와 상위레벨 언어의 링킹(5) PRICE 0025 BP+8 QTY 4001 BP+6 200F BP+4 1200 TITLE P23SUB5 Called subprogram CODESG SEGMENT PARA PUBLIC 'CODE' P23SUB5 PROC FAR ASSUME CS:CODESG PUBLIC P23SUB5 PUSH BP MOV BP, SP MOV AX, [BP+8] ;Get price MOV BX, [BP+6] ;Get quantity MUL BX ;DX:AX = product POP BP RET 4 P23SUB5 ENDP CODESG ENDS END PRICE 0025 BP+8 QTY 4001 BP+6 200F BP+4 리턴 주소 1200 BP+2 Old BP 0000 BP

어셈블리어와 상위레벨 언어의 링킹(6) 상위 레벨에서의 링킹 calling convention 상위레벨 언어가 인자를 전달하는 방식을 뜻함 인자의 PUSH 순서-스택의 정의 방법을 규정 언어 PUSH 순서 전달되는 인자 리턴 타입 BASIC 순서대로 오프셋 주소 RET # FORTRAN 순서대로 FAR 주소 RET # C 역순으로 값 RET PASCAL 순서대로 값 RET # 참조(reference) 혹은 값(value)에 의한 전달 언어 Near Reference Far Reference By Value BASIC everything - - FORTRAN - everything - C Near array Far array 기타 PASCAL VAR, CONST VAR, CONST 기타

어셈블리어와 상위레벨 언어의 링킹(7) Protected Mode Intel 80286 이상 NEAR 호출 FAR 호출 31 16 8 15 Protected Mode Intel 80286 이상 NEAR 호출 EIP(32비트)가 반환 주소로서 스택에 저장됨 FAR 호출 selector(16비트)와 EIP 값이 스택에 저장됨. EAX AX CS AH AL SS EBX BX BH BL DS ECX CX ES CH CL FS EDX DX DH DL GS EBP BP Segment Registers ESI SI 31 16 EFLAGS EDI DI FLAGS EIP ESP SP IP Status Registers General Registers

어셈블리어와 상위레벨 언어의 링킹(8) ; VOID outportb(UWORD PortNo, UBYTE Value) ; Write a value to a specified port. PUBLIC outportb outportb PROC NEAR PUSH EBP MOV EBP,ESP PUSH EAX PUSH EDX MOV DX,[EBP+8] ; Get the port. MOV AL,[EBP+12] ; Get the value. OUT DX,AL ; Output the value to the port. POP EDX POP EAX POP EBP RET outportb ENDP Value SP+12 Port SP+8 EIP SP+4 EBP SP

입력장치 - 키보드 키보드 프로그래밍 기초 BIOS의 이용 키보드 인터럽트 핸들러 키보드 컨트롤러의 제어 프로그래밍 실습 16H 함수 BIOS 변수 키 버퍼의 관리 키보드 인터럽트 핸들러 키보드 컨트롤러의 제어 프로그래밍 실습

키보드 프로그래밍 기초 (1) 키보드에서 프로그램까지 스캔 코드(scan code) 변환 Make코드와 break 코드 키가 눌리면, 키의 위치를 식별하는 전기 신호가 발생되며, 이 신호는 키보드 내부의 프로세서(i8042)에 의해 스캔 코드로 변환됨 Make코드와 break 코드 key press(“make”), key release(“break”) 모두에 대해 스캔 코드가 발생됨 break 코드에 대해서는 7번 비트가 설정됨

키보드 프로그래밍 기초 (2) 키보드에서 프로그램까지(계속) PC 키보드 ROM-BIOS 키보드 핸들러 키보드는 IRQ 1 하드웨어 인터럽트를 사용 IRQ1은 09H 인터럽트를 발생시킴 키보드 핸들러가 스캔코드를 읽어 들이고 ASCII로 변환하여 키보드 버퍼에 저장 키보드 I/O 포트 주소 : 60H 스캔 코드 / ASCII 코드 변환 256 문자로 구성되는 extended ASCII 문자 집합을 이용 응용 프로그램은 키보드 버퍼로부터 문자들을 읽어 올 수 있음 (ROM BIOS 인터럽트 16H) PC 키보드 PC/XT 와 AT 키보드 : 83 key, 84 key MF-II 키보드 : 101 key(US), 102 key(European)

BIOS의 이용 - 16H 함수 (1) 인터럽트 16H 함수들 00H 함수 : 키보드 읽기 10H 함수와 비슷 / 83-key 키보드상의 문자들만을 지원 01H 함수 : 버퍼에 키가 존재하는지 검사 11H 함수와 비슷 / 83-key 키보드상의 문자들만을 지원 02H 함수 : 현재의 <Shift> 상태를 AL에 리턴

BIOS의 이용 - 16H 함수 (2) 인터럽트 16H 함수들 (계속) 10H 함수 : 키보드 읽기 키보드 버퍼로부터 문자를 읽어서 AL(ASCII)과 AH(스캔코드)에 반환 버퍼가 비어 있는 경우, 키가 입력될 때까지 기다림 11H 함수 : 버퍼에 키가 존재하는지 검사 버퍼에 키가 존재하면 zero flag를 클리어하고, 키값을 AL/AH에 반환 버퍼에 키가 존재하지 않으면 zero flag를 설정하고, 바로 반환

BIOS의 이용 - 16H 함수 (3) 인터럽트 16H 함수들 (계속) 12H 함수 : 현재의 <Shift> 상태를 반환 키보드 shift 상태를 AL과 AH에 반환 / AL은 02H와 동일 AH에는 확장 shift 상태값 반환

BIOS의 이용 - BIOS 변수 BIOS 키보드 인터럽트 변수들 BIOS는 키보드 인터럽트 핸들러(09H)와 키보드 함수(16H)를 위해 8개의 변수를 관리

BIOS의 이용 - 키 버퍼의 관리

키보드 인터럽트 핸들러 키보드 인터럽트 핸들러 09H 인터럽트에 대한 핸들러 루틴 역할 <Shift> 처리 <Caps lock>, <Scroll lock>, <Num lock> 처리 및 LED on/off <Print Screen> 처리 : 05H 인터럽트 발생 모니터 프로그램에서는 IRQ1이 21H 인터럽트로 재배치되어 있음

키보드 컨트롤러의 제어 (1) 키보드 컨트롤러의 제어 키보드 컨트롤러로는 i8048(XT), i8042(AT, 386, 486) 프로세서가 사용됨 키보드 컨트롤러는 상태 레지스터, 입력 버퍼, 출력 버퍼로 구성 입출력 버퍼는 60H 번지로 접근 입력버퍼로는 64H 번지도 사용될 수 있음

키보드 컨트롤러의 제어 (2) 키보드 컨트롤러의 제어 (계속) 상태 레지스터 (64H)

키보드 컨트롤러의 제어 (3) 키보드 컨트롤러의 제어 (계속) 키보드에 바이트 데이터를 보내는 절차

키보드 컨트롤러의 제어 (4) 키보드 컨트롤러의 제어 (계속) LED 제어 0EDH 명령 코드 LED 상태 바이트 자료 및 예제 참조

프로그래밍 실습 (1) 키보드 인터럽트 핸들러의 구현 키보드 인터럽트 21H에 대한 핸들러의 구현 Shift키에 따른 대소문자 처리 Caps Lock, Scroll Lock, Num Lock LED 처리 입력된 키값은 키보드 버퍼에 저장 키보드 버퍼는 링버퍼, head 및 tail 포인터로 구성 main 함수는 loop를 돌며 키보드 버퍼에 새로운 키가 입력되었는지를 검사 만약 새로운 키가 있다면 이를 읽어서 화면에 출력

프로그래밍 실습 (2) 키보드 인터럽트 핸들러의 구현 (계속) 주의 사항 핸들러 및 main loop 에서 포인터를 조작하거나 검사할 때는 반드시 critical section으로 보호할 것 Critical section은 sti와 cli명령을 이용하여 구현가능