본문 바로가기
MFC and C++

어셈블리어

by 연원랑 2022. 6. 16.

1) 80x86 계열의 역사

모델 8085 8086 8088 80286 80386 80486 Pentium Pentium-Pro
생산연도 1976 1978 1979 1982 1985 1989 1992 1995
클럭주파수(MHz) 3-8 5-10 5-8 6-16 6-33 25-50 60,66 150
트랜지스터의 수 6,500 29,000 29,000 130,000 275,000 1.2 백만 3.1백만 5.5백만
물리 메모리 64K 1M 1M 16M 4G 4G 4G 64G
내부 데이터 버스 8 16 16 16 32 32 32 32
외부 데이터 버스 8 16 8 16 32 32 64 64
어드레스 버스 16 20 20 24 32 32 32 36
데이터 크기(비트) 8 8, 16 8, 16 8, 16 8, 16, 32 8, 16, 32 8, 16, 32 8, 16, 32

  가) 캐쉬 메모리 : 마이크로프로세서와 메인 메모리간의 속도차이를 극복하기 위해 사용되는 메모리

  나) 수학보조프로세서 : 보조프로세서는 어떤 형식의 연산을 수행하면서 CPU를 돕는 특수목적용 처리 장치이다.

        수학보조프로세서는 수학적 계산, 특히 부동소수점 연산을 전문적으로 수행하며, 수치연산 보조프로세서 또는

        부동소수점처리장치 라고 불린다.

2) 8088/86 의 내부

  가) BIU 는 메모리와 주변기기에 access 하여 실행할 명령어를 읽어온다. EU는 읽어온 명령어를 실행한다.

  나) 큐(queue, buffer) : 읽어온 명령어를 보관하는 장소

  다) 파이프라인 : CPU 가 명령어를 읽어오는 것과 동시에 미리 읽어온 명령어를 수행하게 하는 것으로, CPU의 데이터 처          리 능력을 향상시킴. 자동차나 전자제품의 조립라인과 비슷한 작동원리.

  라) 레지스터 : CPU 내부에서 일시적으로 데이터를 저장하는 장소

3) 어셈블리 프로그래밍의 개요

  가) 종류

     A) 고급언어(High-Level Language) : Basic, Fortran, Pascal, C, Java 등

     B) 하급언어(Low-Level Language) : .어셈블리어

     C) 기계어(Machine Language) : 0 과 1의 숫자로 된 기계 고유의 언어

     D) 일반적으로 고급언어로 프로그래밍을 하는 이유는 고급 언어의 체계가 프로그램을 쉽게 작성할 수 있게 만들어졌기 때문이지만,

          컴퓨터의 하드 웨어가 프로그램을 이해하고 실행하기 위해서는 기계어로 변환 되어야 함.

  나) 어셈블리 언어 프로그래밍

     A) 어셈블리 프로그램 : 어셈블리 명령어로 구성

     B) 어셈블리어 : 0과 1로 된 기계코드를 대신하는 기호화 코드

     C) 어셈블리 언어를 사용하느 이유

        1) 고급언어로 작성된 프로그램에 비해 메모리 공간을 적게 차지하고 실행 시간도 짧다.

        2) 컴퓨터 하드웨어의 구성요소에 직접 접근하여 제어할 수 있다.

        3) 컴파일러를 설계하거나 시스템 프로그램을 작성할 수 있다.

     D) 어셈블리 언어를 공부하면 좋은 점

        1) 프로그램이 어떻게 운영체제, 프로세서, BIOS 와 동작하는지 알 수 있다.

        2) 데이터가 어떻게 표현되며, 기억장치와 외부장치에 저장되는지 알 수 있다.

        3) 프로세서가 어떻게 명령어에 액세스하여 실행시키는지, 명령어가 어떻게 데어터에 엑세스하고 처리하는지가 명확해진다.

        4) 프로그램이 어떻게 외부장치에 엑세스하는지가 명확해진다. 

     E) 명령어

        1) MOV : 데이터를 소스에서 목적지로 복사

        2) ADD : 소스 데이터를 목적지 데이터와 더한 다음, 그 결과를 목적지에 저장한다.

