Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по технологиям программирования.pdf
Скачиваний:
53
Добавлен:
02.06.2015
Размер:
4.73 Mб
Скачать
При перерисовке При выходе
При завершенииработы
Windows

Цикл обработки сообщения

MSG msg

while (GetMessage (&msg,NULL,0,0))

{TranslateMessage(&msg); DispatchMessage(&msg)

}

Обрабатываемыесообщения: При создании окна WM_CREATE,

WM_GETMINMAXINFO WM_NCCREATE WM_PAINT WM_QUIT

WM_QUERYENDSESSION

Определение запущенной копии приложения

HWND FindWindow

( LPCTSTR lpClassName, LPCTSTR lpWindowName);

BOOL IsIconic (HWND hwnd);

BOOL SetForegroundWindow (HWND hwnd);

Пример приложения

LRESULT WINAPI WndProc(HWND hWnd, UINTmsg, WPARAM wParam, LPARAM lParam);

szAppName[] = "Window";

char szAppTitle[] = "Window Application";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{WNDCLASSEX wc; HWND hWnd; MSG msg;

hInst = hInstance;

hWnd = FindWindow(szAppName, NULL); if (hWnd)

{ if (IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE); SetForegroundWindow(hWnd); return FALSE;

}

Созданиеглавногоокнаприложения и цикл обработки сообшений hWnd = CreateWindow(szAppName,

szAppTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInst,

NULL);

if(!hWnd) return(FALSE); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

Подготовка текста приложения на языке программирования.

Трансляция в .obj файл

Компоновка .exe файла

Статическая библиотека

 

 

 

 

 

Копия добавляется в каждую

 

 

 

 

 

 

 

 

 

 

программу во время компоновки

Программа 2.ехе

 

 

Библиотечная

 

 

 

 

 

 

 

 

 

 

 

 

 

функция А()

 

Программа 1.ехе

 

 

 

 

 

 

Библиотечная функция А()

Библиотечная функция А()

Процесс 1

 

 

 

Процесс 2

 

 

 

1. В заголовочном файле определятся экспортируемые функции

MyDLL.h

EXPORT extern “C” __declspec (dllexport) int CALLBACK

2.

Раздел экспорта

MyFunc (char *str);

 

 

 

ordinal

hint

 

RVA

name

 

 

 

 

 

 

 

 

1

0

0001A3C6

Add

 

 

 

 

 

 

 

2

1

 

0001A367

MyFunc

 

 

 

 

 

 

 

3. При создании исходного EXE – модуля необходимо определить внешнюю функцию

#include “MyDLL.h”

extern "C" __declspec(dllimport) MyFunc(char * str);

4.Компоновщик создает в конечном ЕХЕ-модуле раздел импорта

5.Прямой вызов функции

int iCode=MyFunc(“Hello”);

typedef HWND (WINAPI *MYDLLPROC) (LPSTR); MYDLLPROC GetWindow;

FARPROC MyPool; HANDLE hDLL;

hDLL = LoadLibrary("DLLDEMO.DLL"); if(hDLL != NULL)

{ MyPool = GetProcAddress(hLib, MAKEINTRESOURCE(8)); GetWindow = (MYDLLPROC) GetProcAddress(hDLL,

“MyFunc"); if(GetWindow!= NULL)

{

int Code=(* GetWindow )(“Hello”);// вызываем функцию

}

FreeLibrary(hDLL);

}

BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD fdwReason,

LPVOID lpvReserved);

Значение fdwReason

Описание

 

 

DLL_PROCESS_ATTACH

Запуск процесса или вызов функции LoadLibrary

 

 

DLL_THREAD_ATTACH

Создана новая задача

DLL_THREAD_DETACH Задача завершает свою работу не аварийным способом

DLL_PROCESS_DETACH Нормальное завершение процесса или вызова функции

FreeLibrary

Формат описания экспортируемой функции:

EXPORTS

ИмяТочкиВхода [=ВнутрИмя] [@Номер] [NONAME] [CONSTANT]

ПРИМЕР:

LIBRARY DLLNAME

DESCRIPTION 'DLL-библиотека DLLNAME‘

EXPORTS DrawBitmap=MyDraw @4 ShowAll

MyPoolPtr @5 CONSTANT

GetMyPool @8 NONAME MyFunc @9

Базовые регистры процессора

Intel Pentium

31

15

7

0

 

 

 

AH

 

 

AL

EAX

 

 

BH

 

 

BL

EBX

 

 

CH

 

 

CL

ECX

 

 

 

 

 

 

 

 

 

DH

 

 

DL

EDX

 

 

 

 

 

 

 

 

 

 

DI

 

EDI

 

 

 

 

 

ESI

 

 

 

SI

 

 

 

 

 

 

EBP

 

 

 

BP

 

 

 

 

 

 

 

 

 

 

SP

 

ESP

 

 

 

 

 

 

 

РЕГИСТРЫОБЩЕГО НАЗНАЧЕНИЯ

15 0

SS

DS

CS

ES

FS

GS

31 15

РЕГИСТРСЧЕТЧИК

СЕГМЕНТНЫЕ РЕГИСТРЫ

0

IP EIP

КОМАНД

31

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

 

 

OF

DF

 

 

SF

ZF

 

AF

 

PF

 

CF

РЕГИСТР ФЛАГОВ

Адресация

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Непрямая

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Прямая

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

регистровая

 

 

 

 

 

 

 

 

 

косвенная

 

 

 

 

 

 

 

 

 

 

непосредственная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV ax,14h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV ax,[1CD5h]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV bx, mem1

 

 

 

 

 

 

 

 

MOV ax, [bx]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

регистровая

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

базовая

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(отгносительная)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Индексная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV ax,bx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV ax, [bp]+5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MOV ax,[bp][5]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

абсолютная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

неявная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

стековая

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ADD ax, [si+2]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JMP 0x12345678

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

POP bp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

LOOP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЕА = база + (индекс*множитель)+смещение

Примерпрямой адресации

mov BP,SP

mov AX,4C00h

 

mov DX, offset mas

 

mass db250 dup(‘*’)

 

mov DL,'!‘

 

mem1 DW 1D7Fh

 

mov ax,mem1

 

mem1 DD EC341D7Fh

 

mov ax, wordptrmem1

;ax=1d7f

mov bx, wordptrmem+2

;bx=ec34

>

Младший

Старший

байт

байт

 

 

 

 

7F

1D

34

EC

 

 

 

 

Пример косвеннойадресации

mem1 DW 1D7Fh lea bx,mem1 mov ax,[bx]

1СВ6 1CB7

7F 1A

bx

ax

1CB6

1A7F

mov DX,[ВР] mov AL, [DI]

s1 DB “String 1”

 

lea EBX,s1

 

mov al, byte ptr[EBX][5]

;al=”g”

mas db1,2,5,3,7,9,8,3,4

 

mov BX,2

 

mov DL,mas[BX] ;dl=5

 

Такой же результат даст такая последовательность команд:

mov BХ,offset mas

 

mov DL,2[BX]

; mov DL, [ВХ+2] mov DL, [ВХ]+2