- •Введение
- •Лабораторная работа № 1
- •Цель работы:
- •Контрольные вопросы:
- •Задание к лабораторной работе:
- •Лабораторная работа № 2
- •Цель работы:
- •Цель работы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 3
- •Контрольные вопросы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 4
- •Цель работы:
- •Контрольные вопросы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 5
- •Цель работы:
- •Контрольные вопросы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 6
- •Цель работы:
- •Лабораторная работа № 7
- •Цель работы:
- •Пример программы для ос Linux:
- •Контрольные вопросы:
- •Задания к лабораторной работе
- •Лабораторная работа № 8
- •Цель работы:
- •Пример программы на Ассемблере, использующей Windows api:
- •Контрольные вопросы:
- •Задания к лабораторной работе:
Пример программы на Ассемблере, использующей 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 – время «засыпания» программы в миллисекундах
Возвращаемое значение
Функция ничего не возвращает
