크리에이티브 커먼즈 라이센스

홈페이지HOME

PHP

JavaScript

HTML

CSS

드롭다운메뉴

제로보드4

도   움   말

백지 건강강좌/자가임상체험

물박사(자가면역질환...)^미러

전동명(천연물질사전)^미러

竹田 장승옥(블로그)^글목록

계산환산(계산기)^ 단위변환

관주성경 TTS 일반파일 TTS

바이블로 Bible_ro 다운로드

다운로드>폰에 복사
>파일선택...설치됩니다.

[도움말 보기] 바로가기

개선 요구, 충고는
아래 관리자 연락
전화/메일 부탁 드립니다.
최대한 빨리 처리하고
업데이트 올리겠습니다.


asm_31.

(하드웨어-8088 mpu)


어셈블리어 강좌가 4부분으로 나뉩니다.

asm_00.으로 시작한 디버그만을 사용한 프로그래밍

asm_71.로 시작한 하이텔 두루물 강좌 요약 정리

asm_51.로 시작하는 어셈블리어 명령어 해설

asm_31.로 시작하는 하드웨어 관련 정리

각 독자의 공부 취향과 방향이 다를 수 있기 때문에, 필자가 3가지 방향으로 진행하는

강좌에서 마음에 드는 것부터 공부하시기 바랍니다.

공부 순서는 마음에 내키는 것이 가장 좋다고, 필자는 믿습니다.






제 31 장  하드웨어-8088 MPU


    asm_31.부터는 IBM PC의 하드웨어에 관하여 정리하고자 합니다. 프로그래밍을

    위해서는 하드웨어에 대한 어느 정도의 이해가 필요하기 때문에, 여러 책자를

    참고하여 정리해 보겠습니다.


하드웨어에 관한 정리로서 먼저 8088/8086 마이크로프로세서(MPU)에 관해 알아

보기로 하자.

마이크로프로세서(microprocessor 또는 MPU, Microprocessing Unit)는 컴퓨터의

CPU(Central Processing Unit, 중앙처리장치)를 단일 LSI() 칩에 담아서 만든 반도체

소자이다.

전통적인 컴퓨터의 구조는 CPU에 연산장치, 제어장치는 물론 주기억장치까지 함께

포함되며 CPU가 하나의 소자로 되어 있는 것이 아니라 여러 개의 소자가 복잡한 회로로

연결 구성되었지만, 마이크로프로세서(MPU)에는 주기억장치를 제외한 CPU의 모든

요소가 하나의 칩에 집적되어 있기 때문에 크기와 소비전력이 작아지고 성능 대비

가격이 저렴하여 PC 보급의 기폭제 역할을 하고 있다.



 ## 발전 참고


특수한 마이크로프로세서(MPU)로서 단일 칩 마이크로컴퓨터(singlechip microcomputer)라는

것이 있는데, 그것은 1개의 칩에 CPU 기능은 물론 메모리와 입출력 회로까지 내장되어

있기 때문에 칩 하나로서 완전한 컴퓨터의 기능을 갖추고 있으며, 부품의 수가 적고

가격이 저렴하여 기계제어용으로 널리 사용된다.






제 1 절  마이크로프로세서(MPU)의 종류

마이크로프로세서(MPU)의 종류도 많고 분류하는 방법도 여러 가지가 있다.

그러나 참고로 간단히 몇 가지만 알아 보기로 하자.


1. 비트수에 따른 MPU의 종류

비트수는 마이크로프로세서(MPU)의 일 처리능력 및 속도에 관계되는 사항으로

매우 중요한 것이다. 마이크로프로세서(MPU)는 4비트형, 8비트형, 16비트형, 32비트형을

거쳐 64비트형이 등장하고 있는 현실정이다.

인텔 칩으로서 각 비트형에 해당되는 칩을 살펴 보면 다음과 같다.


4비트형: 4004, 4040

8비트형: 8080, 8085

16비트형 : 8086(8088), 80286

32비트형 : iAPX432, 80386,

80486

64비트형 : PENTIUM


잘 알다싶이 8088 마이크로프로세서(MPU)는 외부 데이터버스가 8비트로 8비트

마이크로프로세서(MPU)와 비슷하지만 16비트 프로세서이다. 8086에 비하여 가격을

낮춤으로써 PC 보급을 확산하기 위해 만들어졌던 칩이다.

한편 8085는 8비트 프로세서이지만 8008의 성능을 향상시킨 것이며, 80286은 성능이

향상된 16비트 프로세서, 80486은 성능이 향상된 32비트 프로세서이다.






2. 구조, 용도에 따른 MPU의 종류

