X86 명령어 세트 - X86 myeonglyeong-eo seteu

이 안내서는 사용 가능한 명령어 및 어셈블러 지시문의 작지만 유용한 하위 집합을 다루는 32비트 x86 어셈블리어 프로그래밍의 기본 사항을 설명합니다. x86 기계어 코드를 생성하는 데는 여러 가지 어셈블리어가 있습니다. CS216에서 사용할 것은 Microsoft 매크로 어셈블러 (MASM) 어셈블러입니다. MASM은 x86 어셈블리 코드를 작성하기 위해 표준 Intel 구문을 사용합니다.

전체 x86 명령어 세트는 크고 복잡합니다 (Intel의 x86 명령어 세트 설명서는 2900 페이지 이상을 차지합니다). 이 안내서에서는 이 명령어를 모두 다루지 않습니다. 예를 들어, x86 명령어 세트의 16비트 하위 집합이 있습니다. 16비트 프로그래밍 모델을 사용하는 것은 상당히 복잡할 수 있습니다. 이것은 세그먼트화 된 메모리 모델을 가졌기에 레지스터 사용에 있어 더 많은 규제들이 존재합니다. 이 가이드에서 우리는 x86 프로그래밍의 보다 현대적인 측면에 주의를 집중하고 x86 프로그래밍에 대한 기본적인 느낌을 얻기에 충분하도록 자세하게 명령 집합을 살펴보겠습니다.

자원
• Visual Studio에서 어셈블리 사용 안내서 - Visual Studio에서 어셈블리 코드 빌드 및 디버깅에 대한 자습서
• Intel x86 명령어 세트 참조
• 인텔의 펜티엄 매뉴얼 (전체 세부정보)

레지스터
현대의 (예 : 386 이상) x86 프로세서는 그림 1에서와 같이 8개의 32비트 범용 레지스터를 가지고 있습니다. 레지스터 이름은 대부분 역사적입니다. 예를 들어 EAX는 여러 산술 연산에 사용되었기 때문에 누적기(accumulator)라 불립니다. 또한 ECX는 loop index를 유지하는데 사용되었기 때문에 카운터(Counter)라고 합니다. 대부분의 레지스터가 현대 명령어 세트에서 특별한 목적을 잃어버렸지만, 협약에 의해 두 개는 특별한 목적으로 예약되어 있습니다. 스택 포인터 (ESP)와 기저 포인터 (EBP)입니다.

EAX, EBX, ECX와 EDX 레지스터를 위해 하위 섹션이 이용될 수 있습니다. 예를 들어, EAX의 최하위 2byte는 AX라고 하는 16비트 레지스터로 간주될 수 있습니다. AX의 최하위 byte는 AL이라고하는 단일 8비트 레지스터로 사용될 수 있으며 AX의 최상위 byte는 AH라고하는 단일 8비트 레지스터로 사용될 수 있습니다. 이 이름은 실제 레지스터 이름과 동일합니다. 2byte 량이 DX에 배정되면, 업데이트가 DH, DL, EDX의 값에 영향을 줍니다. 이러한 하위 레지스터들은 주로 이전 16비트 버전의 명령 세트로부터 이월되었습니다. 그러나, 32비트보다 작은 데이터 (예 : 1byte ASCII 문자)를 다룰 때 편리합니다.

어셈블리어에서 레지스터를 참조할 때 이들의 이름은 대/소문자를 구별하지 않습니다. 예를 들어, EAX와 eax는 동일한 레지스터를 나타냅니다.

메모리 및 주소 지정 모드
정적 데이터 영역 선언
이 목적을 위해 특수 어셈블러 지시문을 사용하여 x86 어셈블리에서 정적 데이터 영역(전역 변수와 유사)
을 선언할 수 있습니다. 데이터 선언들은 .DATA 지시문이 선행되어야 합니다. 이 지시문에 따라 지시문 DB, DW 및 DD를 사용하여 각각 1byte, 2byte 및 4byte 데이터 위치를 선언할 수 있습니다. 선언된 위치는 나중에 참조할 수 있도록 이름으로 레이블 할 수 있습니다. 이것은 이름으로 변수를 선언하는 것과 유사하지만 일부 하위 규칙을 따르고 있습니다. 예를 들어, 순서대로 선언된 위치는 서로 옆에 있는 메모리에 위치합니다.

배열이 많은 넓이를 가질 수 있고 index로 액세스 할 수 있는 고수준 언어와 달리 x86 어셈블리어의 배열은 단순히 메모리에 연속적으로 위치한 셀 수입니다. 배열은 아래 첫 번째 예제와 같이 단순히 값을 나열하여 선언할 수 있습니다. 데이터 배열 선언에 사용되는 두 가지 다른 일반적인 방법은 DUP 지시문과 문자열 리터럴의 사용입니다. DUP 지시문은 주어진 횟수만큼 표현식을 복제하도록 어셈블러에게 지시합니다. 예를 들어, 4 DUP(2) 는 2, 2, 2, 2 와 같습니다.

x86은 인텔에서 개발한 8086에 적용된 명령어 세트이자 그 호환 프로세서 또는 후속작을 부르는 말이다. 8086은 1978년 출시되어 40년이나 된 오래된 명령어 세트이지만 이후에 출시되는 프로세서들은 8086의 명령어 세트를 기반으로 하여 확장된 것이다.

x86 또는 80x86이라는 이름은 여기에 속하는 초기의 프로세서들 이름이 모두 80으로 시작해서 86으로 끝났기 때문에 붙여졌다. 여기에는 8086, 80186, 80286, 80386, 80486이 포함된다.

