Header

  1. View current page

    knowledge님의 노트

Profile_img_60x60_01
1

about 8086

세그먼트 메모리

  • 8086은 1mb의 메모리 공간을
    • 코드 세그먼트 : 명령어 코드를 저장
    • 데이터 세그먼트 : 데이터를 저장
    • 스택 세그먼트 : 메모리에 할당된 스택 영역
    • 엑스트라 세그먼트 : 여분의 데이터 영역

으로 구분한다.

  • 세그먼트 레지스터는
    • 8086이 필요한 정보를 세그먼트 단위로 나누어 저장하고 있기 때문에 정보를 가져오기 위해선 각 세그먼트의 시작 주소를 알아야 한다.
      • 따라서 4 개의 세그먼트 레지스터를 이용해 각 세그먼트 영역의 시작 주소를 가리킨다.
        • CS : 실행 할 명령어들이 들어있는 코드 세그먼트의 시작 주소를 가지고 있는 레지스터. CS X 10H + OFFSET(IP)로 물리 메모리 주소 결정
        • DS : 데이터 세그먼트의 시작 주소를 가지고 있다. 메모리 직접 주소 지정 혹은 BP 외의 레지스터와 함께 사용하여 메모리 간접 주소 지정에서 오프셋 값과 더해져 물리 주소를 산출한다.
        • SS : 스택 세그먼트의 시작 주소를 가지고 있다. SP와 SS X 10H의 합으로 물리 주소를 결정한다. BP를 사용하는 메모리 간접 주소 지정에서 오프셋과 합해 물리 주소를 생성한다.
        • ES : 일반적으로 문자열 처리에 사용. 문자열 처리 명령어가 수행되면 목적지의 위치는 DI와 EX X 10H로 결정되고 출발지는 SI와 DX X 10H로 물리주소 결정한다.
  • 오프셋 레지스터
    • 최대 64KB 크기인 세그먼트 안에 저장되어 있는 정보를 액세스하기 위해 세그먼트 레지스터만으로는 불가능하기 때문에 다른 방법이 필요하다.
    • 세그먼트 안에서 필요한 정보를 액세스하기 위해서는 다른 16비트 크기를 포인트 할 수 있는 레지스터가 필요한데, 이 역할을 하는 것이 오프셋 레지스터이다.
    • 하나의 세그먼트에 접근하기 위해 대상이 되는 세그먼트 레지스터가 가진 시작 주소에 오프셋을 더해 데이터에 액세스
    • 메모리 동작     묵시적 레지스터     대체 가능 레지스터     오프셋
    • 명령어 인출     CS                       없음                         IP
    • 스택 처리        SS                       없음                         SP
    • 데이터 액세스  DS                       CS, ES, SS              주소 지정 방식에 따라 다름
  •  20비트 물리 주소 산출
    • 16비트 세그먼트 레지스터 << 4 + 16비트 offset
    • seg : 20H  offset : 10H일 때 =>  200H(20H << 4) + 10H = 210H
  • 플래그 레지스터
    • 상태 플래그
      • 0 - carry flag : 덧셈에서 캐리 발생 혹은 뺄셈에서 빌림수 발생 시 1로 셋. 부호 없는 정수 연산에서 오버플로 상태 표현.
      • 2 - parity flag : 값 1을 가지는 비트가 짝수 개면 1, 홀수 개면 0.
      • 4 - auxiliary carry flag : 결과 비트 3번(하위 4비트)에 캐리 혹은 빌림수가 발생하면 1. BCD 연산에서 보정용으로 사용.
      • 6 - zero flag : 연산의 결과 값이 0일 때 1로 셋.
      • 7 - sign flag : 부호 있는 정수의 부호 비트가 양수면 0, 음수면 1. 부호있는 연산의 결과가 음일 때 1.
      • 11 - overflow flag : 부호 있는 숫자 연산 시 오버플로나 언더플로 발생시 셋.
    • 제어 플래그
      • 8 - trap flag : 명령 실행 때마다 INT 10H를 발생시킬 건지 결정. trace bit라 한다.
      • 9 - interrupt flag : 셋되어 있으면 인터럽트 허용.
      • 10 - direction flag : 문자열 명령 수행 시 셋되어 있으면 SI, DI 값이 증가, 안되어 있으면 감소.