일반적으로 마이크로프로세서(MPU)라고 하면 내부가 연산부, 제어부, 레지스터부로

구성되어 기본적인 CPU 기능 뿐인 범용 마이크로프로세서(MPU)를 가리키지만, 그

외에도 이미 언급한 단일 칩 마이크로컴퓨터 등이 있다.


범용 마이크로프로세서

단일 칩 마이크로컴퓨터

Bit Slice형 마이크로프로세서


Slice(슬라이스)란 얇게 썬 조각을 뜻하는 영어로, Bit Slice형 마이크로프로세서란

2비트 혹은 4비트 크기의 기본 단위체로 구성되어 있는 마이크로프로세서(MPU)이며,

그것들을 여러 개 병렬로 조합하면 임의의 데이터 길이를 처리할 수 있는 CPU가 만들어진다.

극히 한정된 분야에서만 사용된다.


3. 반도체 제조기술에 따른 MPU의 종류

반도체 제조기술의 발전에 따라 여러 종류의 마이크로프로세서(MPU)가 나타나게

되었는데 다음과 같은 종류가 있다.


PMOS형

NMOS형

COMS형

Schottky TTL형

HMOS형

CHMOS, HCMOS, XMOS형


대부분의 8비트 마이크로프로세서(MPU)에는 NMOS형을 사용하고 있으며, 16비트

마이크로프로세서(MPU)에는 HMOS형이 주로 사용되었으나 32비트 마이크로프로세서(MPU)에

와서는 속도가 빠르고 집적도가 높은 HMOS의 장점과 소비전력이 낮은 CMOS의 장점을

조합한 고성능 반도체가 사용되고 있는데 반도체 제조회사별로 다른 명칭을 붙여서

CHMOS, HCMOS, XMOS 등의 칩이 있다.






제 2 절  MPU의 구조와 동작

마이크로프로세서(MPU)의 구조와 동작을 이해해 둘 필요가 있다.


1. MPU의 내부 구조

마이크로프로세서(MPU)의 구조는 다양하겠지만, 일반적인 구조를 살펴 보자.

마이크로프로세서(MPU)의 내부는 다음과 같이 구성되어 있다.


연산부(ALU, Arithmetic and Logic Unit)

제어부(Control Unit)

레지스터부(Registers)


연산부란 이름 그대로 산술(arithmetic)연산 및 논리(logic)연산 기능을 수행하는

회로를 가리킨다.

연산부의 주된 요소는 가산기(adder)이지만, 누산기(accumulator)와 상태 레지스터(status

register)를 연산부에 포함시키기도 한다.

제어부란 마이크로프로세서(MPU) 내부와 외부의 제어기능을 수행하는 회로이다.

즉 명령을 해독하고 제어신호를 발생하는 등의 일을 하는데, 명령 레지스터(IR,

instruction register)와 명령 해독기(instruction decoder) 및 제어신호 발생회로

등으로 구성된다.

레지스터부는 여러 개의 레지스터로 구성되며 각 레지스터는 마이크로프로세서(MPU)

내부에서 메모리와 같은 기능을 수행하는데, 프로그래머가 사용할 수 있는 범용 레지스터

및 시스템 리지스터와 프로그래머가 사용할 수 없는 레지스터가 있다.






2. 레지스터

우리가 마이크로프로세서(MPU)의 내부 구조를 세밀하게 알 필요는 없지만, 우리가

사용할 수 있는 레지스터에는 어떤 것이 있으며 그것들이 어떤 기능을 하는지 정도는

알아 두어야 어셈블리 프로그래밍에 활용할 수 있을 것이다.

그러므로, 마이크로프로세서(MPU)의 내부 구조 중에서도 레지스터에 대해 비교적

자세한 내용을 별도 항목으로 정리하고자 하는 것이다.

우리가 사용할 수 있는 레지스터는 크게 나누어 다음의 두 가지가 있다.


범용 레지스터

시스템 레지스터



1) 범용 레지스터

범용 레지스터는 프로그래머에 의해 주로 데이터 보관용으로 쓰이기 때문에 데이터

레지스터라고도 부르며 8080 계열에는 여러 개의 범용 레지스터가 있다.






2) 시스템 레지스터

시스템 레지스터에는 다음과 같은 것들이 있다.


프로그램 카운터(PC, Program Counter)

스택 포인터(SP, Stack Pointer)

인덱스 레지스터(Index Register)

누산기(Accumulator)

상태 레지스터(Status Register)


시스템 레지스터는 주로 마이크로프로세서(MPU)가 특정 용도로 사용하는 것이지만

프로그래머가 이를 사용할 수도 있다.

프로그램 카운터는 프로그램 실행 과정에서 다음에 처리할 명령이나 데이터의

