watcom c/c++ 이용한 32bit Protect Mode Game 프로그램

들어가면서...

<하드웨어적 요구사항>

IBM PC 386 이상(메모리 8M) ,154메가 하드 디스크 공간(FULL INSTALL)

CD-ROM 드라이브 사용가능

<O/S>

DOS 5.0 이상, MS-WINDOWS 3.1 (ENHANCED MODE)

IBM OS/2 2.1,  MS-WINDOWS NT 3.1

<생성 프로그램 >

16비트: 도스용, 윈도우즈 3.X 용, OS/2 1.x 용

32비트: 확장도스(DOS/4G,PHAR LAP)용, 윈도우즈 NT용 OS/2 2.x 용, 32비트 윈도우즈 3.x,            노벨 NLM 용, 오토캐드 ADS/ADI 용개발지원툴

<기타 지원 사항 >

WINDOWS 3.1 SDK 포함

WINDOWS NT SDK

Novell NLM SDK v4.0

IBM OS/2 Toolkit v2.1

Microsoft MFC Class library

도스확장자 :  Rational System's DOS/4GW (royalty-free)

Chapter 1. Tool 의 사용법

1-1. 컴파일러 종류

wxx386  [옵션] {화일명}

:옵션과 파일명은 뒤바꿔도 상관없다

ex>

wcc386 →C   전용컴파일러

wpp386 →C++ 전용컴파일러

wcl386 →통합  컴파일러 (화일명에 확장자 없으면 같은이름을가진 파일의 확장자에따라 구분함 *.cpp , *.hpp 는 c++,   *.c , *.h 는  c 로..... 볼랜드같이 멍청하게 무조건 .cpp 인식 하지않는다 .)

※뒤에 386 이라는말이 있으면 32 bit 컴파일러 이고 없으면 16 bit 겠지(당연..!!)

※hpp 와 h 의 차이: 일반적으로 hpp 는 컴파일시 c++ 포멧의 오브잭트 화일로 컴파일되고, h 는   c 포멧의 오브잭트화일을 생성한다.그러므로 헤더화일만 미리컴파일시켜 링크할때는(시간절약을 위해) 각별한주의를 해야한다,

※ 환경변수지정

!! 꼭 지정해야할 환경변수 요거않하면 컴파일않됨

set watcom=<watcom c/c++ main diretiry>

set include=<헤더화일이 들어있는 diretory>

(주의!!! 환경변수 지정시 위와 같이 □=□ 로 공백이 없어야한다, 만약 공백이 있을경우 원하는 결과가 나오지 않는 수가있다,컴파일러 버그같다)

set wcl386= -mf -l=DOS4G

:컴파일 시 자동으로 스위치가 지정됨

set quite=false

:실행시 지겨운 dos4gw 메시지가 없어진다

set DOG4GVM=<화일명 >

:가상메모리를 잡아준다 파일의 내용 에는 minmem maxmin swapmin swapinc sawpname deleteswap virtualsize 등이있다

ex>16메가의 가상메모리 얻기

minmem=2048

maxmem=4096

swapmin=1024

swapinc=512

swapname=<스왑화일명>

deleteswap

virtualsize=1600000

1-2. 커멘드라인 옵션

□들어가기전에 알아들것: 옵션 앞에 □-□ 하고 □/ □ 같다, 차이점은 모르겠다 옵션앞에 아무거나 붙여                        주면된다.

{, , ,} 표시는 안에 있는것중 1택

[] 생략가능

<> 문장이나 숫자를 기입하는란 기입 않하면 디폴트값

□하드웨어 관련 옵션

♠m{f,s,m,c,l,h}	:f 는프렛트 모델이고 나머지는 16비트의 그것과 같은개념이다,플랫모델은 뒤에  서 설명함

♤0~5	:16비트 명령어사용 지정  그러니까 3이면 386 4면 486 주의할점은 16비트코드임

♠3r ~ 5r : 각 ?86 씨피유 타이밍에따라 ?86 코드생성 ,그리고 또레지스터 기반인자전달 디폴트	는 뭔지모름 난 -4r 로쓴다

♠3s ~ 5s : (3r ~ 5r)과 같지만 차이점은 스택기반전달이다.

♠l=<system_name> :  링크할 시스템 정의 해준다 디폴트가 386 이다.

286

386 : DOS4G 와 같다

DOS4G : 이것도 모르면서 와컴을 쓰나??

PHARLAP :씨멘택 씨에서도 쓴다는 파렙 도스확장자

