1. 이론적 배경:
Win32 프로그램들은 80286 이전에는 보호 모드에서 구동되지만 이제 80286 하나의 역사가 되었다. 우리가 살펴볼 것은 80386 과 그 이후 자식 세대에 촛점을 맞출 것이다.
각 윈도우는 서로 분리된 가상 공간(virtual space)를 가진 각각의 win32 프로그램 에서 구동된다. 이말은 Win32 프로그램은 자신만의 4기가 주소 공간을 가질 것이란 의미이다. 하지만 정말 각각의 Win32 프로그램이 4기가의 물리 메모리를 가진다는 의미는 아니라 그 영역 내에서 주소를 부여 할 수 있다는 말이다.
각 프로그램은 자신만의 주소공간을 가지고 있으며, 이는 서로 *볼수* 있는 Win16과 다른 점이다.(메모리를 공유한다는 말?)
이는 다른프로그램에 의해서 프로그램의 code/data가 수정될 수 있는 경우가 줄어든다는 말이기도 하다.
메모리 모델은 Flat memory model이며, 64K 세그먼트는 더이상 없으며, 4G 까지 거대한 연속된 공간이 되었다. 더이상 세그먼트 레지스터를 사용할 필요가 없다. 즉 이 세그먼트 레지스트리를 가지고 메모리 공간의 어떤 곳도 가리킬 수 있다는 말이다.
2. Win32 하에서 프로그래밍할 때 가장 중요한 주요 규칙들
- 윈도우는 내부적으로 esi, edi, ebp 그리고 ebx 를 사용한다. 이값들이 변하지 말아야 한다는 것이다.
- 콜백 함수내에 이 네개 레지스터 중 하나를 사용한다면 윈도우로 컨트롤을 넘기기 전에 재 저장(restore) 해야 한다는 것을 잊지 말아야 한다.
2.1 상세 내용:
다음 뼈대 코드를 봅시다:
.386
.MODEL Flat, STDCALL
.DATA
<초기화 된 데이타>
......
.DATA?
<초기화 되지 않은 데이타>
......
.CONST
<상수들>
......
.CODE
<라벨>
<코드부분>
.....
end <라벨>
2.2 내용 분석:
.386
어셈블러 지시자. 어셈블러에게 이는 80386 인스트럭션 셑이라는 것이라고 주지 시킨다.
.486 혹은 .586을 사용하지만 가장 안전한 방법은 이렇게 쓰는 것이다.
각 CPU 모델은 다음 두개씩의 동일한 형식을 제공한다.
.386/.386p, .486/.486p.
p의 의미는 보호모드에서 운영체제/CPU에 의해서 예약된 인스트럭션인 Previleged instructions을 사용 해야 할 때 필요하다. - 이말의 의미는 알겠지? virtual device driver를 건드리다 컴퓨터 날릴 수 있다는 것이다...
.MODEL FLAT, STDCALL
.MODEL
어셈블리 지시자. 프로그램의 메모리 모델 지정.
Win32 상에서는 오직 "FLAT" 모델이다
STDCALL
파라메터 전달 규칙. 전달 파라메터 순서. 함수 호출 후 스택 프레임에서 맞추는 것이다. Win16 상에서는 호출 규칙이 C와 PASCAL 두개의 타입이 있다.
C 의 호출 규약은 오른쪽에서 왼쪽으로 파라메터를 전달하는 것이다. 이는 맨 오른쪽의 파라메터가 첫번째로 들어간다는 것이다. 호출자는 호출 이후 스택에 균형을 맞출 의무를 가진다.
예를 들어 함수 foo(int first_param, int second_param, int third_param) 를
이 호출 규약에 맞추게 되면 아래와 같은 어셈블리 코드가 될 것이다.
push [third_param] ; Push the third parameter
push [second_param] ; Followed by the second
push [first_param] ; And the first
call foo
add sp, 12 ; The caller balances the stack frame
.DATA
.DATA?
.CONST
.CODE
위의 네개의 지시자는 소위 섹션이라고 불리는 것들이다.
세그먼트를 사용하지 않는 대신 전체 논리 영역을 논리 섹션으로 나누어 주어야만 한다.
data 와 code 두개의 섹션 그룹으로 나뉜다. 그리고 Data 섹션은 3개의 분류로 나뉘어 진다.
.DATA 프로그램의 초기화 된 데이터를 포함한다. .DATA? 프로그램의 초기화 되지 않은 데이터를 포함한다. 메모리를 할당, 먼저 할당 하지만 초기화 하고 싶지 않을 때가 있는 데, 이 섹션은 그런 목적으로 쓰여진다. 이 초기화 되지 않은 데이터의 잇점은 실행파일의 공간을 차지 하지 않는다는 것이다. 프로그램이 메모리로 로딩 되었을 때, 메모리의 크기를 할당하면 된다. .CONST 프로그램에서 상수를 선언한다. 프로그램에서 절대 수정되지 못한다. 진짜 *상수*다. |
위 세개를 다 선언 할 필요는 없으며 필요 한 것만 선언한다.
다음 하나 남은 섹션은 바로 CODE 이다. 여기에 코딩한다.
<label> ... end <label>
label은 아무 이름이나 정하여 코드의 영역이 어디 인지만 알려 주도록 한다.
모든 코드들은 <label> 와 end <label> 안에 존재 해야만 한다.
이상.
'프로그래밍' 카테고리의 다른 글
Win32 어셈블리 프로그래밍 - 3. 간단한 윈도우 (0) | 2022.04.04 |
---|---|
Win32 어셈블리 프로그래밍 - 2. 메시지 박스 (0) | 2022.04.04 |
윈도우 실행 파일 oxc000007b 오류 (0) | 2022.04.01 |
내 PC OS 버전 확인 하기 (0) | 2022.04.01 |
자바] 파일과 인코딩 (0) | 2022.03.22 |