메모리 번지를 지시하는 레지스터인데, 8088/8086에서는 IP(Index Pointer) 레지스터가

프로그램 카운터 역할을 한다.

스택 포인터는 메모리 내에 현재 있는 스택의 최상단(stack top) 번지를 지시하는

레지스터이다.

인덱스 레지스터는 메모리의 기저번지(base address)를 기억하는 데 쓰인다.

누산기는 산술 및 논리 연산의 결과를 기억하는 레지스터이다.

상태 레지스터는 연산 결과의 상태를 표시해 준다.

앞서 말한 바와 같이 누산기와 상태 레지스터는 연산부에 포함시키기도 한다.


3) 기타 레지스터

그 외에 우리가 사용할 수는 없고 단지 마이크로프로세서(MPU)만이 특수한 용도에

사용하는 레지스터로는 다음과 같은 것들이 있다.


어드레스 버퍼(MAR, Memory Address Register)

데이터 버퍼(MDR, Memory Data Register)

명령 레지스터(Instruction Register)

임시 레지스터(Temporary Register)


명령 레지스터와 임시 레지스터는 제어부에 포함시키기도 한다.






3. MPU의 외부 구조

마이크로프로세서(MPU)의 외부는 버스 및 전원, 클럭으로 구성된다.


어드레스 버스(Address Bus)

데이터 버스(Data Bus)

제어 버스(Control Bus)

전원

클럭(Clock)


클럭 신호의 입력 회수에 따라 단위 시간당 마이크로프로세서(MPU)가 동작하는

회수인 클럭 사이클(클럭 주파수)이 결정된다. 일반적으로 클럭 주파수가 높으면

마이크로프로세서(MPU)의 처리 속도가 빨라진다.


1) 어드레스 버스

어드레스 버스란 마이크로프로세서(MPU)가 외부의 메모리나 입출력 기기의 번지를

지정할 때 사용하는 단방향 버스(unidirectional bus)이다.

8080 계열에서는 같은 어드레스 버스를 통하여 메모리 번지(memory address)와

입출력 번지(I/O port)를 구별하여 지정할 수 있다.


2) 데이터 버스

데이터를 마이크로프로세서(MPU)로부터 메모리 또는 입출력 기기로 출력하기도

하고 그 반대 방향으로 메모리 또는 입출력 기기로부터 마이크로프로세서(MPU)로

입력하기도 하는 양방향 버스(bidirectional bus)이다.


3) 제어 버스

출력신호 및 입력신호의 전송로로 사용되지만 단방향 버스(unidirectional bus)이다.

출력신호는 마이크로프로세서(MPU)가 현재 수행 중인 일을 메모리나 입출력 기기에게

알려 주는 것이며, 입력신호느 마이크로프로세서(MPU)에게 어떤 동작을 취하도록

지시하는 것이다.






4. MPU의 동작

마이크로프로세서(MPU)의 단위 동작을 명령 사이클(instruction cycle)이라고

하는데, 명령 사이클은 동작의 내용에 따라 다음과 같이 2가지로 나뉜다.


페치 사이클(fetch cycle)

실행 사이클(execution cycle)


페치 사이클은 메모리에 저장되어 있는 프로그램의 한 명령을 CPU로 인출해 오고

그 명령을 해독하기까지 일련의 동작을 가리키며, 실행 사이클은 페치 사이클로 인출,

해독한 명령어를 실행하는 동작을 가리킨다.

마이크로프로세서(MPU)의 동작은 페치 사이클과 실행 사이클이 연속하여 교대로

반복되는 과정으로 구성된다.


1) 페치 사이클

페치 사이클이란 마이크로프로세서(MPU)가 수행할 명령을 메모리로부터 인출하여

명령 레지스터로 저장하고 또 그 명령을 명령 해독기에서 해독하기까지의 과정을

가리킨다.

페치 사이클의 구체적인 과정을 나누어 보면 다음과 같다.


1. 프로그램 카운터(IP 레지스터)의 내용이 어드레스 버퍼를 거쳐 어드레스 버스로

출력되어 인출할 명령이 위치하는 번지를 지정함

2. 프로그램 카운터가 1만큼 증가

3. 지정된 번지의 명령(OP code)이 데이터 버스 및 데이터 버퍼(MDR)를 거쳐 명령

레지스터로 전송됨

4. 명령 해독기에서 명령(OP code)이 해독됨







2) 실행 사이클

명령이 해독된 후, 그 명령의 내용에 해당되는 타이밍 및 제어신호가 순차적으로

발생하여 명령이 실행되는 단계이다. 오퍼랜드(operand)가 있는 명령의 경우에는

