Intel 8086/8088

Posted 2007/04/20 21:27, Filed under: 프로그래밍/Assembly
1. Intel 8086/8088의 기본적인 구조

  Intel 8086/8088은 실행장치(EU:Execution Unit)와 버스 인터페이스 장치(BIU:Bus Interface Unit) 두 개의 장치를 가지고 있다. 버스 인터페이스 장치는 명령어, 오퍼랜드, 데이터들을 메모리로부터 인출(fetch)하는 일을 맡고 있고, 실행장치메모리로부터 인출된 명령어를 해독하고 실행하는 곳이다. Intel 8086/8088은 메모리 내에 FIFO(First In First Out)구조를 갖는 큐(queue)를 포함하고 있기 때문에 버스를 최대의 효율로 이용할 수 있다.
  Intel 8086은 6바이트(2바이트 크기 3개)크기의 큐를 가지고 있고, Intel 8088은 4바이트 크기의 큐를 가지고 있다. 그러므로 Intel 8086의 큐는 3개의 16비트 크기를 저장할 수 있지만 Intel 8088은 2개의 16비트 크기만 저장할 수 있다.
  이들 큐(queue)는 Intel 8086/8088에서 실행 장치가 동작하고 있는 동안 다음 명령어를 메모리로 부터 큐로 인출해 저장함으로서 메모리를 보다 효율적으로 사용할 수 있게 된다.

2. Intel 8086/8088의 메모리

  Intel 8086/8088의 최대 주소 공간은 00000H 번지에서 FFFFFH 번지까지 1MB의 공간을 가지며 하나의 메모리 공간은 8비트 크기이다.
  이들 프로세서 역시 대부분의 컴퓨터와 마찬가지로 메모리는 한 바이트 마다 하나의 주소가 부여되는 바이트 단위 주소가 붙어 있다. 따라서 만일 00100H의 주소를 시작으로 11H와 01H인 두 개의 데이터는 00100번지에 이 워드(2바이트)의 첫 번째 데이터인 11H가 00101H번지에는 01H의 데이터들이 각기 저장되어진다.
한 바이트당 하나의 주소, 최대 가능한 메모리 공간 : 00000H ~ FFFFFH 까지 1MB

3. Programming 모델

  IA-32 어셈블리 언어를 이용한 프로그램은 Intel 8086/8088과 같은 프로세서 내의 레지스터들의 종류와 사용용도를 알아야만 프로그램이 가능하므로 Intel 8086/8088 레지스터들의 사용 용도와 메모리 내에 있는 해당 세그먼트 주소를 알 수 있는 세그먼트 레지스터(segment register)와 오프셋(offset)에 대해 알아 본다.

범용 레지스터(General purpose register)
데이터들의 연산 및 전송, 번지 지정을 위한 포인터(pointer) 및 인덱스(index) 용도로 사용된다.

1. AX(Accumulator) : 누산기라고도 불리는 이 레지스터의 역할은 데이터 전송 및 연산 후의 결과 값을 잠시 저장한다. AX레지스터를 사용하면 다른 레지서트를 사용한 경우보다 명령어의 바이트 수가 짧게 되거나 실행 시간이 짧게되는 점이 있다. 또한 곱셈이나 나눗셈 등과 같은 연산에서는 반드시 AX나 AL레지스터를 사용해야 하는 경우도 있다.
2. BX(Base Register) : 메모리에 저장되어 있는 데이터의 주소를 저장한다든지, 전송 및 연산에 사용된다.
3. CX(Count Register) : 반복문이나 문자 스트링 등과 같은 명령어를 수행할 때 반복 횟수 등을 저장하는 카운터로 사용되기도 하고 또한 전송 및 연산에 사용된다.
4. DX(Data Register) : AX 레지스터와 함께 곱셈이나 나눗셈 등 일부 명령에서는 필수적으로 사용되기도 하고 또한 기타 연산 및 전송에 사용된다.