IA-32

  • 기본 환경
    • 주소 공간 : 4GB의 실제 주소 공간과 64GB의 물리 주소 공간 액세스 가능.
    • 기본 프로그램 실행 레지스터
      • 8개의 32비트 범용 레지스터
        • ESP는 스택 포인터를 쓰는 게 원칙이므로 이외의 용도로 사용해서는 안된다.
        • EAX : 32bit EAX or 16bit AX or 8bit AH / AL
          • 8bit or 16bit만 사용시 나머지 비트는 영향을 받지 않는다.
        • EBX : 32bit EBX 16bit BX 8bit BH/BL
          • IA-32 프로세서에서 EBX는 메모리(DS 세그먼트)의 데이터를 액세스 하는 주소를 지정하는데 사용.
        • ECX : 문자열 처리 및 루프 제어용 카운터
          • IA-32에서 메모리 데이터를 주소 지정하는데 사용.
        • EDX : 곱셈의 결과를 저장하거나 나누기 계산 전 피제수를 저장하는 목적으로 사용.
          • IA-32에서 메모리 데이터를 주소 지정하는데 사용하기도 한다.
        • ESI : DS 세그먼트 내의 데이터에 대한 오프셋 주소 포인팅.
        • EDI : ES 세그먼트 내의 데이터에 대한 오프셋 주소 포인팅.
        • ESP : SS 세그먼트 내의 스택 포인터. TOP을 가리킨다.
        • EBP : 메모리의 위치를 지시하는데 사용.
          • BP 혹은 EBP로 동작
          • 인수가 있는 함수를 호출할 때 스택 속에서 EBP를 기준으로 인자를 액세스
      • 6개의 16비트 세그먼트 레지스터
        • CS : 코드 세그먼트 시작 주소를 저장.
          • 코드 세그먼트는 실제 모드에서 최대 64KB이며 보호 모드에서 4GB이다.
        • DS : 데이터 세그먼트의 시작 주소를 저장.
          • 코드 세그먼트와 동일한 크기.
        • ES : 여분의 데이터 세그먼트용. 문자열 처리 명령 시 목적지 데이터를 저장.
        • SS : 스택으로 사용할 메모리 영역의 시작 주소를 저장.
          • 스택 세그먼트 내의 현재 위치는 스택 포인터 레지스터에 의해 결정.
          • EBP도 스택 세그먼트 내의 데이터를 주소 지정하는데 사용.
        • FS / GS : 여분의 세그먼트로 IA-32 프로세서에서만 사용 가능
          • 프로그램이 액세스할 수 있는 2개의 추가 메모리 세그먼트를 쓸 수 있게 해 준다.
        • 세그먼트 레지스터가 어떻게 사용되는지는 사용하는 메모리 관리 모델에 따라 상이
          • 플랫flat 메모리 모델
            • 세그먼트 레지스터에 오버래핑(세그먼트들이 겹치는 것)하는 각 세그먼트들을 포인팅 하는 세그먼트 셀렉터가 로드된다.
          • 세그먼티드segmented 메모리 모델
            • 각각 가리키는 세그먼트의 시작 주소가 저장할 수 있도록 각각 다른 세그먼트 셀렉터가 로드된다.
        • CS 레지스터는 프로그램에서 명시적으로 로드될 수는 없으나, 프래그램 제어를 변경하는 명령 또는 내부 프로세서 조작에 의해 묵시적으로 로드될 수는 있다.
        • SS 레지스터는 명시적으로 로드할 수 있기 때문에 프래그램에서 이 레지스터를 통해 복스의 스택을 셋업하여 그들 간을 상호 전환할 수 있다.
      • 32비트 EFLAGS 레지스터
        • 1, 3, 5, 15, 22~31 비트는 예약되어 있으므로 쓰면 안된다.
        • LAHF,SAHF,PUSHF,PUSHFD,POPF,POPPFD 등의 명령으로 프로시저 스택 혹은 EAX 레지스터로 플래그의 그룹을 이동할 수 있다.
        • EFALGS 레지스터의 내용은 비트 조작 명령(BT,BTS,BTR,BTC)을 사용해 플래그의 조사 및 변경을 할 수 있다.
        • 시스템 플래그
          • 12, 13 - IOPL(I/O Priviledge Level filed) : 보호모드에서 IO장치의 특권 레벨을 선택하는데 사용.
            • 현재 특권 레벨이 IOPL보다 높으면 IO는 장애없이 동작
          • 14 - NT(Nested Task) : 보호모드에서 현재 작업이 다른 작업 속에서 중첩되어 있음을 가리킨다. 문맥 교환에 쓰인다.
          • 16 - RF(Resume Flag) : 디버깅 시 사용되며 디버그 폴트를 받아들이거나(rf = 0) 혹은 무시한다(rf = 1).
          • 17 - VM(Virtual-8086 Mode) : 보호모드에서 가상 모드 동작을 선택한다.
          • 18 - AC(Alignment Check) : 더블워드 범주가 아닌 곳에 더블워드가 저장되어 있거나 이상한 주소에 저장되어 있는 워드를 액세스했을 때 알려준다.
          • 19 - VIF(Virtual Interrupt flag) : IF 플래그의 가상 이미징. VIP와 같이 쓰인다.
          • 20 - VIP(Virtual Interrupt Pending flag) : 보유상태의 인터럽트가 있는 경우 셋, 없으면 클리어. VIF와 같이 쓰인다.
          • 21 - ID(IDentification flag) : CPUID 명령이 지원되는지 여부를 표시한다.
      • 32비트 EIP 레지스터
        • 현재 프로세서가 실행하고 있는 명령 바로 다음에 실행할 명령어의 오프셋을 저장한다.
        • 수행한 명령어 길이만큼 증가된 EIP는 메모리 내의 다음 실행할 명령어를 가리킨다.
        • 실제 모드로 동작할 때는 16비트 IP(상위 16비트는 0)로, 보호 모드로 동작할 때는 32비트 EIP로 동작한다.
  • IA-32 프로세서의 동작 모드 종류
    • 보호 모드
      • IA-32 프로세서의 본래 동작 상태
      • 제공되는 명령어와 컴퓨터 구조 상의 기능 모두를 사용할 수 있어서 최고의 성능을 얻을 수 있다.
      • 세그먼티드 메모리 모델을 사용하며, 허용되지 않은 다른 영역의 메모리 참조를 감독하고 제어한다.
    • 실제 모드
      • 8086 상위 기종에서 8086의 소프트웨어와 완벽히 호환하도록 동작하는 모드다.
      • IA-32가 실제 모드로 동작할 때 오리지널 8086보다 빠르게 동작한다.
        • IA-32의 32비트 레지스터를 액세스할 수 있고, FS,GS를 사용할 수 있다.
        • 하지만 내부 동작이 8086으로 제한되므로
          • 사용 가능한 주소 공간은 1MB로 제한
          • 8086의 세그먼트 메모리 주소 지정 메커니즘이 사용되며 각 세그먼트 크기는 64KB로 제한
    • 가상 8086 모드
      • IA-32 프로세서가 각각의 실제 모드 프로그램마다 1MB의 메모리 영역을 할당하여 실행하고 있는 응용 프로그램들이 실제 모드나 8086 상에서 수행하는 것처럼 만들어 준다.
      • 이러한 식으로 여러 개의 8086 프로그램을 각각 할당된 메모리 영역으로부터 보호하며 각 프로그램을 시분할 방식으로 처리한다.
    • 시스템 관리 모드
      • 전원 관리와 시스템 보안 등의 메커니즘을 가지는 os를 제공한다.
  • 메모리 모델
    • 플랫 메모리 모델
      • 프로그래머의 관점에서 실제 주소 공간이라 불리는 하나의 연속된 주소 공간처럼 보인다.
      • 코드, 데이터, 프로시저 스택은 모두 이 주소 공간에 저장된다.
      • 실제 주소 공간에는 바이트 단위로 주소 지정이 가능하며 주소는 4GB의 범위로 연속되어 있다.
      • 실제 주소 공간 내 임의의 바이트에 대응하는 주소를 실제 주소라 부른다.
    • 세그먼티드 메모리 모델
      • 프로그래머 관점에서 세그먼트 단위의 독립된 주소 공간의 그룹처럼 보인다.
      • 코드, 데이터, 스택은 독립된 세그먼트에 저장된다.
      • 세그먼트 내 바이트를 주소로 지정하려면 프로그램에 의해 세그먼트 셀렉터와 오프셋으로 구성된 논리 주소를 사용해야 한다.
      • IA-32 프로세서에서 동작하는 므로그램은 크기와 타입이 다른 세그먼트를 최대 16383개까지 지정 가능하며 최대 세그먼트 크기는 4GB이다.
    • 실제 메모리 모델
      • 8086의 메모리 모델이 사용된다.
      • 기존 8086 프로그램과의 호환성을 유지하기 위해 지원한다.
      • 세그먼티드 메모리의 특정 구현을 사용해 실제 주소공간을 필요에 따라 각각 최대 64KB의 세그먼트 배열로 구성된다.
      • 실제 주소 공간의 최대 크기는 1MB이다.
  • 32비트 레지스터 모드에서의 특성
    • 16비트 모드와 32비트 모드 지정이 가능.
    • 어느 모드에서든 32비트 레지스터르 살용 가능.
    • 16비트 모드는 32비트 레지스터를 사용할 수 있다는 점을 제외하고 8086과 동일하게 동작.
    • 32비트 모드(.386 이상 지시어 사용 시)에서 32비트 범용 레지스터들은 어떤 세그먼트 모드도 사용 가능.
      • 32비트 모드에서 오프셋 주소는 4GB까지 가능.
  • IA-32 상에서의 실제 모드
    • 실제 모드 IA-32 프로세서의 세그먼트와 세그먼트 레지스터
      • 세그먼트 방식으로 메모리를 관리
        • CS -> CODE SEGMENT 64K
        • SS -> STACK SEGMENT 64K
        • DS -> D DATA SEGMENT 64K
        • ES -> E DATA SEGMENT 64K
        • FS -> F DATA SEGMENT 64K
        • GS -> G DATA SEGMENT 64K
      • 메모리 참조 형식          기본 레지스터          대체 가능 레지스터         오프셋 레지스터
      • 명령어 페치                CS                          NONE                          EIP LOWER 16bit
      • STACK                      SS                          NONE                          BP,EBP,SP,ESP
      • 변수 접근                   DS                          CS,ES,SS,GS,FS           유효 주소 값
      • 문자열 출발지             DS                          CS,ES,SS,GS,FS           ESI,SI
      • 문자열 목적지             ES                          FS,GS                          EDI,DI
  • 메모리 주소 지정 개념
    • IA-32 프로세서는 바이트에 의한 주소 지정 방식 사용
      • 메모리는 바이트들의 연속으로 구성되어 접근
      • 한 바이트를 접근하든 여러 바이트를 접근하든 대상이 되는그 바이트를 저장하고 있는 메모리로의 접근은 하나의 바이트 주소를 사용
      • 주소 지정이 가능한 메모리의 범위를 주소 공간이라 부른다.
      • IA-32 프로세서는 세그먼티드 주소 지정도 지원
        • 어떤 세그먼트를 액세스할 것인지 정하는 세그먼트 레지스터
        • 대상 세그먼트 내의 명령어 혹은 자료까지의 거리를 나타내는 오프셋
    • 메모리 주소 지정
      • 세그먼트 부분
        • 6개의 세그먼트 레지스터에 의해 한 프로그램 내의 어느 곳에서도 최대 6개까지 세그먼트에 접근 가능
        • 주소의 세그먼트 레지스터를 지정하기 위해 명시적으로 결정하는 경우와 디폴트로 정해져 있을 경우 등에 의해서 지정
          • 코드 참조 시 항상 CS
          • 스택 참조 시 항상 SS
          • 문자열 처리 명령어에서는 목적지 오퍼랜드용으로 항상 ES
        • 다음에 실행되는 명령어의 주소 > CS:[EIP]
        • 코드세그먼트에 명령어와 데이터가 다 있다면, 데이터 참조도 CS 레지스터를 주소의 세그먼트부로 해 행할 수 있다.
          • EBX 레지스터의 값 + 8에 있는 데이터는 같은 세그먼트 내의 명령어에서 CS:[EBX+8]로 지정 가능
        • 다른 코드 세그먼트로 실행 위치를 변경하기 위해서는 CS 및 EIP 레지스터에 새로운 값을 로드해야 한다.
          • 다른 세그먼트 안에 있는 프로시저로의 제어 전달이 효율적으로 수행
        • 스택 TOP은 오프셋 값으로 ESP 레지스터가 보유하므로 이 레지스터는 그 전용으로 예약
          • 스택 TOP > SS:[ESP]
        • CS,SS,ES,GS로 데이터 세그먼트 지정시 DS보다 명령어가 1바이트 길어짐
          • 가장 빈번하게 참조 되는 데이터 세그먼트는 DS로 지정, 나머지 세그먼트를 ES,FS,GS로 지정
      • 오프셋 부분
        • 베이스 레지스터 사용
          • GPR 8개 사용 가능, 또는 생략 가능
        • 인덱스 레지스터 사용
          • ESP 제외한 모든 GPR 사용 가능, 혹은 생략 가능
          • 인덱스 레지스터가 지정되면 이 레지스터 값을 1, 2, 4, 8배율로 환산 가능
          • 변위로 8, 16, 32비트 정수 지정 가능, 혹은 생략 가능
          • OFFSET VALUE  =  BASE + INDEX * SCALE FACTOR + DISPLACEMENT
            •                     EAX     EAX       1                         NONE
            •                     EBX     EBX       2                         8bit
            •                     ECX     ECX       4                        16bit
            •                     EDX     EDX       8                         32bit
            •                     ESP     EBP
            •                     EBP     ESI
            •                     ESI      EDI
            •                     EDI
          • 데이터 참조를 위한 디폴트 세그먼트 레지스터는 어떤 레지스터가 베이스 레지스터로 선택되는가에 따라 달라진다.
            • 베이스 레지스터가 ESP 또는 EBP면 디폴트 세그먼트 레지스터는 SS
            • 그 외 모든 베이스 레지스터 선택 또는 생략 시 디폴트 세그먼트 레지스터는 DS
            • 디폴트 이외의 레지스터를 쓸 경우 세그먼트 레지스터 프리픽스 때문에 명령어가 1바이트 더 길어진다.
      • IA-32 실제 모드 상에서 20비트 주소 계산 에뮬레이션
        • 펜티엄 이후 IA-32 프로세서는 36비트 주소 연산을 원칙으로 함
        • 외부 하드웨어는 8086의 20비트 주소 공간을 시뮬레이션할 필요가 있음
          • 가장 단순한 하드웨어적 처리는 주소 PIN 36개 중 하위 20개만 사용

History

Last edited on 04/20/2007 20:30 by persona

Comments (0)

You must log in to leave a comment. Please sign in.