먼저 그 오퍼랜드를 메모리로부터 인출한 후에 최종 실행된다.



 ## 발전 참고


마이크로프로세서(MPU)와 메모리 사이의 1:1 대응 관계로 이어지는 전통적인 순차

실행은 메모리의 속도가 느린 관계로 비효율적이기 때문에 캐시 메모리를 내장하거나

파이프 라인 구조를 채택한 고성능 CPU를 만들어 사용하고 있다.


제 3 절  8088의 내부

앞 절에서 일반적인 마이크로프로세서(MPU)의 외부 구조와 내부 구조에 대하여

정리해 보았는데, 내부는 연산부와 제어부 및 레지스터부로 구성되었다.

그와 다른 각도에서 마이크로프로세서(MPU)의 내부를 나누어 볼 수도 있다.


실행부(EU, Execution Unit)

버스 인터페이스부(BIU, Bus Interface Unit)


8088 마이크로프로세서(MPU)의 내부를 실행부와 버스 인터페이스부로 나누어 살펴

보는 것은 우리에게 상당한 도움이 될 것으로 생각한다.






1. 8086의 구조

인텔 8088/8086의 내부를 보기 전에 먼저 외부와 연결된 전체 구조를 보자.

인텔 8086을 사용하는 컴퓨터의 기본 구조는 다음 그림과 같이 그릴 수 있다.


+------+ 주소선

(address bus)

|  +--20-+----------------+-------------------


| 8086 | | 자료선

(data bus)

|  | -16-+----------------+-------------------


| CPU  | |  † 제어선

|  †(control bus)

|  +-----+--+--+--+-------+--+--+--+----------


+------+  20 16  |  |메모리 16 16 |  |입출력장치

 |

 |  |  | |  |  |

 |

 ↓

    ↓ ↓ ↓선택

 ↓ ↓ ↓ ↓선택

 +------------+

 +------------+

 |  메

모 리  |  | 입출력장치 |

 +------------+

 +------------+


인텔 8086에서 데이터 입출력 버스와 메모리 버스는 논리적으로는 별개의 것이지만

실제로는 같은 핀을 공유하며, 처리기는 제어 버스로 제어 신호를 보내어 현재 핀에

도달한 자료가 입출력 접속기로 나갈 것인지 메모리 장치로 나갈 것인지를 알려 준다.



 ## 활용 팁


앞 절에서 데이터 입출력 버스는 양방향 버스(bidirectional bus)인 반면 메모리

버스와 콘트롤 버스는 단방향 버스(unidirectional bus)라고 말했는데, 앞의 그림에서

자료선의 양쪽 끝에 화살표가 있는 반면 주소선과 제어선에는 한 쪽 끝에만 화살표가

있는 것이 그 표시이다.


그림에서 보는 바와 같이 8086의 주소 버스는 20비트 크기이다. 그러므로 8086으로

1MB까지의 메모리 주소를 지정할 수 있는 것이다.



 ## 발전 참고


8086의 대부분의 명령은 16비트의 주소를 취급한다. 그리고 메모리 사상장치가

16비트의 주소를 20비트의 주소로 번역한다. 사상장치(어드레스 가산기)에 관해서는

조금 있다가 설명하게 될 것이다.


8086에서의 입출력 연산은 16비트의 주소를 사용한다. 따라서 CPU는 64KB까지의

입출력 중개 레지스터(포트)를 엑세스할 수 있다.






2. 실행부(EU)

8088과 8086의 실행부는 동일한 구조이며, 다음과 같이 구성되어 있다.


범용 레지스터 8개 : AX, BX, CX,

DX, SP, BP, SI, DI

플래그 레지스터 : F

연산부(ALU, Arithmetic and Logic Unit)

명령 해독 및 제어 회로


실행부의 주된 기능은 버스 인터페이스부의 명령 버퍼(instruction queue)로부터

명령을 꺼내어 해독하고 그 해독된 내용대로 실행하는 것이다.

만약 실행부에서 해독한 명령을 실행하는 과정에 외부 메모리나 I/O를 엑세스할

필요가 생기더라도 직접 엑세스하지는 못하며, 반드시 버스 인터페이스부에 요구하여

버스 인터페이스부를 거쳐 간접적으로만 액세스할 수 있다.

실행부가 지정할 수 있는 번지(어드레스)는 오직 16비트 어드레스인 오프셋(offset)일

뿐이며, 실행부에서 오프셋 번지가 버스 인터페이스부로 전달되면 버스 인터페이스부에서는

그 번지와 세그먼트 레지스터를 참조(세그멘팅)하여 20비트의 물리 어드레스를 산출한다.

