Please Enable JavaScript!
Gon[ Enable JavaScript ]

인터럽트와 레지스터

C# & MFC

인터럽트와 레지스터 


* int86 함수는 80x86 CPU에서 인터럽트를 발생시키는 가장 기본적인 C 함수이다.

  #include <dos.h>
  int int86(int intno, union REGS *inregs, union REGS *outregs);

  * 입력값 : intno   - 인터럽트 번호
             inregs  - 인터럽트 걸기전의 레지스터 값
  * 출력값 : outregs - 인터럽트 후의 레지스터 값
  * 리턴값 : AX 레지스터의 값을 리턴

int 86은 인터럽트가 성공하면 AX의 레지스터 값이 리턴되고, 성공하지 못하면 outregs->x.cflag 가 1로 셋팅된다.
인터럽트 후 현재의 레지스터 값들은 outregs에 복사되며, 플래그들은 outregs의 cflag에 복사된다.

intdos(union REGS *inregs, union REGS *outregs); 라는 함수는 int86의 인터럽트 번호를 DOS 인터럽트인 21h로
고정시킨 함수이다. 즉, 다음과 같은 동작을 한다.

int int86(0x21, union REGS *inregs, union REGS *outregs);

****** 레지스터(Register) *******

- 레지스터는 CPU의 산술 연산과 논리 연산의 수행을 도와주는 역할을 담당하는 임시 기억장소이다.
레지스터는 CPU가 처리할 데이터와 메모리를 제어하는데 필요한 정보를 가지게 되며, 연산에 따른 컴퓨터의
상태에 대한 정보도 포함하고 있다.
위의 정보들은 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터에 각각 담기게 된다.

- 범용 레지스터 -

범용 레지스터는 주로 연산에 사용되는 레지스터 (AX, BX, CX, DX)와 번지계산에 사용하는 레지스터
(SP, BP, SI, DI, IP)로 나뉜다. 각 레지스터의 크기는 16비트이고, AX, BX, CX, DX의 경우는
다시 8비트 크기의 AH, AL, BH, BL, CH, CL, DH, DL로 각각 나누어 사용할 수 있다.
이는 각 레지스터의 상위 8비트와 하위 8비트를 나타내게 된다.

- 세그먼트 레지스터 -

세그먼트 레지스터는 CPU가 메모리에 있는 데이터를 찾는 일을 도와주는 역할을 한다.
세그먼트 레지스터에는 CS, DS, SS, ES의 4가지가 있으며, 프로그램이 위치한 메모리의 세그먼트 주소를 가리키는
역할을 한다.

- 플래그 레지스터 -

플래그 레지스터는 CPU가 연산을 행한 후의 상태가 담겨지는 레지스터로써 다른 레지스터와는 다르게 16비트의 비트
하나하나가 의미를 가지고 있다. 이 플래그들은 서로 독립적으로 작동하지만 편의상 하나의 레지스터로써 묶여 있다.
플래그 레지스터의 구조는 다음과 같다.

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0


NT



OF

DF

IF

TF

SF

ZF


AF


PF


CF

이 플래그들 중에서 특히 기억해 두어야 할 것은 CF플래그이다. 도스나 롬바이오스의 루틴을 사용하였을 때 에러가
발생하면 CF를 1로 셋팅하기 때문에 프로그램에서 CF값을 조사하여 에러가 발생하였음을 판단할 수 있다.

C 프로그래밍에서 인터럽트를 걸 때 레지스터로 사용되는 구조체의 내부를 알아보자.
이 구조체의 각 변수들은 각 레지스터와 일대일로 대응하게 된다. 그래서 이 구조체는 인터럽트 발생시 함수 번호를
알려주거나, 인터럽트 후 결과를 받아보는데 사용될 수 있다. 이 구조체가 정의되어 있는 곳은 dos.h 이다.


union REGS {
   struct WORDREGS x;
   struct BYTEREGS h;
};

struct WORDREGS {
   unsigned int ax;	/* AX 레지스터 */
   unsigned int bx;	/* BX 레지스터 */
   unsigned int cx;	/* CX 레지스터 */
   unsigned int dx;	/* DX 레지스터 */
   unsigned int si;	/* SI 레지스터 */
   unsigned int di;	/* DI 레지스터 */
   unsigned int cflag;  /* 플래그 레지스터 */
   unsigned int flags;   
};

struct BYTEREGS {
   unsigned char al;	/* AL 레지스터 */
   unsigned char ah;	/* AH 레지스터 */
   unsigned char bl;	/* BL 레지스터 */
   unsigned char bh;	/* BH 레지스터 */
   unsigned char cl;	/* CL 레지스터 */
   unsigned char ch;	/* CH 레지스터 */
   unsigned char dl;	/* DL 레지스터 */
   unsigned char dh;	/* DH 레지스터 */
};

struct SREGS {
   unsigned int es;	/* ES 레지스터 */
   unsigned int cs;	/* CS 레지스터 */
   unsigned int ss;	/* SS 레지스터 */
   unsigned int ds;	/* DS 레지스터 */
};
Posted by 녹두장군

댓글을 달아 주세요

  1. ja4749 2010.03.09 08:35  댓글주소  수정/삭제  댓글쓰기

    안녕하세요?