QNX :이런 확장자도 있구나...

DOS: 이건 확장자 아니겠지

COM :콤화일형식 실행화일 생성 (티니형이 없으니까 이렇게 지원하나?)

WINDOWS: 창문들???

CODEBULDER:인텔에서 쓴다고 하던데...

참고로 이상의 이름들은 왓컴일커 설정화일(wlsystem.lnk)에정의된 시스템들이다

♠s : 스택 오버플로우 체크 않하기

♠k<stack_size>:스택크기 설정.   누가그러는데 디폴트가 -k4096

□컴파일러 정의 옵션

d<>[=값] : #define 정의

u<> : #undef

nc=<>:class 이름

nd=<>:data segment 이름정의

nm=<>:모듈이름 정의 파일명과 관계없음

nt=<>:text segment 이름정의

□기타

♠w<num >: 경고메쎄지 레벨정의

♤z{a,e}:언어 확장 (불인정/인정)

♤zk:음 한국을 위해서 2바이트 캐릭터형이라 한국의 위상이높아지긴 높아졌군..

♤j:와컴씨의 디폴트 캐릭터형은 절대값(unsigned char)이나 이옵션을 쓰면 signed char 로바꿈

♤zp{1,2,4,8}:스트럭쳐 페킹(정열(alignment ) 해주는옵션) 선언

♠c:컴파일만 한다

♠y:컴파일러를 위한 환경변수 무시

♠o:최적화 형태지정 {a,c,d,e,f,i,l,m,n,o,p,r,s,t,u,x}

♤ i: include 파일 디랙토리 추가지정 근데 -l 은 라아브러리 디렉토리 지정 같지만 그렇지않다	(링크할 OS 이름지정이다)  그럼 라이브러리지정은 어케하지..?  pragma는 바로이럴때쓴	다.

□ target 지정

bd

bm

bt=[<os>]: 다름운영체제용 실행화일 만들때(cross-development)

of: 호출을담거나 또는 스택프레임을 요구하는 함수들에대한 추적가능한 스택프레임의생성을 선택한다 선정의(predefine) 문은 __SW__OF 이다

sg:

□디버깅 정보관리

en:컴파일러가 함수머리부분순서가 생성되기 바로전에 문자열로써 오브잭트코드로 함수이름을 방출한다, ROM 기반 어플리케이션제작시 사용.

d1: 줄번호 디버깅 정보가 오브잭트화일에 포함(그대신 실행화일과 오브잭트화일이 커진다) 줄번호는 디버거로 소스레벨 디버깅할때 편리하다.

d1+:(c에서만사용) 줄번호 정보에 전역변수, 지역구조체와 배열을 위한 typing 정보를 추가한다

※d1,d1+는 strip 유틸리티로 제거하기때문에 재컴파일필요없다 코드사이즈는 늘어나지만 실행속도에 영향은 않준다

d2:줄번호정보에 추가해서 local symbol 과 자료형의정보를 포함한다 grobal symbol 정보는 linker 옵션으로도 가능하나 local symbol 정보는 소스컴파일시 만들어진다. 만약 □d2□가주어지면 디폴트로 컴파일러는 최적화옵션으로 □od□를준다

d3:d2 와동일하나 그러나 참조되지않은 type 이름에 대한정보까지 포함한다 그래서 헤더화일이 덩치가클경우 실행화일도 덩치가 커질수있다

ee:모든함수의 끝부분에 __EPI에대한 호출을 생성한다, 이루틴은 prfileing 정보를 수집기록하는데 사용된다

ep[<number>]:모든함수의 도입부분에 __PRO 에대한 호출을 생성한다 이루틴은 prfile 정보를 수집 기록하는데 사용될수있다 <number>은 __PRO가 저장할 정보를 위한공간으로써 스택상에 얼마만큼의 바이트를 할당할것인가이다

h{w,d,c}:디버깅 정보의 포멧설정

w->watcom

d->dwarf

c->codeview

만약 codeview 로 하고 싶으면 □hc□옵션해주고 또한 거기에 맞는 Watcom Linker DEBUG directive 를 선택해야한다

s:생성된 코드로부터 스택오버플로 검사가 생략된다 디폴트로 컴파일러는 스택오버플로 상태를 검사하는 코드를만든다 이옵션은 그기능을 제거하는것이다 □s□ 하면 __SW_S 가 predefine 된다

□선행처리기

d<name>[=text]: #define 문과 똑같다

ex> /d_satan 666  → #define _satan 666

d+:수식계산도 가능