그 사실은 세그먼트 레지스터가 실행부에 속하지 않고 버스 인터페이스부에 속하는

데서 쉽게 알 수 있을 것이다.






3. 버스 인터페이스부(BIU)

버스 인터페이스부는 다시 CPU 내부와 외부로 나누어 볼 수 있다.

마이크로프로세서(MPU) 내부에 해당되는 버스 인터페이스부는 다음과 같다.


세그먼트 레지스터 : CS, DS, SS,

ES

명령 포인터(IP, Instruction Pointer)

명령 대기 버퍼(Instruction Queue)

어드레스 가산기


명령 대기 버퍼에 대하여 알아 보자. 버스 인터페이스부가 메모리의 명령을 인출하여

명령 버퍼(Instruction Queue)에 대기시켜 두면 실행부는 대기 중인 명령을 차례대로

하나씩 꺼내어 해독하고 실행하게 되며, 그 사이에 버퍼에 빈 자리(바이트 또는 워드)가

생기면 버스 인터페이스부는 다시 그 다음 명령을 메모리로부터 인출해서 명령 버퍼에

저장하여 대기시킨다. 이와 같이 실행부와 버스 인터페이스부가 병렬적으로 명령의

인출 및 실행을 비동기 수행하는 방법으로 종래의 8비트 마이크로프로세서(MPU)에

비하여 처리 속도를 향상시키고 있다.



 ## 발전 참고


만약 분기(jump), 호출(call), 북귀(return) 등과 같이 CPU의 제어를 이동시키는

명령이 실행되면 명령 버퍼에 대기 중이던 나머지 명령들은 아무 쓸모가 없을 뿐더러

오히려 장애가 될 것이다. 따라서 CPU의 제어를 이동시키는 그런 명령이 실행되면,

버스 인터페이스부는 즉시 명령 대기 버퍼(Instruction Queue)를 리셋하여 비우고

제어가 이동된 위치로부터 요구되는 새로운 명령들을 인출하여 버퍼에 대기시킨다.


마이크로프로세서(MPU)의 외부에 해당되는 버스 인터페이스부는 다음과 같다.


어드레스 버스

데이터 버스

제어 버스


버스 인터페이스부의 주된 임무는 명령 코드를 메모리로부터 인출하여 명령 버퍼(Instruction

Queue)에 저장해 두는 일이다. 그 외에 실행부가 명령을 실행하다가 필요하여 외부

버스에 대한 액세스를 요구하는 경우에 그에 응하는 것도 버스 인터페이스부의 중요한

일 중 하나이다.

버스 인터페이스부가 외부 메모리를 액세스할 때는, 실행부로부터 전달받은 오프셋

번지에 버스 인터페이스부 자체 내의 해당 세그먼트 레지스터 값을 시프트한 값을

합하여 20비트의 물리 어드레스를 산출하고 액세스한다.



 ## 발전 참고


실행부와 달리 버스 인터페이스부는 8088과 8086이 다른 점이 있다. 그 하나는

명령 버퍼의 크기로서, 8088의 명령 버퍼는 4바이트이지만 8086의 그것은 6바이트

크기이다. 둘째로 8088은 메모리 데이터를 바이트 단위로 액세스하는 반면, 8086은

그것을 워드(2바이트, 16비트) 단위로 액세스한다. 따라서 8088은 실행부로부터 추가

전달된 버스 액세스 요구가 없는 한 명령 큐(명령 버퍼)가 1바이트만 비어 있어도

즉시 다음 명령을 prefetch하여 버퍼를 채우지만, 8086은 명령 버퍼가 2바이트 이상

비어 있어야만 다음 명령을 prefetch한다.






4. 레지스터

지금까지 레지스터는 다 같은 것으로 생각했던 사람이라도, 어떤 레지스터는 실행부에

속하고 다른 레지스터는 버스 인터페이스부에 속한다는 사실을 안 것만으로 8088의

세그멘팅에 대하여 한층 깊은 이해를 하게 되었을 것이다.

이제 실행부와 버스 인터페이스부를 망라하여 레지스터 전반을 정리해 보자.

8088와 8086에는 꼭 같이 16비트 레지스터 14개가 들어 있다.

8088의 14개 레지스터는 다음과 같은 4종류로 구분된다.


범용 레지스터(General Register) : AX, BX, CX, DX, SP, BP, SI, DI

세그먼트 레지스터(Segment Register) : CS, DS, SS, ES

명령 포인터(IP, Instruction Pointer)

플래그 레지스터(Flags)




 ## 활용 팁


8개의 범용 레지스터와 1개의 플래그 레지스터 등 9개의 레지스터는 실행부에

