Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labnik_zavershyon.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
477 Кб
Скачать
☆

Пример программы на Ассемблере, использующей Windows api:

.386

.model flat, stdcall

includelib kernel32.lib

includelib user32.lib

ExitProcess PROTO ,:DWORD

MessageBoxA PROTO ,:DWORD, :DWORD, :DWORD, :DWORD

.data

MsgBoxCaption db "Заголовок",0

MsgBoxText db "Текст сообщения!",0

.const

NULL equ 0

MB_OK equ 0

.code

Winmain PROC

push MB_OK

push offset MsgBoxCaption

push offset MsgBoxText

push NULL

call MessageBoxA

push 0

call ExitProcess

Winmain endp

end Winmain

Из примера видно, что для использования функций в программе необходимо подключить библиотеку, в которой находятся эти функции, с помощью директивы includelib, и объявить сами функции с помощью директивы PROTO.

Команды трансляции, сборки и запуска для примера:

>c:\masm32\bin\ml /c /coff hello.asm

>c:\masm32\bin\link /SUBSYSTEM:Windows /LIBPATH:c:\masm32\lib hello.obj

>hello.exe

Далее приводится описание функций, необходимых для выполнение лабораторной работы:

CreateFile

CreateFile – создаёт или открывает файл. Возвращает хендл на открытый файл (или код ошибки)

HANDLE CreateFile(

LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile

);

Параметры

lpFileName

[in] указатель на строку, содержащую имя файла

dwDesiredAccess

[in] Права доступа к файлу – GENERIC_READ, GENERIC_WRITE

dwShareMode

[in] Режим разделения доступа – передаём 0.

lpSecurityAttributes

[in] Атрибуты безопасности. Передаём 0.

dwCreationDisposition

[in] Что делать если файл существует/не существует

Константа

Значение

CREATE_ALWAYS

Создать, если существует – уничтожить и создать заново

CREATE_NEW

Создать новый, если существует – вернуть ошибку

OPEN_ALWAYS

Открыть, если не существует – создать новый

OPEN_EXISTING

Открыть, если не существует – вернуть ошибку

TRUNCATE_EXISTING

Если существует – уничтожить и создать заново, если нет – вернуть ошибку.

dwFlagsAndAttributes

Передаём FILE_ATTRIBUTE_NORMAL

HANDLE hTemplateFile

Передаём 0

Примеры:

Открытие для чтения

#include <windows.h>

#include <stdio.h>

HANDLE hFile;

hFile = CreateFile(TEXT("myfile.txt"), // file to open

GENERIC_READ, // open for reading

FILE_SHARE_READ, // share for reading

NULL, // default security

OPEN_EXISTING, // existing file only

FILE_ATTRIBUTE_NORMAL, // normal file

NULL); // no attr. template

if (hFile == INVALID_HANDLE_VALUE)

{

printf("Could not open file (error %d)\n", GetLastError());

return 0;

}

открытие для записи:

#include <windows.h>

#include <stdio.h>

HANDLE hFile;

hFile = CreateFile(TEXT("myfile.txt"),// file to create

GENERIC_WRITE, // open for writing

0, // do not share

NULL, // default security

CREATE_ALWAYS, // overwrite existing

FILE_ATTRIBUTE_NORMAL | // normal file

FILE_FLAG_OVERLAPPED, // asynchronous I/O

NULL); // no attr. template

if (hFile == INVALID_HANDLE_VALUE)

{

printf("Could not open file (error %d)\n", GetLastError());

return 0;

}

ReadFile

Читаем данные из файла.

BOOL ReadFile(

HANDLE hFile,

LPVOID lpBuffer,

DWORD nNumberOfBytesToRead,

LPDWORD lpNumberOfBytesRead,

LPOVERLAPPED lpOverlapped

);

Параметры

hFile

[in] Хендл, из которого читаем.

lpBuffer

[out] Указатель на буфер для обмена данными.

nNumberOfBytesToRead

[in] Размер буфера.

lpNumberOfBytesRead

[out] указатель на переменную типа двойное слово, в которую запишем, сколько байт прочитали.

lpOverlapped

Здесь передаётся 0

Возвращаемые значения

Если завершено успешно, возвращается ненулевое значение. Если неудачно, то 0.

Пример:

//Попытка синхронной операции чтения.

bResult = ReadFile(hFile,

&inBuffer,

nBytesToRead,

&nBytesRead,

NULL) ;

// Проверяем, не конец ли файла.

if (bResult && nBytesRead == 0)

{

//Достигли конца файла.

}

SetFilePointer

перемещает указатель чтения/записи для открытого файла

DWORD SetFilePointer(

HANDLE hFile,

LONG lDistanceToMove,

PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod

);

Параметры

hFile

[in] Хендл файла

lDistanceToMove

Насколько двигаем

lpDistanceToMoveHigh

Здесь передаём 0

dwMoveMethod

[in] Откуда двигаем

Константа

Значение

FILE_BEGIN

От начала

FILE_CURRENT

От текущего значения

FILE_END

От конца

WriteFile

функция записи данных в файл

BOOL WriteFile(

HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD lpNumberOfBytesWritten,

LPOVERLAPPED lpOverlapped

);

Параметры

hFile

[in] Хендл файла

lpBuffer

[in] Указатель на буфер

nNumberOfBytesToWrite

[in] Размер буфера

lpNumberOfBytesWritten

[out] Указатель на переменную типа двойное слово, в которую пишется, сколько записали байт.

lpOverlapped

[in] Здесь передаём 0.

Возвращаемые значения

Если успешно, то возвращаем не 0, если неудачно, то 0.

CloseHandle

функция, закрывающая открытый хендл

BOOL CloseHandle(

HANDLE hObject

);

Параметры

