win32의 구조적 구문
먼저 가장 간단한 Win32 어셈블러를 살펴보겠습니다:
.386
.model flat, stdcall
option casemap: 없음; 대소문자 구분
include windows.inc include kernel32.inc include user32.inc
includelib kernel32.lib includelib user32.lib
.data< /p >
szCaption db 'Win32 어셈블리 예제',0
szText db 'Win32 어셈블리, 간단하고 강력합니다!',0
.code
start :
MessageBox 호출,NULL,addr szText,addr szCaption,MB_OK
ExitProcess 호출,NULL
end start
이것은 실행할 수 있는 가장 간단한 Win32 어셈블리 프로그램입니다. 각 부분의 기능을 간략하게 소개하겠습니다. .model은 컴파일러에게 프로그램의 모드를 알려줍니다. Dos 어셈블리를 컴파일해본 사람들은 Dos 프로그램의 모드에 아주 작은, 작은, 작은 모드가 포함되어 있다는 것을 알 것입니다. ...huge 등은 프로그램 메모리 주소 지정 모드를 지정합니다. huge 및 기타 모드에서는 메모리 주소 지정 및 서브루틴 호출이 Far 형식을 사용하지만 Win32 어셈블리에서는 Win32 프로그램의 경우 플랫 모드라는 한 가지 모드만 사용할 수 있습니다. , 메모리는 연속 4GB 세그먼트이며 소형 또는 대형 모드가 없습니다. 그리고 stdcall은 서브루틴을 호출할 때 매개변수가 스택을 통해 전달되는 방법을 컴파일러에 알려줍니다. 매개변수를 전달하는 방법에는 stdcall, c 및 pascal이 있으며, stdcall은 매개변수가 오른쪽에서 왼쪽으로 푸시되도록 지정합니다. 예를 들어 MessageBox와 같은 Windows API의 경우 매뉴얼에서는 다음과 같이 정의됩니다.
int MessageBox(
HWND hWnd, // 소유자 창 핸들
LPCTSTR lpText, // 메시지 상자의 텍스트 주소
LPCTSTR lpCaption, // 메시지 상자 제목의 주소
UINT uType // 메시지 상자 스타일
);
그런 다음 어셈블리에서 다음과 같이 호출할 수 있습니다:
push uType
push lpCaption
push lpText p>
push hWnd
MessageBox 호출
물론, 가장 오른쪽 매개변수가 스택에 마지막으로 추가된 매개변수라는 점에 유의해야 합니다. Masm의 매크로 문은 모든 푸시 작업을 완료하는 데 도움이 될 뿐만 아니라 매개 변수 수가 올바른지 확인하는 데도 도움이 되므로 위의 문을 호출 문으로 대체할 수 있습니다. MessageBox,hWnd,lpText,lpCaption,uType을 호출합니다. 그게 다입니다. 예를 들어 이 프로그램에서 실제 매개변수를 대체하면 Invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK가 됩니다.
Dos에서 프로그래밍하든 Windows에서 프로그래밍하든 관계없이 우리는 항상 실행 파일 외에도 사운드 데이터, 그래픽 데이터, 텍스트 등과 같은 다른 많은 데이터를 사용해야 합니다. Dos에서 프로그래밍할 때 이러한 파일 형식을 직접 정의할 수 있습니다. 많은 리소스 공유 문제가 발생했습니다. Dos의 많은 게임에는 자체 형식으로 저장된 그래픽이 있다는 것을 기억하실 것입니다. 다른 형식으로 저장할 수 있는 방법도 없습니다. Win32 프로그래밍에서도 여전히 이 작업을 수행할 수 있지만 Win32 프로그래밍은 위의 버튼, 텍스트 등을 포함한 문자열, 그래픽, 대화 상자를 하나의 리소스 파일로 정의하는 통합 형식의 리소스 파일이라는 솔루션을 제공합니다. 다른 파일에서 쉽게 사용할 수 있습니다. 가장 중요한 것은 자체 파일 형식을 사용하는 경우 해당 파일을 사용할 때 이러한 파일의 읽기 및 쓰기 작업이 포함된다는 것입니다. 그러나 리소스 파일을 사용할 경우 Windows는 다음을 제공합니다. 리소스를 로드하는 일련의 API입니다. 매우 편리합니다. .rc, 리소스 컴파일러로 컴파일하여 .res 파일을 생성하는 경우 링크할 때 .exe 파일에 연결할 수 있습니다.
#include
# DLG_MAIN 1 정의
DLG_MAIN DIALOGEX 0, 0, 236, 185
STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | p >
FONT 9, 송나라
BEGIN
DEFPUSHBUTTON Exit,IDOK,177,163,50,14
Control ,-1,Static,SS_ETCHEDHORZ ,7,155,222 ,1
END
.rc 파일의 구문:
#include
#define DLG_MAIN 1 - .asm 파일의 equ 문과 유사하며 어셈블리 소스 프로그램에서 이러한 정의는 프로그램의 가독성을 위한 것입니다.
DLG_MAIN DIALOGEX 0,0,236,185
Windows .rc 파일은 BITMAP(비트맵), CURSOR(커서), ICON(아이콘), ACCELERATORS(가속기 키), DIALOG( 대화 상자)를 정의할 수 있습니다. ), MENU(메뉴), STRINGTABLE(문자열 테이블), RCDATA(사용자 지정 리소스) 등 8가지 리소스에 대한 자세한 설명은 MFC에 대한 책을 참조하세요. Win32ASM의 리소스 컴파일러 구문에 대한 일반적인 형식 정의 방법입니다. 이러한 리소스 중:
비트맵 정의: nameID BITMAP [load-mem] 파일 이름
커서 정의: nameID CURSOR [load-mem] 파일 이름
아이콘 정의 : nameID ICON [load-mem] 파일 이름
가속기 키 정의:
acctablename ACCELERATORS [선택적 명령문]
BEGIN event, idvalue, [type] [ options]
. .
END
etc. 구체적인 정의와 매개변수는 Masm32v5의 Rc.hlp 도움말 파일을 참조하세요.
(프로그래밍 도구에서 다운로드 가능) 리소스 편집기를 사용하여 WYSIWYG 리소스를 편집하거나 위 명령문을 사용하여 텍스트 편집기에서 리소스를 직접 정의할 수 있습니다. 프로그램에서 리소스를 사용하려면 먼저 메모리에 로드해야 합니다. Windows에서는 LoadBitmap 정의와 같이 LoadMenu, LoadString, LoadBitmap 등과 같은 리소스를 로드하는 일련의 API를 정의합니다.
HBITMAP LoadBitmap(
HINSTANCE hInstance, // 애플리케이션 인스턴스 핸들
LPCTSTR lpBitmapName // 비트맵 리소스 이름의 주소
);
This Load 함수의 반환 값은 핸들이며 호출 매개 변수에는 일반적으로 hInstance 및 ResouceName이라는 두 가지 항목이 포함됩니다. 이 ResouceName(예: BitmapName, MenuName)은 리소스 파일에서 #define으로 지정된 값입니다. #define MY_ICON 10/ MY_ICON ICON Main.ico를 사용하면 아이콘을 정의하므로 프로그램에서 Main.ico 아이콘을 사용하려면 LoadIcon(hInstance,10)을 사용하여 정의된 아이콘 파일을 로드하면 됩니다. 10번으로. 또 다른 매개변수인 hInstance는 실행 파일의 핸들로, 리소스가 위치한 파일 이름에 해당합니다. 프로그램 실행이 시작될 때 Invoke GetModuleHandle, NULL을 사용하여 hInstance를 얻을 수 있습니다. 대화 상자를 생성하는 함수에서 Windows 자체에 의해 로드되는 대화 상자 리소스(예: 다음 예제에서 Invoke DialogBoxParam, hInstance, DLG_MAIN, NULL, offset _ProcDlgMain)는 명시적으로 로드되지 않습니다. 리소스 파일에 정의된 대화 상자를 화면에 표시하려면 대화 상자를 먼저 로드하는 LoadDialogBox와 같은 API가 없습니다.