ex> /d+ /d_rad(x)=x*2  #define _rad(x) x*2

fo=<file_name>:선행처리기 출력화일 이름 정하기

p{l,c,w=<num>}:

c->왓컴의 선행처리기 출력화일이 원본소스 코멘드를 포함하는걸 원할때

l->왓컴의 선행처리기 출력화일이 #line directives(소스화일의 줄번호를 이용해 진단한	다) 를 포함시킬때  ※cl,lc로 동시에 지정가능

w=<num>: <num> 갯수만큼 소스화일의 columns(열)을 감춘다

※왓컴의 선행처리기가 요구되어질때 지원되는 옵션들로는 d,fi,fo,i,m?,u 가있다

u: #undef  문과 같다

□진단

e<num>:정해진 갯수만금의 에러가 났을때 컴파일중지

ew:error 메쎄지 형식을 바꾼다

w<num>:경고 레벨을 정한다 (엄하다)1 ~ 3(약하다),w0는 무경고,wx는 최고수준경고

we:디폴트로 경고메쎄지가 나오도라도 컴파일은 계속되지만 이옵션을 주면 에러로 간주해서 컴파일을 중지한다

wo:

za: ANSI 표준규약을 지키는 컴파일을한다 ze와는 반데의 개념이다

ze: 디폴트로 지정되는 옵션, 밑에나오는 컴파일러 확장을사용한다

1.한개이상의 외부선언을 완화시킨다

2.무시해도상관 없는 포인터 에러는 경고로 간주한다,(C 에서)

3.인라인수학함수 허용한다

4.불분명한 구조체와 공용체허용

ex>

struct {

int a;

union {

int b;

float alt_a;

}

int c;

} x;

5. c에서 ANSI 의 함수선언과 스코프 규정을 완화한다

ex> void lee (struct a k)

struct a {

int b;

int a;

};

void bar(void)

{

struct a x;

lee(x);

}

원래 규정은 함수선언은 세미콜론으로 끝나는 곳에서 새로운 스코프를 소개한다 이것의 효과는 함수 lee 안에있는 구조체 태그 a가 선언후정의된 같은구조체 a가 아니라는것이다

6.enum 문네서 마지막에,가오는것을 허용한다,enum 기초자료형이 int 라는 규약을완화한	다 대부분프로그램에서 int 만큼의 수는필요없다 그래서 때에따라서 unsigned char	을쓴다

7.비트필드도 ANSI에서는 int 형에기반을둔다 이것도 완화시킨다

ex>struct {

unsigned char a:1;

unsigned char b:1;

unsigned char c:1;

}x ; 위의 예는 bitfiled 는 unsigned char형 만큼 할당된다.

8.다음의 비표준 매크로정의 가있다

near,far,huge,cdecl,pascal,fortran,interrupt,export,loadds,saveregs

zq:에러, 경고 메쎄지를 제외하고 출력하지않는다

zs:소스화일만 검사하고 오브잭트화일은 생성하지않는다 소스를 검사하는데 사용

□precompiled

db:

ez:파럽 OMF (Object Moudle Format) 생성

fh[q][=<file_name>]:precompiled header(컴파일 시간을 단축시키기위해서 여러모듈이 같은헤더화일을 포함할경우 시간낭비이므로 헤더화일만 미리컴파일한다)

fi=<file_name>:지정한화일을 include 한다 #include "<file_name>" 과 같다.

fo=<file_name>:출력할 오브잭트 화일이름지정

i=<directory>:include 화일을 찾는 디랙토리 리스트에 <directory>를 추가한다.

v:

zg:

ex> typedef unsigned int UI

UI f(UI x);

v→ extern UI f(UI);

zg→ extern unsigned int f(unsigned int);

zl:화일이름에 대한 참조를 포함하지않는 object 모듈의 라이브러리 만들때사용

zld:make 시 종속성검사등에 사용하는 시간등의 정보를 생략한다.

-코드생성-

ei:enum 이 int 형을 쓰도록한다

j:char →unsigned char(default) 를 signed 로바꾼다.

ri:char,short형 반환을 int형으로한다.

zc:코드세그먼트에 const,문자열 변수를 집어넣는다

zt:data threshlod 옵션(16bit)

fpc:부동소수점 라이브러리 호출

fpi:에뮬레이션 사용한 x87 명령어 수행,디폴트값,실행시간에 코프로세서 필요없다

fpi87:에뮬레이션없이 x87 명령어 수행,실행시간에 코프로세서필요

fp[{2,3,5}]:287,387,펜티엄