포인터와 인덱스 레지스터
포인터(SP와 BP)와 인덱스 레지스터(SI와 DI)들은 비록 범용 레지스터 범주에 속하지만 이들은 아래와 같이 주로 데이터가 저장되어 있는 메모리 주소를 가리키는 포인터로 사용된다.

1. SP(Stack Pointer) : 스택 내에서 가장 최근에 저장된 데이터의 주소(TOP)을 가리킨다.
2. BP(Base Pointer) : SP 대신 스택 내에서 데이터를 액세스 할 때 사용한다. 뿐만 아니라 다른 영역의 데이터를 간접적으로 지정하거나 전송 및 연산에도 사용 가능하다. 그리고 스택 상에서 프로시저를 처리할 때 SP 대신 BP를 이용하여 프로시저 인수들을 액세스하여 처리하면 보다 효과적으로 프로시저를 관리할 수 있다.
3. SI(Source Index) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 메모리로부터 데이터를 전송하기 위한 출발지 주소 지정에 사용된다. 이때 DS 세그먼트를 참조하여 20비트의 물리 주소를 생성한다(DI : SI). 그리고 일반적인 전송이나 연산에도 사용된다.
4. DI(Destination Index) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 레지스터나 메모리로부터 메모리로 데이터를 전송하거나 비교할 때 목적지 주소를 지정할 때 사용한다. 이때 세그먼트 레지스터 ES를 참조하여 20비트의 물리 주소를 생성한다(ES : DI). 그리고 이 레지스터는 일반적인 연산에도 사용된다.

명령어 레지스터 : IP(Instruction Pointer)
IP 레지스터는 다음에 실행할 명령어가 저장되어 있는 주소를 가지고 있는 레지스터로 명령어를 실행할 때마다 프로세서는 IP값을 현재 수행하는 명령어 길이만큼 자동적으로 증가해 다음 실행할 명령어 주소를 가지고 있다.
IP는 사용자가 값을 변경할 수 없다.

세그먼트 레지스터(Segment Register)
Intel 8086/8088 프로세서는 1MB까지의 메모리를 액세스하기 위해 20비트의 주소선이 있다. 그러나 Intel 8086/8088 레지스터는 모두 16비트의 크기 밖에 안 되므로 이들만 가지고는 1MB 용량을 가지는 메모리로 액세스할 수 있는 20비트의 주소를 생성할 수 없다. 그래서 IA-16 프로세서에서는 세그먼트 레지스터와 오프셋 레지스터 2개를 조합시켜 20비트 크기의 물리 주소를 산출해내는 방법을 취하고 있다.

1. CS(Code Segment) : 실행 할 명령어들이 들어있는 코드 세그먼트의 시작 주소를 가지고 있는 레지스터로 다음에 수행될 명령어의 물리 주소는 CSx10H와 오프셋 레지스터인 IP와 합해서 결정된다.
2. DS(Data Segmen) : 명령어가 수행하는데 필요한 데이터들이 들어있는 데이터 세그먼트의 시작주소를 가지고 있는 레지스터로 메모리 직접 주소 지정 및 BP 레지스터 이외의 다른 레지스터와 함께 사용하여 메모리 간접 주소 지정에서 오프셋 값과 더해져 물리 주소를 산출한다. 또한 문자열 처리 명령에서 SI 레지스터와 결합해서 출발지의 물리주소를 생성하기도 한다.
3. SS(Stack Segment) : 스택 영역을 나타내는 스택 세그먼트의 시작주소를 가지고 있는 레지스터로서 유효 주소는 SP와 SSx10H의 합으로 물리 주소를 결정한다. 또한 BP레지스터를 사용하는 메모리 간접 주소 지정에서 오프셋과 합해져서 물리 주소를 생성한다.
4. ES(Extra Segment) : 일반적으로 문자열 처리 명령어에 대해 사용할 때 추가로 사용하는 여분의 세그먼트인 익스트라 세그먼트의 시작주소를 가지고 있는 레지스터로 문자열 처리 명령어가 수행되면 목적지의 위치는 DI와 EXx10H로 결정되고 출발지의 위치는 SI와 DXx10H로 물리 주소가 결정된다.