속해 있으며, 4개의 세그먼트 레지스터와 1개의 명령 포인터 등 5개의 레지스터는

버스 인터페이스부에 속해 있다.


범용 레지스터는 다시 2종류로 구분된다.


데이터 그룹(Data Group) :

AX, BX, CX, DX

포인터 및 인덱스 그룹(Pointer and Index Group) : SP, BP, SI, DI


모든 레지스터는 16비트 크기이지만, 범용 레지스터 중에서 데이터 그룹에 속하는

4개의 레지스터 AX, BX, CX, DX는 상위 8비트와 하위 8비트로 나뉘어 그 각각이 8비트

레지스터로 사용될 수도 있는 구조를 가지고 있다.






1) 범용 레지스터 - 데이터 그룹

8088의 실행부를 구성하는 9개 레지스터 중 4개이다.

범용 레지스터의 데이터 그룹에 속한 레지스터들은 4개의 16비트 레지스터로 사용될

수도 있고, 8개의 8비트 레지스터로 사용될 수도 있다.


15 ......... 8 7 ......... 0 (비트)

+-------------+-------------+

|   AH

 | AL| Accumulator [AX]

+-------------+-------------+

|   BH

 | BL| Base

Register [BX]

+-------------+-------------+

|   CH

 | CL| Count

Register[CX]

+-------------+-------------+

|   DH

 | DL| Data

Register [DX]

+-------------+-------------+


데이터 그룹 범용 레지스터들은 8비트 마이크로프로세서(MPU)의 어큐뮬레이터처럼

대부분의 산술 연산 및 논리 연산에 사용될 수 있지만, 나름대로 독특한 용도에 사용되는

수가 많다.


AX(Accumulator)


주로 각종 산술 연산 및 논리 연산에 사용된다.


BX(Base Register)


산술/논리 연산 및 메모리 간접번지지정에 사용된다.


CX(Count Register)


산술/논리 연산 외에도, 루프 명령(loop)이라 repeat prefix 스트링 명령(rep)에서

루프 카운터(loop counter)로는 CX 레지스터가 주로 사용되고, 시프트(shift) 및

로테이트(rotate) 명령에서 비트 카운터(bit counter)로는 CL 레지스터가 많이 사용된다.


DX(Data Register)


산술/논리 연산 특히 곱셈 및 나눗셈에서 많이 사용되며, 입출력 명령에서 I/O

port의 간접지정에도 사용된다.






2) 범용 레지스터 - 포인터 및 인덱스 그룹

8088의 실행부를 구성하는 9개 레지스터 중 4개이다.

범용 레지스터의 포인터 및 인덱스 그룹에는 2개의 포인터 레지스터와 2개의 인덱스

레지스터가 속해 있다.


포인터 레지스터 : SP, BP

인덱스 레지스터 : SI, DI


항상 16비트 레지스터로만 사용되며, 주된 임무는 메모리 어드레스 지정이다.

그러나 산술 연산 및 논리 연산에도 사용될 수 있다.


SP(Stack Pointer)


메모리 상에서 스택의 상단을 지시하며, 해당 위치를 지정하기 위해서는 SS(Stack

Segment)를 참조하여 20비트의 물리 어드레스를 산출한다.

push, pop, call, ret 명령으로 스택을 조작하면 SP의 값이 자동적으로 증가 또는

감소하게 되어 있다.


BP(Base Pointer)


역시 SS를 참조하여 20비트의 물리 어드레스를 산출하며, 주로 메모리 간접번지지정에

사용된다.


SI(Source Index)


DS(Data Segment)를 참조하여 20비트의 물리 어드레스를 산출하며, 주로 메모리

간접번지지정에 사용되지만, 스트링 명령에서 소스 오퍼랜드(source operand) 지정에도

이용된다.


DI(Destination Index)


물리 번지 산출에 경우에 따라 2개의 세그먼트 레지스터 값 중 하나를 사용한다.

즉 메모리 간접번지지정에 사용되는 경우에는 DS를 참조하여 20비트의 물리 어드레스를

산출하지만, 스트링 명령에서 목적 오퍼랜드(destination operand) 지저에 사용될

때에는 ES(Extra Segment)를 참조하여 20비트의 물리 어드레스를 산출한다.






3) 세그먼트 레지스터

8088의 버스 인터페이스부를 구성하는 5개 레지스터 중 4개이다.

8088과 같은 16비트 마이크로프로세서(MPU)는 구조상 216=65536(바이트) 즉 64KB의

어드레스 밖에는 관리할 수 없다는 한계가 있기 때문에, 그 한계를 극복하고 1MB의