7:387 수치 데이타 처리명령어를 오브잭트 코드안에 생성시킨다

g=<code group>

nc=<name>:

nd=<name>:

nm=<name>:

nt=<name>:

zm: 모든함수를 각각 다른 segment 에 위치시킨다.

□최적화

※최적화 옵션은 한번에 여러개 줄수도 있다 맨앞에 'o'한뒤 되에서 해당옵션들 나열 , o???.....

a:별명 제한 완화

c:최적화를 위해서 ret 대신 jmp 쓴것을 무효화시킨다, 마이크로링커나,터보링커 사용시 해주는 옵션이다

d:모든최적화 중지,최적화 하면 디버깅하기 어렵다, □d2□ 옵션 선택시 디폴트로 기동한다.

e[=<num>]: 사용자가 만든 함수를 인라인함수로 확장한다 <num>은 인라인함수의 최대크기를 지정한다, quad(4word) 단위이다.

i: 특정한 라이브러리 함수를 인라인으로만든다, 먼저 함수의선언이 되어있는 헤더화일을 include 해주어야한다

가능한 함수(32 bit 기준): abs,_disacle,div, _enable, fabs, _fmemchr, _fmemcpy, _fmemset, _fstrcpy, _fstrcmp, _fstrlen, labs, ldiv, _lrotl, _lrotr, inp, inpw, memchr, memcmp, memcpy, memset, movedata, outp, outpw, _rotl, _rotr, strcat, strchr, strcpy, strlen

l: loop 최적화옵션

m:수학함수(X87)을 인라인 함수로 확장,acos,asin,atan,cos,sin,tan,cosh,sinh,tanh,log,log10,fabs,fmod

,sqrt,exp(ot 옵션이 주어졌을때),pow

n: 부동소수나누기를 다른방법으로한다  속도는 빠르나 부정확하다.

o: 메모리가 부족해도 컴파일 강행,디폴트는 중지

p: 정밀한 부동소수점계산

r: 최상의 파이프라인을 위한 명령어기록

s: 되도록 짧은코드 생성

t: 되도록 빠른코드 생성

u: 모든함수는 각각의 고유번지를 가진다

x: /omiler /s 와같다 , /oneatx /zp4 최상의속도를 가진 코드를 생성한다.

1-3. 확장키워드

함수의 시스템종속적인속성 과 다른객체명을 표현 하기위해 사용된다 이들속성은 인텔의아키택쳐와 종류가 다양한함수호출규약들에 의해필요성이 생겼다 ANSI 를지키기위해 왓컴은 앞에" __" 가 붙는 소문자로된위드를 사용한다 다른 컴파일러와 호환을 위해 교체 가능한 형태의 키워드는 선정의 매크로를 통해 지원되어진다

__near: near 메모리에 있는 함수와 그밖의 객체를 나타냄 선정의 매크로 _near, near 은 모두같다

__far:  far 메모리에있는 함수와 그밖의객체를 나타냄 _far, far 와같다

__huge:32 bit 에서는 far 와같다

__based:

1-4. pragma  (프라그??)

※대체 프라그마가 뮈지? 이 않닦으면 끼는 물질인 프라그?, 치석의 일종인가? 그렇지않다,다음과같은 편의를 제공하는 컴파일러 지시자이다.

1.컴파일러 옵션을 더욱 자세히 설정하도록 허용한다

2.디폴트값과 다른 매개변수와 리턴값을 사용하는 기법을 가진 함수호출에대한 코드의 특정화된 순서를 방출하는 코드새성기를 지시하는데 사용된다(직역은 힘들어~~~)

3.씨와 씨뿔뿔 언어 수준에서 불가능한 함수의 특징을 정의하는데 사용될수있다, 코드생성기는 이정보로 더욱 효율적인 코드를 생성한다

4.도스와 바이오스 함수호출이 포함된 인라인 어셈의 어떤 결과물도 오브잭트화일로 생성될수있다(인라인어셈가능케함)

(옵션정의,디폴트링크라이브정의,메모리 팩킹지정,코드생성의 부차적정보제공..)

◎옵션정의에대한 pragma 사용

1.unreferenced :컴파일러가 비사용기호에대해다루는방식을정한다

ex>#pragma on (unreferenced); // 모든비사용기호에 대해 경고메쎄지를 출력한다

반데는 #pragma off (unreferenced); 이다

2.check_stack :스택오버플로우감시