오프셋(Offset) 레지스터
액세스 할 수 있는 해당 세그먼트의 크기는 최대 64KB이므로 그 세그먼트 안에서 필요한 정보를 액세스 하기 위해서는 다른 16비트 크기를 포인터 할 수 있는 레지스터가 필요한데 이 같은 포인터 역할을 하는 것을 오프셋 레지스터라 한다. 오프셋이란 어떤 기준 위치로부터 대상이 되는 정보가 있는 곳 까지의 떨어져 있는 거리를 의미한다.

20비트 물리 주소 산출
ex)
세그먼트 레지스터  0020H
오프셋                  0010H

  00200H (세그먼트 레지스터 4비트 shift left 결과 값)
   0010H (오프셋 값)
--------
+ 00210H

세그먼트 레지스터를 4비트 shift left 한 결과값 + 오프셋 값 = 20비트 물리 주소

플래그 레지스터(Flag Register)
CF(Carry Flag 비트 0) : 덧셈의 결과 높은 자리로 자리 올림수(carry)가 발생했다든지 혹은 뺄셈 후 빌림수(borrow)가 발생한 경우에 1로 세트된다. 또한 이 플래그는 부호 없는 정수연산에서의 오버플로(overflow) 상태를 나타내기도 하고, 다배정도 연산에 있어서도 사용된다.
PF(Parity Flag 비트 2) : 결과의 최하위 바이트에 값 1의 비트가 짝수 개 포함되어 있는 경우에 1이 되고 홀수 개 경우에는 0으로 된다.
AF(Auxilary carry Flag 비트 4) : 산술연산에 있어서 결과 비트 3에 캐리 혹은 빌림 수가 발생한 경우 1이 되고, 발생하지 않으면 0으로 된다. 이 플래그는 BCD 연산에서 보정용으로 사용된다.
ZF(Zero Flag 비트 6) : 연산의 결과 값이 0이 되었을 때 1로 세트된다.
SF(Sign Flag 비트 7) : 부호 있는 정수의 부호 비트가 0이면 양수, 1이면 음수로 된다.
OF(Overflow Flag 비트 11) : 연산을 부호가 있는 숫자로 했을 때, 오버플로 혹은 언더플로우(underflow)가 발생한 경우에 1로 세트된다.

제어 플래그 레지스터
DF(Direction Flag 비트 10) : 이 비트는 문자열 처리 방향을 정하는 방향 플래그이다. 문자열을 증가하는 레지스터는 DF가 0이면 선증가, DF가 1이면 선감소로 지정된다. 이 플래그는 STD(D = 1), CLD(D = 0) 명령으로 제어할 수 있다.
IF(Interrupt enable Flag) : 외부 인터럽트 발생의 허용을 제어하는 인터럽트 허용 플로그이다. IF가 1이면 외부 인터럽트가 허용되고, 0이면 금지된다. 이 플래그는 프로세서 내부에서 발생하는 인터럽트에 대해서는 영향이 전혀 없다.
TF(Trap enable Flag) : 이 플래그가 1로 세트되면 프로세서는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생하고 인터럽트 처리 루틴으로 들어간다.
2007/04/20 21:27 2007/04/20 21:27

Trackback URL : http://mysilpir.net/trackback/179

Leave a comment

« Previous : 1 : ... 137 : 138 : 139 : 140 : 141 : 142 : 143 : 144 : 145 : ... 270 : Next »

블로그 이미지

일상의 이야기를 나누는 공간입니다.

- 실피

Calendar

    «   2009/01   »
            1 2 3
    4 5 6 7 8 9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31

Total 157586 hit (Today 31, Yesterday 185)

Admin Write Post