알고리즘1)객체지향 프로그래밍의 개념기본적인 개념은 캡슐화. 상속성. 다형성이다.1캡슐화(Encapsulation)정보은닉(information hiding)이라고도 알려져 있는데, 사용자에게 객체의 실제적인 구현방법을 보 여주지 않고 그 객체에 속한 메소드들의 사용법만을 제공해주는 것을 말한다. 사용자는 내부 구현 에 대해 알 필요가 없으므로 객체를 쉽게 사용할 수 있으며 필요에 따라 구현을 변경시킬 수도 있다. 캡슐화를 하면 하나의 객체에 대한 구현 방법을 변경시켜도 그 객체 이외의 부분들은 영향 을 받지 않게 된다. 객체지향 방법에서는 클래스를 통해 캡슐화를 지원하고 있다.2상속성(Inheritance)새로운 클래스가 정의될 때, 새로 정의되는 메소드와 필드뿐 만 아니라 이미 만들어진 클래스들의 필드와 메소드들도 포함시킬 수 있는 방법을 말한다. 그러므로 새로 확장된 클래스는 원 클래스에 서 정의된 필드와 메소드들을 그대로 사용할 수가 있게된다. 즉, 상속성은 소프트웨어를 재사용할 수 있도록 해준다. 이때 재사용된 원 클래스를 수퍼 클래스라 하고 새로 확장된 클래스를 서브 클 래스라 한다. 수퍼 클래스로부터 상속받은 필드나 메소드들은 다시 코딩할 필요가 없으므로 소프트 웨어의 생산 기간을 단축시키고 비용을 절감할 수 있다. 또한 이미 정확성이 증명된 클래스를 재사 용함으로써 전체 시스템의 신뢰성을 확보할 수 있다.3다형성(Polymorphsim)서로 다른 클래스의 메소드들을 같은 방법으로 취급하는 것을 말한다. 다형성을 실행하기 위해서 는 그 클래스들이 같은 수퍼 클래스로부터 확장된 것이어야 한다. 수퍼 클래스 객체에 의해서 수 행되는 메소드는 서브 클래스 객체에 의해서도 수행될 수 있고, 수퍼 클래스 객체를 참조하도록 선언된 참조 변수는 그의 서브 클래스 객체에서도 참조할 수 있다.2)추상 데이터 타입의 개념1어떻게 데이터를 표현하는가보다 무엇을 할 수 있는 데이터 타입인가가 더 중요하다.2자세한 구현은 생각하지 않고 표면적인 기능만을 생각한다.3문자를 저장한 배열에서 사용하는 추상 데이터 타입의 연산이다.추상 데이터 타입을 정의하고 있는 클래스는 데이터를 저장하는 필드와 메소드, 그 메소드의 사용 방법을 기술한다. 그러나 메소드에 대한 구체적인 정의는 없다. 사용자에게 어떤 특정한 일을 하기 위해서는 어떤 메소드를 사용해야 하는지를 알려줄 뿐이다. 메소드의 호출 방법이나 반환값도 클래 스의 정의로부터 알 수 있지만 메소드의 실제 구현 내용은 알 수 없다. 메소드가 무엇을 하는지는 알 수 있지만 어떻게 실행하는지 사용자는 알 수 없는 것이다.3)Java의 특성Java는 객체지향 프로그래밍 언어이므로 Java를 이용하여 프로그램을 작성할 때는 객체지향 프 로그래밍의 개념을 사용할 수 있다. Java의 가장 큰 장점은 이식성(Portability)이다.Java프로그램을 실행하면 컴파일러가 코드를 변환하여 바이트 코드 파일로 저장하며 이렇게 하면 어떠한 컴퓨터 기종이나 운영체제에서도 Java코드를 실행할 수 있게 된다.4)알고리즘을 표현하는 방법1자연언어 - 기술은 용이하나, 모호성으로 코딩에 어려움 (문제 해결의 단계를 나타낼 수 있음)2순서도 등 그래픽 도구 같이 도표 이용3의사코드(pseudo code) - 실제 프로그래밍 언어와 유사해 가장 일반적으로 사용되는 방법5)최대값을 구하는 알고리즘과 분석10개의 정수를 저장한 집합에서 최대값 찾기1집합의 첫 번째 정수를 max라고 한다.2집합의 다음 정수를 max와 비교한다. 만일 이 정수가 max보다 크면, 이 정수를 max로 놓는다.3집합의 나머지 정수들에게도 단계2를 되풀이 한다.4더 이상의 정수가 없을 때에는 stop한다. 이때에 max는 10개의 정수 중에서 최대 값을 가지고 있다.6)알고리즘 개발시 생각해야 할 사항들1명확성(Definiteness) : 알고리즘의 각 단계가 무엇을 하기 위한 것인지 명확하게 정의되어야 한다.2효율성(Effectiveness) : 알고리즘을 구성하는 각 명령어들은 컴퓨터 하드웨어에서 수행 가능한 것 들이어야 한다.3종료성(Termination) : 알고리즘은 유한 번의 연산 후에 반드시 종료해야 한다.7)알고리즘 분석 기준1정확성(Correctness) : 먼저 알고리즘에서 수행될 입렵 데이터와 알고리즘 수행 후 기대되는 출 력에 대해 정확하게 이해하고 있어야 한다. 다음 단계에서는 주어진 입력으로부터 원하는 출력을 얻을 수 있는 방법을 수학적으로 기술하고 프로그램화하여 실행시킨다.복잡한 알고리즘의 경우는 전체 알고리즘을 작은 단위로 나누어서 각각의 작은 단위의 프로그램 이 올바르게 수행되는 것을 증명할 수 있다면 전체 프로그램이 정확하다는 것을 증명하게 되는 것이다. 또한 수학적 귀납법을 사용하기도 한다.2작업량(Amount of work done) : 작업량 계산은 그 알고리즘이 수행되는데 걸리는 시간을 측정 하는 것이 가장 쉽게 생각할 수 있는 것일 것이다. 알고리즘이 수행하는 작업량을 분석하기 위해 서는 컴퓨터의 종류나 프로그래밍 언어, 프로그래머의 스타일로부터 독립된 방법이 필요하다. 일 반적으로 가장 많이 사용되는 방법으로는 어느 알고리즘에나 포함될 수 있는 기본적인 연산 (read, write등)을 제외한 주어진 문제를 해결하기 위한 그 알고리즘에서 가장 중요한 연산들만 으로 작업량을 측정하는 방법을 사용하고 있다.{문제주요연산이름이 저장되어 있는 목록에서 특정한 이름 x를 찾는 문제목록의 각 이름들과 x를 비교하는 연산실수로 된 두 개의 행렬을 곱하는 문제두 실수를 곱하는 연산(또는 실수의 곱셈과 덧셈)숫자들을 순서에 맞게 정렬하는 문제구 개의 숫자를 비교하는 연산3기억장소 사용량(Amount of space used)프로그램이 실행될 때는 명령어, 변수, 상수 또는 입력 데이터를 저장하기 위한 공간이 필요하게 된다. 또 프로그램이 수행되는 동안 데이터를 변경하고 정보를 저장하는데도 공간이 필요하다.입력 데이터의 형태에 따라서 필요한 공간의 양이 달라지기도 한다.4단순성(Simplicity) : 알고리즘을 간단하게 디자인하는 것은 중요하다. 알고리즘이 단순하면 알고 리즘의 정확성을 증명하기 쉽고 프로그램의 작성 및 디버깅 또는 수정 등이 쉬어지기 때문이다.5최적성(Optimality) : 여기에서 최적은 가장 좋은이란 의미이다. 알려진 모든 알고리즘들뿐만아니라 아직 발견되지 않은 알고리즘들까지 포함하여 그 중에서 최적의 알고리즘을 말한다.8)최적 알고리즘이란??어떤 문제를 해결하는데 필요한 최소 작업량(Lower Bound)을 알 수 있다면 그 최소 작업량과 같 은 만큼의 작업량을 가진 알고리즘이 최적 알고리즘이 된다.같은 문제를 해결하는 모든 알고리즘 중에서 그 알고리즘보다 더 적은 숫자의 주요연산을 수행하 는 알고리즘이 없을 경우 이것이 최적 알고리즘이다.9)최적 알고리즘을 찾는 단계1주어진 문제에 대해 효율적이라고 생각되는 알고리즘을 고안한다. 그 알고리즘이 최악의 경우에 필요한 작업량 W(n)을 구한다. 여기서 n은 입력 데이터의 크기를 나타낸다.2함수 F에 대하여, 주어진 문제를 해결할 수 있는 어떤 종류의 알고리즘도 최소한 F(n)만큼의 작 업량이 꼭 필요하다는 것을 증명한다.3어떤 알고리즘이 W(n)=F(n)를 만족한다면 그 알고리즘은 그 문제를 해결하는 최적 알고리즘이위의 단계에서 1의 값은 어떤 문제를 해결하는데 필요한 상한선(upper bound)이 되고2의 값은 최악의 경우에 필요한 하한(lower bound)을 제시한다. 최악의 경우의 하한값은 알고리즘의 복잡도를 계산하는데 중요한 역할을 한다. 알고리즘의 하한값은 입력 데이터의 크기가 n일 때, 주어진 문제를 해결하는 어떤 알고리즘도 최소한 F(n)만큼의 기본 연산을 수행해야 한다는 뜻이다.ex) 문제 : n개의 정수 중에서 가장 큰 수 찾기주요연산 : 두 정수의 비교max = L[0];for (index=1; index
*Socket*소켓은 연결 기반(connection-based: 예를 들면, 전송자와 수신자의 소켓 주소는 그들 사이에서 메시지가 전달되기 전에 미리 확정된다)이거나비연결기반(connectionless-based: 송신자와 수신자의 주소는 반드시 한 프로세스에서 다른 프로세스로 보내지는 각 메시지와 함께 전달된다)적일 수 있다. 이들은 소켓에 배정된 도메인(domain)에 의존하는 서로 다른 소켓주소 형태들이다. 도메인은 소켓의 주소형식과 사용될 트랜스포트 프로토콜에 따라 정의된다.소켓에 배정되는 일반적인 도메인들은 AF_UNIX(주소형식은 UNIX의 경로이름이다)와 AF_INET(주소형식은호스트 이름과 포트 번호)가 배정된다.각각의 소켓들은 유형(type)이 배정되며, 이는 두 개의 소켓사이에 데이터가 전송되는 방법을 결정한다. 만일 소켓들의 유형이 가상회선(virtual circuit)이면, 데이터들은 신뢰할 수 있는 방식으로 차례대로 전송되고 복사되지 않는다. 만일 소켓유형이 데이터그램(datagram)이면,데이터들은 순서없이 신뢰할 수 없는 방식으로 전송된다.연결기반(connection-based) 소켓 유형은 일반적으로 가상회선이며,반면에 비연결형(connedtionless) 소켓 유형은 보데이터그램(datagram)이다. 데이터그램 소켓은 일반적으로 가상회선 소켓들보다 빠르고 신뢰성보다 속도가 더 중요한 응용들에서 사용된다. 각각의 소켓 유형은 하나 이상의 트랜스포트 프로토콜을 제공하지만, UNIX 시스템에서는 각 소켓 유형에 대하여 항상 디폴트 프로토콜이 지정된다. 가상 회선의 디폴트 프로토콜은 TCP이고 데이터그램의 디폴트 프로토콜은 UDP이다.상호간에 통신하기 위하여 사용되는 소켓은 반드시 같은 유형이고 같은 도메인에 속해야 한다. 또한 연결기반 소켓은 클라이언트/서버 방식으로 통신한다. 즉, 서버 소켓은 잘알려진 주소이고 도착할 클라이언트의 메시지를 끊임없이 청취(listening)한다. 클라이언트 프로세스는 알려진 서버의 소켓 주소로 메시지데, 연결형(스트림) 서비스를 제공하는 소켓을 만들려면 SOCK_STREAM을, 비연결형(데이터그램) 서비스를 선택하려면 SOCK_ DGRAM을 선택하여야 한다.type : SOCK_STREAM (스트림 방식의 소켓 생성)SOCK_DGRAM (데이터그램 방식의 소켓 생성)▶ protocol은 소켓을 지원하는 프로토콜을 지정하는데 일반적으로 0을 쓰면 시스템이 자동으로 설정해 준다.▶ 다음은 socket() 시스템 콜을 호출하고 생성된 소켓번호를 출력하는 예제 open_socket.c이다.▶ 이 프로그램에서는 먼저 /etc/passwd 파일을 열고 리턴된 파일기술자(file descriptor)를 출력한 후, 소켓을 두 개 열어서 소켓번호가 어떤 값인지 확인한다.▶ 끝으로 또 다른 파일(/etc/hosts)을 열어서 파일기술자를 출력한다./*-----------------------------------------------------------------------------------------------파일명 : open_socket.c기 능 : socket() 시스템 콜을 호출하고, 생성된 소켓번호를 출력컴파일 : cc -o open_socket open_socket.c -lsocket실행예 : open_socket--------------------------------------------------------------------------------------------- */#include /* 표준 입출력 함수 */#include /* 소켓 시스템 콜에 필요한 상수 선언 */#include /* 파일의 상태에 대한 데이터 선언 */#include /* 파일 제어 함수 선언 */#include /* 소켓 시스템콜 선언 */int main() {/* 파일 및 소켓번호 */int fd1, fd2, sd1, sd2 ;/* 파일 열기 */fd1 = open("/etc/passwd", O_RDONLY, 0) ;printf("/etc/passwd's호스트 바이트 순서는 네트웍 바이트 순서와 다르다. 따라서 80x86계열의 컴퓨터에서 네트웍을 통하여 전송한 데이터를 68000계열의 컴퓨터가 수신하면 바이트 순서가 바뀌게 된다.▶ 이러한 문제를 해결하기 위하여 컴퓨터 내부에서 만들어진 호스트 바이트 순서의 데이터를 네트웍으로 전송하기 전에 htons() 함수를 사용하여 모두 네트웍 바이트 순서로 바꾸어야 한다.▶ 반대로 네트웍에서 수신한 데이터는 ntohs() 함수를 사용하여 자신에게 맞는 호스트 바이트 순서로 항상 바꾸어야 한다.▶ 즉, 네트웍 바이트 순서를 지켜 데이터를 전송함으로써 수신한 데이터가 어떤 종류의 컴퓨터에서 만들어진 것인지 알 필요가 없도록 하는 것이다.▶ 위에서 MC68000 계열의 CPU에서는 호스트 바이트 순서와 네트웍 바이트 순서가 같은 것을 알 수 있는데 이러한 호스트에서의 htons()와 ntohs() 함수는 아무 일도 하지 않게 된다.▶ 바이트 순서를 바꾸는 함수에는 변환할 바이트 길이에 따라 다음과 같이 두 가지 종류가 있다.Unsigned short interger 변환 (2바이트 체계)htons() : host-to-network 바이트 변환ntohs() : network-to-host 바이트 변환Unsigned long interger 변환 (4바이트 체계)htonl() : host-to-network 바이트 변환ntohl() : network-to-host 바이트 변환2.2.2 바이트 순서 예제 프로그램▶ 여기서는 현재 사용중인 컴퓨터의 호스트 바이트 순서가 네트웍 바이트 순서와 같은지를 알아보는 테스트 프로그램 byte_order.c를 소개한다.▶ byte_order.c에서는 먼저 udp를 사용하는 echo 서비스의 포트번호를 알아내기 위하여 getservbyname() 시스템 콜을 다음과 같이 호출한다.pmyservent = getservbyname("echo", "udp");▶ getservbyname()은 well-known 포트를 사용하는 TCP/IP 응용 프3vcn.kangwon.ac.kr's dotted decimal IP address : 203.252.65.3203.252.65.3's binary ip address (hexa) : cbfc4103203.252.65.3's hostname : vcn.kangwon.ac.kr#▶ addr_conv.c 받기2.2.5 기타 주소 관련 함수▶ 앞에서 소개한 주소변환 함수 이외에도 BSD 소켓은 getXbyY() 형태의 호스트 정보 검색 함수들을 제공하고 있다.▶ 이들의 자세한 사용은 부록 A를 참조하기 바라고 여기서는 다음의 두 가지 함수만 소개한다.(1) gethostname()▶현재 사용중인 컴퓨터의 도메인 네임, 예를들어 'cc.kangwon. ac.kr'과 같은 이름을 알기 위하여 gethostname()을 사용한다.▶ 아래의 예에서 문자열 변수 hname에 현재 사용중인 호스트의 도메인 네임이 저장된다.#define HOST_NAME_LEN 50 /* 호스트 이름의 최대 길이 */char hname[HOST_NAME_LEN + 1];/* 호스트 이름을 저장할 버퍼 */gethostname(hname, HOST_NAME_LEN);(2) sethostname()▶ 사용중인 호스트의 도메인 네임을 새로운 값으로 지정할 때 사용하는데 아래의 예에서는 호스트의 이름을 new. kangwon.ac.kr로 바꾼다.sethostname("new.kangwon.ac.kr", strlen("new.kangwon.ac.kr"));2.3 클라이언트 프로그램 작성 절차▶ 본 절에서는 클라이언트 프로그램의 일반적인 작성 절차를 설명하고, well-known 서비스 포트를 이용하는 클라이언트 프로그램 mydaytime.c와 myecho.c를 소개한다.2.3.1 연결형 클라이언트 프로그램 작성 절차▶ TCP(연결형 또는 스트림형) 클라이언트 프로그램의 일반적인 작성 절차를 그림 2-7에 나타냈다.▶ 2.1.5절에서 소개한 바와 같이 클라이언트는 먼저 socket()으로 소켓을 개설한다기록하는 것을 아래에 보였다.▶ 아래에서 inet_addr() 함수는 사용자가 명령 인자로 입력한 dotted decimal 형태의 IP 주소 문자열 haddr을 (binary) IP 주소로 변환하는 함수이다(2.2.3절 참조).▶ 한편 표준 인터넷 서비스인 daytime 서비스를 받기 위해서는 well_known 포트번호로 13번을 지정하여야 한다.struct sockaddr_in server_addr; /* 서버의 소켓주소 구조체 */haddr = argv[1];server_addr.sin_family = AF_INET; /* 주소 체계 선택 */server_addr.sin_addr.s_addr = inet_addr(haddr); /* 32비트의 IP 주소로 변환 */server_addr.sin_port = htonl(13); /* daytime 서비스 포트번호 */▶ 이상과 같이 서버의 주소 정보를 모두 server_addr 구조체에 기록한 후 서버에 연결을 요청하기 위해 connect() 함수를 다음과 같이 호출하는데 연결요청이 수락된 경우에는 0이 리턴되며, 그렇지 않은 경우에는 -1이 리턴된다.connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr));▶서버와 연결된 후, 서버가 보내오는 문자열(날짜와 시간)을 수신하기 위해 클라이언트는 read()를 아래와 같이 호출한다.n = read(s, buf, BUF_LEN);▶ mydaytime.c 전체 리스트2.3.4 echo 클라이언트 프로그램▶ 클라이언트 프로그래밍의 두번째 예로 echo 서비스를 시험하는 클라이언트 프로그램 myecho.c를 소개한다.▶ 표준 인터넷 서비스인 echo는 well-known 포트 7번을 통해 유닉스 컴퓨터가 제공하는 서비스로 클라이언트가 전송한 문자열을 다시 클라이언트로 전송한다.▶ 다음은 myecho.c를 실행한 결과 예이다.# myecho 203.252.65.3Input any string : Unix socn1))
범용 레지스터AX.BX.CX.DX.SP.SI 등이 있으며 가장 많이 사용되는 것은 A.B.C.DX이다.16비트이며 하위 8비트와 상위 8비트를 쪼개서 사용할 수 있다.AX레지스터를 그대로 AX의 형태로 쓸 수 있지만 AH(Hight). AL(Low)상.하 8비트로 나누어 사용할 수 있다.386 이상급의 32비트 프로세서에는 A,B,C,D 의 확장레지스터인 EAX, EBX, ECX ,EDX 가 있다. AX+AX=EAX 가 된다. 당연히 ExX 레지스터는 32비트가 되며 AH,AL 같은 식으로 나누어 사용할수는 없다.어큐뮬레이터(Accumulator)AX레지스터로 산술 논리연산의 중심이 되며. 입출력 명령에 주로 사용된다.다른 레지스터보다 내부적인 명령바이트수가 짧게되어 실행시간이 짧아지는 장점이 있다.베이스 레지스터(Base register)BX레지스터로 산술 및 논리 연산에 사용되기도 하지만 주요 기능은 간접 번지 지정등에서 어드레스값을 가르킬 때 사용된다.카운터 레지스터(Count register)CX레지스터로 루프명령. 스트링 명령 등에서 루프수의 카운터로 동작한다.또한 시프트/로테이트 명령에서도 카운터로 동작한다.루프가 없는 문장일 경우 그냥 사용해도 된다.데이터 레지스터(Data register)DX레지스터로 가접번지 지정에 의한 입출력 명령시 I/O 장치의 포트 번지를 지정하는데 사용되고 곱셈.나눗셈 등에서 AX레지스터의 보조로써 사용된다.베이스 포인터(Base pointer)스택 세그먼트(SS)에 있는 데이터를 엑세스 할 때 사용된다.다른 영역의(세그먼트가 다른) 데이터를 간접번지 지정으로 엑세스 할 때 사용된다.인스트럭션 포인터(Instruction pointer)이 레지스터는 다음 실행할 명령이 있는 어드레스를 가르키고있다.CS 레지스터(Code segment register)를 참조하여 물리적인 메모리 어드레스가 만들어진다.(당연히 1바이트의 명령이 실행되면 IP 역시 자동으로 1 바이트만큼 더해져서 그다음 명령을 실행하게 해준다.)CALL 이나 INT 등의 브렌치 명령(잠시 다른 명령행으로 다녀오게 만드는것)이 실행되면 IP는 복귀 번지를 스택 영역에 보낸 후 브렌치 명령이 끝날때 보낸 값을 다시 돌려 받아 그곳으로이동한다. 물론 그때 당시의 어드레스값이 아닌 그 다음 어드레스 값이 스택에 들어가는 것이다.스택 포인터(Stack pointer)스택을 조작하는데 사용된다.데스티네이션 인덱스(Destination index)SI 와 같다고 생각하면 된다. 단지 SI 는 소스측을 가르키지만 DI 는 타겟 측을 가르킨다고 생각하면 된다.(DI 는 ES 와 쌍을 이룬다)소스 인덱스(Source index)간접 번지 지정에 사용되며 특히 스트링 명령에서 데이타 전송이나 연속적인 비교를 할때 소스특의 어드레스 포인터로 사용된다.(참고: 이럴때 DS 를 참조하여 20 비트의 물리번지를 생성할수 있다..)세그면트 레지스터일단 세그먼트를 간단히 설명 하자면 메모리를 표시할때 XXXX:YYYY 라고 하는 것이 있는데 여기서 XXXX 가 세그먼트 YYYY 가 오프 이라 부른다.8086 CPU 설계 당시의 메모리 주소값 구조.메모리 관리를 세그먼트 단위로 하기 때문에 구조상 64K 이상의 메모리를 사용할수 없게 된다. 그래서 세그먼트레지스터란 것이 생겨났다.간단히 말하면 원래 16 비트로써 64K 밖에 메모리 엑세스가 불가능 했지만 16 비트의 레지스터 두개를 조합하여 20 비트의 메모리 엑세스(1M)를 가능하게 한 것이다.그렇게 하려고 세그먼트 레지스터를 만들었다.(XXXX = 세그먼트 16비트, YYYY = 오프 16 비트. 그런데 왜 20 비트인가??이 주소는 논리적인 주소이다. 실제 물리적 주소는 이것을 가지고 재 계산해서 나오게된다.그 물리적 값이 20 비트의 값이다.)데이터 세그먼트 레지스터(Data segment register)프로그램이 사용할 데이타가 저장된 세그먼트 시작번지를 가르킨다.메모리 직접 번지 지정및 간접번지 지정시 오프 과 합쳐져 물리적 번지를 만들어 낸다.스트링 명령에선 SI 와 조합되어 소스특의 시작위치를 가르킨다.엑스트라 세그먼트 레지스터(Extra segment register)주로 스트링 명령을 사용할때 추가로 사용되는 데이타 영역의 시작번지를 가르킨다.보조 영역의 64K를 지정하거나 스트링 명령에서 DI와 조합해서 타겟측의 물리번지를 지정한다.스택 세그먼트 레지스터(Stack segment register)스택 조작에서 데이타를 처리하는 데이타 영역의 시작번지를 가르킨다.SP 와 합해서 스택 메모리의 물리번지를 생성한다.BP 를 사용하는 간접 번지 지정에서 오프셋과 합쳐져 물리번지를 생성한다.코드 세그먼트 레지스터(Code segment register)프로그램 명령 코드가 저장되어있는 세그먼트의 시작위치를 가르킨다.이것은 프로그램 영역 64K 의 공간을 지정한다는 말이다. IP 와 조합되어 실행할 멸령의 번지를 만든다.플래그스 레지스터(Flags register)8086 에서는 연산결과및 시스템 제어를 위한 정보가 16비트의 플래그 레지스터로