정상적 스택오버플로우란?:재귀함수를 쓸때 발생할수있으며,그렇지않을때는 조금씩 스택크기를 늘려야한다(단 버그프리일때).

여러개를 동시에지정가능하다

ex>#pragma on (check_stack unreferenced);

◎디폴트 라이브러리 지정

만약 자신의 라이브러리를 디폴트라이브러리와 함께 넣고싶다면

#pragma library(mylib); 또는 풀패스네임

#pragma library("d:\wat\mylib"); 또는 여러개 동시정의가능

#pragma library(mylib yourlib);

◎packing 정의 :구조체들이 메모리에 저장되는 방식을 조절하는데 사용된다 디폴트로 왓컴은 모든 구조체와 필드들을 byte 단위로 align 한다

문법 : #pragma pack '('num')' [';']

ex>#pragma pack(1)

.......(구조체선언)

#pragma pack()

num 값은 1,2,4,8 이다

size of(member)	zp1	zp2	zp4	zp8
1	0	0	0	0
2	0	2	2	2
4	0	2	4	4
8	0	2	4	8
x	가장큰구조체구성원에의해정렬

1> 0은 정렬하지않는다는 뜻임 2는 word 4는 dword 만약 가장큰구조체의 구성원이 2byte 라면 □x□란의 내용은 □2□란의 낸용과 같다

2> 괄호안에 암것도없으면 디폴트값1이다 단,디폴트값은 zp option 에따라 변경된다

※zp<num> : 최소 스트럭쳐패킹 설정

◎alloc_text: 실행코드와 함수의 목록들이 그안에 들어갈 text segment 이름 설정하는데 사용된다

문법 : #pragma alloc_text  '(' 세그먼트이름 '(' 함수이름 { ',' 함수이름} ')' [';']

ex>	extern int fn1();

extern int fn2();

#pragma alloc_text(my_text,fn1,fn2);

이렇게하면 선언한 함수들이 my_text segment 에위치한다 단, 함수선언은 alloc_text 설정하기 전에 나와야한다

◎intrinsic: intrinsic 속성이 셋팅되면, oi옵션을 주면 intrinsic 속성을 가진함수가 in_line 함수로된다, 인라인함수에 대해서는 C++ 서적을 참고하라.

ex> #pragma intrinsic(sin)

double test(double x)

{

return (sin(x)); 표준 sin 함수가 인라인함수로 되어서 속도향상을 꾀할수있다.

}

Chapter 2. 보호모드란?

2-1.WATCOM 의 메모리형

●코드형종류와 데이타형종류

○small code model: 만약 이 모델에서 함수를 호출한다면 근거리호출로써(neaar call) 목적지주조는32 bit 이다 그래서 모든코드(당신의 프로그램과 라이브러리 함수를포함) 4GB 이하여야한다 (제약이라하기엔 너무황당하군 어케 코드길이가 4GB 가 넘을수있지 그런게있다면 로딩하려다 볼일다보겠군)

○big code model: 모든함수는 원거리호출로 되어있고 목적지주소는 32(offset)+16(segment) bit 로 되어있다 4GB 이상의 프로그램이 가능하다

○데아타형도 비슷한개념으로 이해하면된다.(small data model, big data model)

※:만약 4GB 이하의 프로그램을 작성한다면 small code model(32 bit) 을 체용하는  메모리모델을 써야한다 왜냐하면 작고빠른코드가 생성되기때문이다(16 비트 에서 tiny ,small model 처럼 된다 64K 가 하루아침에 4GB 로 뻥튀기(?)...)

●메모리형은 코드형과 데이타형의 결합으로 이루어진다 flat, mideum 형만 예를들자면

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□메모리형  □code model□data model  □default code pointer □default data pointer□

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□flat      □small     □small       □near                 □near                □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

□mideum    □big       □small       □far                  □near                □

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

※참고로 tiny 형이 하나의 세그먼트에 모든게 들어가므로 flat형은 32bit 의 tiny 형이라고보면 좋을것이다. 32 bit 에서 하나의 세그먼트(실재로는 16bit와 개념상 좀다르다 )의 크기는 4GB이다.

※flat 형에서는 메모리크기가 4GB 이하이다 그러므로 모든세그먼트 레지스터들(cs,ds,es,ss)은 같은 선형주소공간을 가리킨다(단 이것은 세그먼트 레지스터값이 모드같다는 의미가 아니므로 오해없기바란다,그리고 와컴(dos4gw)에서만 적용되는 개념이므로 다른 컴파일러에서는 다를수도있다)그러므로 어떤 세그먼트에서 주어진 오프셑값은 또다른 세그먼트에서 주어진 그오프셑값과 동일한 메모리영역을참조한다 그래서 마치 세그먼트레지스터가 없는것처럼 동작하므로 세그먼트레지스터를 함부로 건드리지 않는게 좋다.