HANDLE hObject

– хендл объекта

Возвращаемые значения

Возвращает ненулевое значение при успехе, 0 – при неудаче.

MessageBox

выводит окошко сообщения

int MessageBox(           HWND hWnd,

    LPCTSTR lpText,

    LPCTSTR lpCaption,

    UINT uType

);

Параметры

hWnd

[in] Хендл окна-владельца. Тут передаём NULL.

lpText

[in] Указатель на строку-сообщение.

lpCaption

[in] Указатель на строку-заголовок.

uType

[in] Константы (какие кнопки и какой значок рисовать). Передаём 0.

Возвращаемые значения

Ничего не возвращает.

GetSystemInfo

Функция получения информации о системе.

void GetSystemInfo(

LPSYSTEM_INFO lpSystemInfo

);

Параметры

LPSYSTEM_INFO lpSystemInfo

указатель на структуру SYSTEM_INFO

писание структуры SYSTEM_INFO

typedef struct _SYSTEM_INFO { union { DWORD dwOemId; struct { WORD wProcessorArchitecture; WORD wReserved; }; }; DWORD dwPageSize; LPVOID lpMinimumApplicationAddress; LPVOID lpMaximumApplicationAddress; DWORD_PTR dwActiveProcessorMask; DWORD dwNumberOfProcessors; DWORD dwProcessorType; DWORD dwAllocationGranularity; WORD wProcessorLevel; WORD wProcessorRevision;

} SYSTEM_INFO;

Описание членов структуры

dwOemId

Устаревший член структуры, оставленный для совместимости

wProcessorArchitecture

Архитектура процессора.

Константа

Значение

PROCESSOR_ARCHITECTURE_AMD64 9

x64 (AMD or Intel)

PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10

WOW64

PROCESSOR_ARCHITECTURE_IA64 6

Intel Itanium Processor Family (IPF)

PROCESSOR_ARCHITECTURE_INTEL 0

x86

PROCESSOR_ARCHITECTURE_UNKNOWN 0xffff

Unknown processor.

wReserved

Зарезервированное поле.

dwPageSize

Размер страницы памяти.

lpMinimumApplicationAddress

Указатель на нижнюю границу памяти, доступной приложению

lpMaximumApplicationAddress

Указатель на верхнюю границу памяти, доступную приложению.

dwActiveProcessorMask

Маска, представляющая множество процессоров, работающих в системе (бит 0 обозначает процессор 0, бит 31 – процессор 31)

dwNumberOfProcessors

Число процессоров в системе.

dwProcessorType

Устаревшее поле типа процессора, оставлено для совместимости.

Константа

Значение

PROCESSOR_INTEL_386

386

PROCESSOR_INTEL_486

486

PROCESSOR_INTEL_PENTIUM

586

PROCESSOR_INTEL_IA64

2200

PROCESSOR_AMD_X8664

8664

dwAllocationGranularity

Гранулярность начального адреса, с которого происходит выделение памяти.

wProcessorLevel

Уровень процессора, зависящий от архитектуры. Для процессоров x86 зависит от производителя, для процессоров IA64 всегда равен 1.

wProcessorRevision

Версия (ревизия) процессора. Значение поля зависит от архитектуры

GetLocalTime

Функция GetLocalTime из библиотеки Kernel32.dll возвращает текущие дату и время в формате UTC (Universal Time Coordinated). Её прототип:

VOID GetLocalTime(

LPSYSTEMTIME lpSystemTime // Адрес структуры SystemTime

);

Параметры

Тип данных LPSYSTEMTIME - это указатель на структуру SystemTime:

Описание структуры SYSTEMTIME

typedef struct _SYSTEMTIME {

WORD wYear; // Год

WORD wMonth; // Месяц

WORD wDayOfWeek; // День недели

WORD wDay; // День месяца

WORD wHour; // Часы

WORD wMinute; // Минуты

WORD wSecond; // Секунды

WORD wMilliseconds; // Миллисекунды

} SYSTEMTIME;

Как видно из описания, все поля структуры - это 16-ти разрядные целые числа. Месяцы нумеруются, начиная с единицы, то есть для января wMonth=1 и так далее. Номера дней недели начинаются с нуля, то есть для воскресенья wDayOfWeek=0, для понедельника wDayOfWeek=1, и так далее.

Функция GetLocalTime не возвращает никаких значений.

GlobalMemoryStatus

Функция GlobalMemoryStatus из библиотеки Kernel32.dll предоставляет информацию об использовании физической и виртуальной памяти компьютера. Её прототип:

VOID GlobalMemoryStatus(

LPMEMORYSTATUS lpBuffer // Адрес структуры MemoryStatus

);

Параметры

lpBuffer - это указатель на структуру MemoryStatus:

typedef struct _MEMORYSTATUS {

DWORD dwLength;// Размер структуры

DWORD dwMemoryLoad;// Процент использования памяти

DWORD dwTotalPhys;// Физическая память, байт

DWORD dwAvailPhys;// Свободная физическая память, байт

DWORD dwTotalPageFile; // Размер файла подкачки, байт

DWORD dwAvailPageFile; // Свободных байт в файле подкачки

DWORD dwTotalVirtual; // Виртуальная память, используемая процессом

DWORD dwAvailVirtual; // Свободная виртуальная память

} MEMORYSTATUS, *LPMEMORYSTATUS;

Функция не возвращает никаких значений.

Sleep

Функция Sleep из библиотеки Kernel32.dll приостанавливает выполнение приложения на указанное количество миллисекунд. Вот её прототип:

VOID Sleep(

DWORD dwMilliseconds

);

Параметры

dwMilliseconds – время «засыпания» программы в миллисекундах

Возвращаемое значение

Функция ничего не возвращает

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]