4)프로그램 세그먼트의 개요

  가) 종류

     A) 코드 세그먼트 : 프로그램이 수행해야 할 명령어들을 가지 고 있는 메모리의 한 부분

     B) 데이터 세그먼트 : 코드 세그먼트에 있는 명령어들이 처리해야 할 데이터를 저장하는 곳

     C) 스택 세그먼트 : 일시적으로 정보를 보관하는 곳

  나) 세그먼트의 시작 위치와 정의

     A) 메모리의 한 영역으로 최대 64K 바이트의 공간을 차지할 수 있다

     B) 시작 번지는 16으로 나누어 떨어져야 한다(즉, 0H로 끝나는 번지) 패러그래프경계

     C) 8088/86 에서 어떤 한 순간에 사용할 수 있는 메모리의 최대 용량은 코드 세그먼트(64K), 데이터 세크먼트(64K), 스택 세그먼트(64K)

     D) 8088/86 은 어드레스 버스 핀이 20 개로 1M 바이트까지의 메모리를 가질 수 있다.

  다) 논리 번지와 물리 번지

     A) 물리번지 : CPU 의 어드레스 핀에 출력되어, 메모리 인터페이스 회로에 의해( 절대 주소) 디코드되는 20비트 번지 RAM과 ROM의

                           실제 번지로 8086, 286, 386, 486CPU 에서 00000H ~ FFFFFH 의 값을 가진다

     B) 옵셋 번지 : 64K 바이트 세그먼트 범위 내에 있는 번지로 0000H ~ FFFFH 의 값을 가진다

     C) 논리번지 : 세그먼트의 값과 옵셋 번지로 결정된다

  라) 코드 세그먼트

      A) 프로그램을 수행하기 위한 명령어는 코드 세그먼트에서 읽어온다

      B) 명령어의 논리번지는 항상 CS와 IP로 구성되면 CS : IP로 표현된다

  마) 코드 세그먼트 내에서의 논리 번지와 물리 번지

      A) 코드 세그먼트에서 CS와 IP는 수행할 명령어의 논리 번지를 갖고 있다

      B) 데이터 세그먼트의 논리 번지와 물리 번지

      C) 엑스트라 세그먼트 : 여분의 데이터 세그먼트로 사용된다.

      D) IBM PC 의 메모리 맵

      E) BIOS 부트 프로세스

          1) 컴퓨터의 전원을 켜면 프로세스는 재설정 상태(reset state) 에 들어가게 되고, 모든 메모리 위치를 0으로 설정하고, 메모리의 페리티

              검사를 수행한다.

          2) CS 레지스터를 세그멘트 주소 FFFF[0]H로, IP 레지스터의 옵셋을 0으로 설정 -> BIOS 의 시작 주소 FFFF0H 로 설정된다.

          3) 위치 FFFF0H 에서 시작되는 BIOS 루틴은 컴퓨터에 부착되어 있는 여러 장치들을 인식하고 초기화하기 위해 각종 포트들을

              점검하고, 장치로부터 읽어들이고, 장치에 쓰는 데 사용되는 서비스들을 제공한다.

          4) 다음으로 BIOS의 아래의 두가지 데이터 영역을 설정한다.

          5) 다음에 BIOS는 시스템 파일을 포함하고 있는 디스크가 존재하는지를 판단하고, 그 디스크의 부트스트랩 적재기에 접근한다.

          6) 이 적재기는 디스크의 시스템 파일을 메모리에 적재하고, 제어를 시스템 파일에 남긴다.

      F) 시스템 프로그램 적재기

          1) - BIOS가 운영체제에 제어를 넘기면 사용자가 프로그램의 실행을 요청할 수 있다. 실행 가능한 프로그램.

          2) 시스템 프로그램 적재기의 동작

  바) 80x86의 세그먼트

      A) 스택 : CPU가 일시적으로 데이터를 보관하기 위해 사용하는 RAM의 한부분

      B) 스택이 필요한 이유 : CPU가 가지고 있는 레지스터의 수에 제한이 있기 때문 (설계시 비용 문제)

      C) 스택의 엑세스

          1) SS와 SP레지스터가 스택에 접근하기 위해 사용된다. (IP가 동작하는 것과 반대방향)

            가) PUSH : 레지스터의 값을 스택에 저장. SP의 값 감소

            나) POP : 스택으로부터 레지스터로 적재. SP의 값 증가

          2) 범용 레지스터를 PUSH또는 POP 할 때 레지스터는 항상 16비트 레지스터 이어야 한다.

          3) 컴퓨터의 명령어 부분과 스택 부분이 서로 겹치는 것을 방지하기 위해

            가) 두 레지스터의 값들은 RAM의 양 끝네서 시작

            나) IP 는 점점 커지고, SP는 점점 작아진다.

      D) 오버레핑

          1) 물리번지의 계산에서 주 개의 세그먼트가 서로 겹치는 경우 COM 파일에는 오버레핑이 이용된다.

 

      F) 플래그레지스터 : 상태 레지스터라고 불리는 16비트 레지스터

    G) 세그먼트 오버라이드

        1)  80x86 CPU 에서 프로그램이 디폴트 레지스터를 오버라이드해서 다른 임의의 세그먼트 레지스터들을 이용할 수 있다.

        2) 세그먼트 오버라이드의 예

    H) 80x86의 어드레싱 모드 요약

'MFC and C++' 카테고리의 다른 글

Dump 파일로 디버깅 하기  (0) 2022.06.16
Window program의 기본 개념  (0) 2022.06.15

댓글