ex> mov es:di,xxxxx

※혼합메모리형이란게 존제한다 나도 말만들었지 자세한건모르겠다 여러 종류코드와 데이타형을 한데 묶는개념이다 특징으로는 near, far, huge 등의 keyword 가 mixing 해서 쓰인다는것이다. 약간의 far pointer를 쓰는 mideum 형을 예로들자면 이러한 응용프로그램에서는 대부분의 데이타는 4GB segment(DGROUP) 안에있다 그러므로 대부분 near pointer 형으로 참조된다, 만약 DGROUP 외부에 있는 데이타객체는 far keyword로 표현될수있다. 여기서 DGROUP는 디폴트로 정해지는 데이타세그먼트이름이다,dos4gw는 메모리를 최대 4GB까지만 허용이므로 위와는 무관하다

●실행코드의 메모리구조

※□DOSSEG□링커 옵션을 쓸경우이다 실행화일의 위에서 0부터시작

0 ~

1

2

3

4

5

6

7

~ EOF

1.모든 USE16 segment

※이들은 실보드와 보호모드양쪽에서 실행되는 응용프로그램에서 존재하는것이다 이세그먼트들은 순서상 맨처음이다. 그이유는 □RUNTIME□ directive 의□REALBREAK□ 옵션이 응용프로그램의 보호모드부분에서 실모드 부분을 분리하는데 사용될수 있도록 하기위해서이다, 일반적으로 □RUNTIME□ directive 는파렙의실행화일에서만쓰인다

2.□CODE□ class 이고 DGROUP 에 속한 모든세크먼트

3.DGROUP 에속하지않은 모든세그먼트

4.□BEGDATA□이고 DGROUP 에속하는모든세그먼트

5.□BEG□,"BSS","STACK" CLASS 가 아닌 모든 DGROUP

6.□BSS□    class 인 모든 DGROUP

7."STACK"        ''

※"BSS" class 에는초기화되자않은 데이타가들어있다 □STACK□ 에 있는 세그먼트가 스택의 크기를 결정하므로 B	SS 와 STACK 마지막에 있으므로써 실행화일의 크기를 최소화한다.

※ □CODE□ class 응용프로그램에대한 실행코드를담는다 소형코드모델에서는 □_TEXT□ segment 로이루어진다 대형에서는 □<modele>_TEXT>□ 이다

※□FAR_DATA" class는 다음의것으로 이루어진다, large 형에서 data threshold 를 초과하는 크기를가진 데이타객체(default 32k, zt 옵션으로 바꿀수있다),FAR 또는 HUGE 키워드로 정해진데이타객체, 그외 literal 값들.

※보호모드의번지 계산방식

2-2. 도스확장자 란?

Chapter 3. 어셈블러와 혼합프로그래밍

3-1. 인자전달방식의 차이

□레지스터기반 인자전달

.특징: 빠른속도를 기대할수있으나 호환성과 안정성에 문제가 있다 그러나 게임에서는 대부분 이방식을쓴다.

.디폴트로 되어있는 인자전달순서 : eax edx ebx ecx [ebp+8] [ebp+12].....

□                     □

□       ↑            □

□□□□□□□□□□□□□□□□□□□□□□□0

□ebp                  □

□□□□□□□□□□□□□□□□□□□□□□□4

□복귀주소             □

□□□□□□□□□□□□□□□□□□□□□□□8

□첫번째 파라메타      □

□□□□□□□□□□□□□□□□□□□□□□□

□       ↓            □

□인라인 어셈블러의 지원

#pragma aux <함수명> pram [].... modify []..... value[]

pram:레지스터 인자전달순서 정의

modify:서브루틴에서 변경되는 레지스터

value:리턴값을 실어 날으는 레지스터 정의

※스택기반 인자전달로바꾸기 3가지방법※

1)함수 선언할때 앞에다 _cdecl 붙이면 언더바도 앞에붙으며 인자전달도 엠에스씨 나 볼랜드씨 같이 스택기반이된다

2)#pragma aux <함수이름> parm caller[], 함수이름에서 언더바 지정않하면 언더바가 붙지않는다

ex>"myfun_□, "myfun", "_myfun"

3)컴파일시 옵션을 3s ~ 5s 로준다