메모리를 관리하기 위하여 세그먼트가 필요하게 된 것이다.

즉 1MB의 메모리를 64KB 단위의 세그먼트로 분할하면 16개의 세그먼트가 된다.

그런 식으로 각 세그먼트를 관리하면 어쨌든 1MB의 메모리를 관리할 수 있다.

세그먼트 단위의 메모리 관리에 있어서 각 세그먼트의 기저번지(base address)를

표시하기 위해 사용되는 레지스터를 세그먼트 레지스터라고 한다.

8088에는 4개의 세그먼트 레지스터가 있다.


CS(Code Segment): 명령 코드

영역 관리

DS(Data Segment): 데이터

영역 관리

SS(Stack Segment) : 스택 영역 관리

ES(Extra Segment) : 보조 영역 관리


20비트의 물리 어드레스를 산출하기 위해서는 버스 인터페이스부의 어드레스 가산기가

실행부로부터 받은 오프셋 번지에 해당 세그먼트 레지스터 값의 왼쪽으로 4비트 시프트된

값을 보태는 방법을 사용한다.

물리 번지를 산출할 때 보태지는 세그먼트와 오프셋의 조합은 다음과 같다.


오프셋세그먼트작업

IPCSInstruntion

Fecth

SPSSStack

Operation

Effective Address DS(또는 CS, ES,

SS) 메모리 간접번지지정

Effective Address SS(또는 CS, DS,

ES) BP를 사용한 메모리 간접번지지정

SIDS(또는

CS, ES, SS) String Source

DIESString

Destination


이제 각 세그먼트의 용도를 알아 보자.


CS(Code Segment)


프로그램 영역의 64KB를 지정하여 관리하는데, 결국 그 범위 안에서 오프셋 번지가

변함에 따라 프로그램의 각 명령 코드가 순차 실행된다. CS:IP로 조합된 물리 번지가

다음에 실행될 코드의 위치를 가리킨다.


DS(Data Segment)


데이터 영역의 64KB를 지정하여 관리한다. 메모리 직접번지지정 방식에서, 또한

BP 이외의 레지스터를 사용하는 메모리 간접번지지정 방식에서 오프셋 번지와 조합된

물리 번지가 메모리 상에서 인출할 데이터의 위치를 가리킨다. 또한 스트링 명령에서는

DS:SI로 조합된 물리 번지가 메모리 상에서 인출할 소스 스트링의 위치를 가리키게

된다.


SS(Stack Segment)


스택 영역의 64KB를 지정하여 관리한다. SS:SP의 조합으로 스택 메모리의 물리

어드레스가 산출된다. 또한, BP를 사용하는 메모리 간접번지지정 방식에서 오프셋과

합산되어 물리 어드레스가 산출되기도 한다.


ES(Extra Segment)


보조 영역의 64KB를 지정하여 관리한다. 스트링 명령에서 ES:DI의 조합으로 목적(destination)

쪽의 물리 어드레스가 산출된다.


4) 명령 포인터(IP, Instruction Pointer)

8088의 버스 인터페이스를 구성하는 5개 레지스터 중 하나이다.

명령 포인터는 다음에 실행할 명령의 번지를 가리키는 레지스터로서, 8비트 프로세서에

있어서의 프로그램 카운터(PC, Program Counter)에 해당된다.

CS:IP의 조합으로 다음에 실행할 명령의 물리 어드레스가 결정된다.

명령 포인터 레지스터의 값은 사용자가 임의로 변경시킬 수 없다.



 ## 활용 팁


우리가 디버그로 프로그램을 짤 때는 명령 포인터를 조작할 수 있다.






5) 플래그 레지스터(Flags)

8088의 실행부를 구성하는 9개 레지스터 중 하나이다.

8088/8086의 플랙 레지스터는 16비트 레지스터이지만, 전체 16비트 중에서 실제로

사용되는 것은 9비트이다. 플래그 레지스터 전체로서 하나의 의미를 가진다기보다는

유효한 9개의 비트 중 각 비트가 의미를 가지고 있는 것이다.

플래그 레지스터의 유효 비트들은 다시 다음과 같이 나눌 수 있다.


상태 플래그(status flag):

CF, PF, AF, ZF, SF, OF

제어 플래그(control flag) : TF,

IF, DF


그 중에서 상태 플래그는 연산결과에 따른 상태의 변화 여부를 표시하며, 제어

플래그는 시스템 제어를 위한 정보를 표시한다.

플래그 레지스터의 각 유효 비트의 용도를 알아 보자.


CF(Carry Flag)


16비트 중 하위 8비트에만 적용되는 플래그로, 연산 후 최상위 비트에서의 자리