XT, AT… 286 그리고 16bit

Ref. 추억의 삼보 Trigem XT와 AT

1978년 인텔이 최초의 16bit CPU인 8086 을 발표했고, 다음 해에 8088 CPU를 발표 했는데 IBM에서 공개형 PC표준 IBM-PC XT의 메인 CPU로 8088을 채택하면서 PC의 역사가 시작 되었다.

이때 설계된 16비트 CPU 내부 8086 명령어 체계를 x86 아키텍처(x86-IA16)라고 불렀으며 ​이후 1982년에 80286 출시하면서도 계속 호환 확장 되었다.

386, 486 32bit

1985년, 인텔은 32비트 CPU인 80386을 발표 한다. ​ 80386 의 경우 기존 16bit 80286 체계를 완전히 버리고, 32bit CPU 명령세트 및 기초를 새롭게 만든 것이며 ​이것을 x86-IA32 (Intel Architecture-32) 라고 공식 명명합니다. 일반 사용자들이 386 PC 라고 부르는 시초 이다..

386 PC 는 SX 와 DX 라는 형태로 공개되었다. DX 는 32bit 로 작동 되었으나 SX 는 16bit BUS 로 32bit 에뮬레이션하는 저가형 모델 이었다

이후에 발표한 인텔의 후속 32bit CPU들 - 인텔 80486, 80586(펜티엄), 펜티엄프로, 셀러론 등등 뿐 아니라 경쟁사의 CPU들(AMD, Cyrix 등) 모두 역시 이 x86-IA32 명령체계를 호환하여 표준으로 채택했습니다.

BUS Interface

컴퓨터 내부에는 CPU, HDD, RAM, 그래픽카드 등의 주요 부품이 존재하며 이들은 서로 데이터를 주고 받으며 동작하는데 이때 데이터를 주고 받기 위한 매개체가 I/O 버스 이다. CPU 는 I/O 의 통신방식을 이해하여야 하며 이 역할은 버스인터페이스 가 담당한다.

Pentium

펜티엄은 i586 또는 80586이라는 이름으로 출시될 예정이었는데, 486에 대한 인텔의 상표권 침해 소송에 AMD와 Cyrix, IBM을 비롯한 호환 CPU 제작 회사들이 ‘숫자에 상표권을 주장할 수 없다’ 는 주장을 법원에서 인정해 패소하면서 펜티엄이라는 상표로 출시했다. Penta + Premium 식의 합성어 이다

펜티엄은 기존에 발표되는 다음 세대 CPU 와는 다르게 월등한 성능을 보여주지는 못했는데 CPU 클럭이 높은 486 DX4 100 의 경우 펜티엄 초기 모델과 비슷한 성능을 발휘 했었다.

현재 PC 를 구매할때 CPU 들을 보면 마치 자동차 모델명과 같이 되어있고 펜티엄 이라는 이름은 쓰고 있지 않습니다만 실제 제품명은 펜티엄으로 분류 되기는 합니다.

//namu.wiki/w/인텔 펜티엄 시리즈

x86-64

x86-64는 x86 명령어 집합 아키텍처의 64비트 모임이다. x86-64 명령어 집합은 에뮬레이션 없이 인텔의 x86를 지원하며 AMD64로 이름 붙인 AMD에 의해 고안되었다. 이 아키텍처는 인텔64라는 이름으로 인텔에 의해 복제되기도 했다. (옘힐, IA-32e, EM64T 등으로 불렸음) 이로써 x86-64 또는 x64의 이름을 일상적으로 사용하기에 이르렀다.

AMD는 x86의 호환을 염두에 두고 64bit 확장을 계획했고, 인텔은 x86 의 문제점을 버리고자 64bit 로 단절적 이행을 검토하고 있었다. AMD 가 먼저 x86-64라는 이름으로 64bit 확장 x86 명령어 셋을 발표하였으며 이것이 후에 업계 표준이 되었다.

AMD64 라고도 불리는 x86-64 는 시장의 인기를 끌게 되었고 인텔도 뒤늦게 합류하게 된다. 인텔은 IA-64 로 차세대 64bit 프로세서를 계획하고 있었고 실제 아이태니엄 프로세서는 x86 호환성이 없다. 인텔은 그당시 프레스캇이라는 코드명의 프로세서를 준비하고 있었는데 인텔 내부의 오레건 설계팀에서 경영진에게도 비밀로 하고 x86-64를 지원하는 얌힐 이라는 코드명의 프로세서를 개발하기 시작했다.

2003년에 x86-64 기반의 64bit 애슬론 프로세서가 인기를 끌게 되었고 인텔은 2004년에 발표한 후기 프레스캇에 x86-64 를 지원을 대외적으로 발표 했는데 사실은 초기 프레스캇 즉 얌힐부터 포함되어 있었다는 의문이 끊이질 않았다.

ARM

1985년 PC용 RISC를 개발한 캠브리지 대학의 연구진이 새로 개발된 RISC를 PC 시장에서 상용화하기 위해 Acorn Computer Group을 세우고 ARM(Acorn RISC Machine)이라는 이름으로 벤처기업을 세운 게 시발점이다

ARM 11을 출시하면서 Cortex 라는 아키텍처를 사용하고 고속연산, 저전력을 무기로 현재 다양한 산업 분야에서 사랑 받고 있다. (퀄컴 스냅드래곤, 삼성 엑시노스, 애플A 등)

관련 게시물

Toplist

최신 우편물

태그