Computer Security

#10 x86 구조 (어셈블리 프로그램의 구성) 본문

컴퓨터구조&어셈블리어

#10 x86 구조 (어셈블리 프로그램의 구성)

쿠리 Kuri 2022. 5. 22. 18:30

메모리 모델

 -작성되는 프로그램의 코드와 데이터의 크기를 나타내기 위해 사용되며, 사용자는 프로그램 코드와 데이터의 크기에

해당하는 메모리 모델을 어셈블러에게 알려줘야 한다.

 -어셈블러에게 세그먼트를 사용하는 방법, 목적 코드를 위한 충분한 공간을 제공하는 방법, 최적의 실행 속도를 보장하기 위한 방법 등을 알려준다.

 -메모리 모델에는 Tiny, Small, Medium, Compact, Large, Huge, Flat 등이 있다.

    -Tiny는 주로 .com 프로그램에 대해 사용된다.

    -Flat은 32비트 보호모드에서 사용되는 메모리 모델이다.

 

                                 .MODEL     메모리모델 

 

 

SMALL :  -한 세그먼트에 저장할 수 있는 코드

             -한 세그먼트에 저장할 수 있는 데이터

 

MEDIUM : -한 세그먼트 이상에 저장할 수 있는 코드

              -한 세그먼트에 저장할 수 있는 데이터

 

COMPACT : -한 세그먼트에 저장할 수 이쓴ㄴ 코드

                -한 세그먼트 이상에 저장할 수 있는 데이터

 

LARGE :  -한 세그먼트 이상에 저장할 수 있는 코드와 데이터

            -64KB 이하의 배열

 

HUGE : -한 세그먼트 이상에 저장할 수 있는 코드와 데이터

          -64KB 이상이 되는 배열

 

 

 

 

.com 과 .exe

-둘의 중요한 차이: 프로그램의 크게, 세그먼트, 초기화

-.com 프로그램이 다소 기본적으로 제약이 많았던 초기 마이크로컴퓨터 시대에 뿌리를 두고있다.

-.com 프로그램은 명령어와 데이터 모두에 대해서 한 개의 세그먼트를 사용한다. 따라서 프로그램의 크기는 

 PSP(Program Segment Prefix)를 포함하여 최대 64KB로 크기가 제한된다.(메모리 모델로 tiny를 사용한다.)

-.com 프로그램은 PSP, 스텍, 데이터, 코드 세그먼트를 한 개의 코드 세그먼트로 결합한다. 따라서 .exe보다 단순한 구조를 가지고 있다.

-.exe 프로그램은 여러 개의 세그먼트를 가질 수 있다. .exe는 코드와 데이터, 스택을 서로 다른 세그먼트에 유지한다.

 

 

 

 

32비트 확장

 

80386(1985)

-최초의 IA-32 계열 프로세서

-32비트 레지스터와 32비트 데이터 버스, 32비트 주소 버스

-세그먼트:오프셋 주소 대신 32비트 선형 주소 사용

 

다양한 구동 모드 제공

-실제 주소 모드: 8086에서 사용하는 방식. 싱글 태스크, 20비트 주소를 사용

-보호모드:  멀티태스킹, 각 프로세스에는(물리 메모리 크기와 관계없이) 4GB의 선형 주소 공간 부여(가상메모리), 프로세스가 다른 프로세스의 코드와 데이터를 침범하는 것을 방지(메모리 보호)

-가상-8086모드: 보호모드 환경에서 DOS 프로그램과 같은 실제 주소 모드 소프트웨어를 실행할 수 있는 모드

 

 

확장된 레지스터

-레지스터가 32비트로 확장됨에 따라 기존의 레지스터 앞에 Extended라는 의미의 E를 붙여 EAX, EBX, ECX, EDX라는 이름으로 접근 가능하게 되었다.

 

 

간접 주소지정방식 확장

-8086에서는 간접 주소지정을 위해 베이스 레지스터 BX, BP와 인덱스 레지스터 SI와DI를 사용할 수 있었다.

-80386부터는 범용 레지스터 EAX, EBX, ECX, EDX 모두를 간접 주소지정을 위해 사용할 수 있다.

-배율  인자(scale factor)를 사용하여 오프셋을 계산하는 방법을 제공

     -OFFSET VALUE = BASE + INDEX * SCALE FACTOR + DISPLACEMENT

data

array D DWORD 100h, 200h, 300h, 400h

 

code

MOV ESI, 3

MOV EAX, arrayD[ESI*4]

Comments