올림(carry)이나 자리 내림(borrow)을 표시한다. 또한 shift나 rotate 명령에서 bit의

검사에도 사용된다.

STC(CF=1), CLC(CF=0), CMC(CF=CF) 등의 명령으로 제어할 수 있다.


PF(Parity Flag)


연산 결과 1인 비트가 짝수개이면 패리티 플래그는 1이 되고, 연산 결과 1인 비트가

홀수개이면 패리티 플래그는 0이 된다. 그 성질을 사용하여 데이터 전송의 오류 검출에도

이용된다.


AF(Auxiliary Carry Flag)


8비트의 하위 nibble(4비트)로부터 상위 니블로의 자리 올림 또는 상위 니블로부터

하위 니블로의 자리 내림을 표시한다. 따라서 보조 캐리 플래그(AF)는 16비트 중

하위 8비트의 연산 결과에만 적용되며, 10진 연산 결과의 보정에도 사용된다.


ZF(Zero Flag)


연산 결과가 0임을 표시하는 플래그로서, 연산 결과가 0이면 제로 플래그는 1이

되고 연산 결과가 0이 아니면 제로 플래그는 0이 된다.


SF(Sign Flag)


연산 결과가 음수인지 여부를 표시하는 플래그로서, 연산 결과가 음수이면 사인

플래그는 1이 되며 연산 결과가 양수이면 사인 플래그는 0이 된다. 2진수의 최상위

비트에 사인 플래그를 붙여 표시하는 방법으로 2의 보수(2's complement) 체계가

만들어진다.


OF(Overflow Flag)


연산 결과 수용할 수 있는 자리수를 초과하는 일(overflow)이 발생했는지의 여부를

표시하는 플래그로서, 8비트의 연산 결과가 9비트의 수로 되거나 16비트의 연산 결과가

16비트의 수로 된 경우 등에 자리수를 초과한 1비트는 소멸되며, 그 표시로 오버플로우

플래그에 1이 저장된다.


TF(Trap Flag)


한 명령을 실행한 후 type 1의 인터럽트를 발생시켜서 명령을 1 스텝씩 실행하도록

만드는 플래그이다. 디버거의 싱글 스텝(single step) 등에서 사용된다. 플래그 레지스터를

마스킹(masking) 기법으로 조작하여 제어할 수 있다.


IF(Interrupt Enable Flag)


외부의 마스크블 인터럽트(maskable interrupt)를 가능하게 만드는 플래그이다.

STI(IF=1), CLI(IF=0) 등의 명령으로 제어할 수 있다.


DF(Direction Flag)


스티링 명령에서 소스 또는 목적 어드레스를 자동으로 증가시키기나 감소시키는

플래그이다. DF=1이면 auto-increment 상태이며, 반면에 DF=0이면 auto-decrement

상태이다. 대상이 되는 어드레스는 소스 어드레스의 경우 SI 값이 되며 목적 어드레스의

경우 DI가 되므로, 결국 DF=1이면 SI 또는 DI 값을 자동으로 증가시키고 DF=0이면

SI 또는 DI 값을 자동으로 감소시키게 될 것이다.

STD(DF=1), CLD(DF=0) 등의 명령으로 제어할 수 있다.






                        이 장의 내용은 윤덕용(尹德鏞)님의 "16비트 마이크로프로세서 및 IBM PC

하드웨어 입문"(도서출판 朝元社 1994.1.10. 4판 발행) 1 내지 50 쪽을 주로

참고하고 다른 책자도 참고하면서 필자가 이해하는 한도에서는 최대한 쉽게, 반드시

참고할 만한 내용만 발췌 편집하였지만 다소 어려운 내용도 있을 것이다. 그러나

필자가 늘 말하는 것처럼 뒤에 가면 구체적인 사용과 함께 저절로 다 알게 되어 있으니

매달리지 말고 이해되는 부분만으로도 만족하고 넘어가기 바란다. 다른이들의 책자를

참고하였지만, 필자가 공부하면서 느낀 점들을 수시로 반영하여 편집하므로 새로운

맛을 볼 수 있을 것이라고 믿으며, 부족한 점이 발견되면 충고 메일 주시기 바란다.



ID:
PW:

     0 분
     2 분

자유게시판

건강백과 HOME

홈페이지 HOME

조   약     HOME

생활지혜 HOME

서식양식 HOME

법원 전산양식 검색

In Na zum

비공개 HOME

백과넷 포탈 : 건강/법률(메인)/홈피/서식/조약/생활지혜

◁ 2002.9.1.~2021.4.11. ▷

관리자 연락(저작권 의심 신고) : 김병희 010-6204-4973 k8z7@hanmail.net