Многозадачность в 32-битных операционных системах Windows

Программирование в операционной системе Windows. Работа с потоками и процессами ОС. Методы их создания. Основы вызова API-функций. Пример создания диалогового окна без использования файла ресурсов. Разработка программы с помощью 32-битного ассемблера.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.05.2014
Размер файла 107,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Оглавление

  • Введение
  • 1 Теоретическое обоснование
    • 1.1 Основные сведения
    • 1.2 Основы вызова API-функций
    • 1.3 Основы программирования в операционной системе Windows
  • 2. Демонстрационная программа
    • 2.1 Листинг
    • 2.2 Демонстрация работы
  • Вывод

Введение

Целью курсовой работы является изучение основ программирования на 32-битном ассемблере, при помощи которого необходимо разработать программу, демонстрирующую работу одного из разделов ОС WINDOWS.

В данном отчете отражена работа со потоками и процессами WINDOWS, рассмотрены методы их создания, основанные на API-функциях. На основании описанных функций разработана программа.

1. Теоретическое обоснование

1.1 Основные сведения

Основные положения программирования в ОС WINDOWS:

Программирование в Windows основывается на использовании функций API (ApplicationProgramInterface, т.е. интерфейс программного приложения). Их количество достигает двух тысяч. Программа в значительной степени состоит из таких вызовов. Все взаимодействие с внешними устройствами и ресурсами операционной системы происходит посредством таких функций.

Список функций API и их описание перечислен в файле WIN32.HLP, который поставляется, например, с пакетом Borland C++.

Главным элементом программы в среде Windows является окно. Для каждого окна определяется своя процедура обработки сообщений.

Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна.

Операционная система Windows использует линейную модель памяти. Другими словами, всю память можно рассматривать как один сегмент. Для программиста на языке ассемблера это означает, что адрес любой ячейки памяти будет определяться содержимым одного 32-битного регистра, например EBX.

Следствием пункта 5 является то, что фактически нет ограничений в объеме данных, кода или стека (объеме локальных переменных). Выделение в тексте программы сегмента кода и сегмента данных является теперь простой формальностью, улучшающей читаемость программы.

Операционная система Windows является многозадачной средой. Каждая задача имеет свое адресное пространство и свою очередь сообщений. Более того, даже в рамках одной программы может быть осуществлена многозадачность - любая процедура может быть запущена как самостоятельная задача.

1.2 Основы вызова API-функций

Функции API в ассемблере вызываются способом, схожим с вызовом в языках высокого уровня. Для этого все передаваемые параметры передаются в стек в обратном порядке.

Например, функция:

intMessageBox ( HWNDhWnd, LPCTSTRlpText, LPCTSTRlpCaption, UINTuType );

будет вызвана в ассемблере по следующему шаблону:

includelib user32.lib

EXTERN MessageBoxA@16:NEAR

МВ_ОК equ 0

STR1 DB "Неверный ввод! ",0

STR2 DB "Сообщение об ошибке.",0

HW DWORD ?

PUSH МВ_ОК

PUSH OFFSET STR1

PUSH OFFSET STR2

PUSH HW

CALL MessageBoxA@16

В таком вызове API функции MessageBox добавляется символ А, указывающий на ANSI-стандарт, символ @ в роли разделителя и число N в конце, обозначающий количество байт информации, которая передается в функцию через стек.

На замену стандартному вызову при помощи команды CALL в компиляторе MASM добавлена команда INVOKE. Вызовфункции:

PUSH par1

PUSH par2

PUSH par3

PUSH par4

CALL NAME_PROC@N

Принимает вид:

INVOKE NAME_PROC, par4, par3, par2, par1

При этом функция объявляется в виде:

PROC PROTO :DWORD, :DWORD, :DWORD, :DWORD

Тогда код предыдущего примера выглядит следующим образом:

includelib user32.lib

MessageBoxAPROTO :DWORD, :DWORD, :DWORD, :DWORD,

МВ_ОК equ 0

STR1 DB "Неверный ввод! ",0

STR2 DB "Сообщение об ошибке.",0

HW DWORD ?

INVOKE MessageBoxA,HW,OFFSET STR1,OFFSET STR2,MB_OK

Аналогичным образом задаются структуры. Так, структуре:

typedefstructtagMSG { // msg

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

соответствуеткод:

MSGSTRUCT STRUC

MSHWND DD ?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCTENDS

1.3 Основы программирования в операционной системе Windows

Далее рассмотрена основная структура программы. В программе имеется главное окно, а следовательно, и процедура главного окна. В целом, в коде программы можно выделить следующие секции:

· Регистрация класса окон

· Создание главного окна

· Цикл обработки очереди сообщений

· Процедура главного окна

Регистрация класса окон. Регистрация класса окон осуществляется с помощью функции RegisterClassA, единственным параметром которой является указатель на структуру WNDCLASS, содержащую информацию об окне.

Создание окна. На основе зарегистрированного класса с помощью функции CreateWindowExA (или CreateWindowA) можно создать экземпляр окна. Как можно заметить, это весьма напоминает объектную модель программирования.

Цикл обработки очередей сообщений. Функция GetMessage() "отлавливает" очередное сообщение из ряда сообщений данного приложения и помещает его в структуру MSG.

Что касается функции TranslateMessage, то ее компетенция касается сообщений WM_KEYDOWN и WM_KEYUP, которые транслируются в WM_CHAR и WM_DEADCHAR, а также WM_SYSKEYDOWN и WM_SYSKEYUP, преобразующиеся в WM_SYSCHAR и WM_SYSDEADCHAR. Смысл трансляции заключается не в замене, а в отправке дополнительных сообщений. Так, например, при нажатии и отпускании алфавитно-цифровой клавиши в окно сначала придет сообщение WM_KEYDOWN, затем WM_KEYUP, а затем уже WM_CHAR.

Как можно видеть, выход из цикла ожиданий имеет место только в том случае, если функция GetMessage возвращает 0. Это происходит только при получении сообщения о выходе (сообщение WM_QUIT). Таким образом, цикл ожидания играет двоякую роль: определенным образом преобразуются сообщения, предназначенные для какого-либо окна, и ожидается сообщение о выходе из программы.

MSG_LOOP:

INVOKE GetMessageA, OFFSET MSG,0,0,0

CMP AX, 0

JE END_LOOP

INVOKE TranslateMessage,OFFSET MSG

INVOKE DispatchMessageA,OFFSET MSG

JMP MSG_LOOP

END_LOOP:

INVOKE ExitProcess,[MSG.MSWPARAM]

_ERR:

JMP END_LOOP

Процедура главного окна. Описывается следующим образом:

WNDPROC PROC

PUSH EBP

MOV EBP, ESP ; теперь EBP указывает на вершину стека

PUSH EBX

PUSH ESI

PUSH EDI

PUSH DWORD PTR [EBP+14H]; LPARAM (lParam)

PUSH DWORD PTR [EBP+10H]; WPARAM (wParam)

PUSH DWORD PTR [EBP+0CH]; MES (message)

PUSH DWORD PTR [EBP+08H]; HWND (hwnd)

CALL DefWindowProcA@16

POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

Также очень часто диалоговые окна могут предоставить замену стандартному окну, их преимущество в большей простоте реализации. К тому же при помощи сред разработки возможно создание файла ресурсов с помощью интуитивного графического редактора, что дает готовое решение дизайна диалогового окна.

Пример создания диалогового окна без использования файла ресурсов:

· Опишем прототип DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

· Опишем диалоговое окно и его компоненты :

Dialog "Scrolling text multithreading", \

"MS Sans Serif",10, \

WS_OVERLAPPED or \

WS_SYSMENU or DS_CENTER, \

3, \

50,50,200,100, \

1024

DlgButton "Run thread",WS_TABSTOP,150,5,40,13,IDOK

DlgButton "Shut off", WS_TABSTOP, 150,20,40,13,IDSTOP

DlgButton "Start regedit", WS_TABSTOP, 150,35,40,13,IDPROC

DlgButton "Exit",WS_TABSTOP,150,35,40,13,IDCANCEL

DlgStatic "Multithreading",SS_LEFT,5,5,60,9,100

· Вызов окна происходит с помощью CallModalDialog: CallModalDialog hInstance,0,DlgProc,NULL

Где DlgProc - функция обработчика.

1.4 Многозадачное программирование

Под процессом будем понимать объект, создаваемый операционной системой Windows обычно при загрузке исполняемого модуля и получающий в единоличное пользование:

1. Виртуальную память, выделяемую для него операционной системой.

2. Дескрипторы открываемых им файлов.

3. Список загруженных им в его собственную память динамических модулей (DLL).

4. Созданные им подпроцессы или потоки, исполняемые независимо друг от друга, в собственной памяти процесса.

Теперь что касается подпроцесса. Смысл его достаточно прост: каждый процесс в отведенном для него адресном пространстве может порождать еще процессы. Эти процессы выполняются независимо друг от друга и от порождающего их процесса. Однако порождающий процесс может при желании "убить" любой из порожденных им процессов. Такие процессы называют еще потоками, а также цепочками или нитями. Однако в операционной системе Windows для создания потоков есть и специальные средства, речь о которых пойдет ниже.

Ваше приложение может создавать процессы, запустив ту или иную ЕХЕ-программу, которые будут работать независимо от основного приложения. Одновременно Ваше приложение может при необходимости удалить запущенное им приложение из памяти. Запустить приложение (создать процесс) можно при помощи функции CreateProcess. Сейчас мы дадим описание этой функции. Ниже объясняются ее параметры.

· 1-й параметр - указывает на имя запускаемой программы. Имя может содержать полный путь к программе.

· 2-й параметр - его значение зависит от того, является первый параметр NULL (0) или нет. Если первый параметр указывает на строку, то данный параметр трактуется как командная строка запуска (без имени программы). Если первый параметр равен NULL, то данный параметр рассматривается как командная строка, первый элемент которой представляет собой имя программы. Если путь к программе не указан, то функция CreateProcess осуществляет поиск программы по определенному алгоритму:

1. Поиск в каталоге, откуда была запущена программа.

2. Поиск в текущем каталоге.

3. Поиск в системном каталоге (можно получить через GetSystemDirectory). Обычно системным каталогом является C:\WINDOWS\SYSTEM.

4. Поиск в каталоге Windows (можно получить через GetWindowsDirectory). Обычно этим каталогом является C:\WINDOWS.

5. Поиск в каталогах, перечисленных в параметре PATH окружения.

· 3-й и 4-й параметры. Используются для задания атрибутов доступа порождаемого процесса. Обычно полагают равным 0.

· 5-й параметр. Если этот параметр 0, то порождаемый процесс не наследует дескрипторы порождающего процесса, в противном случае порождаемый процесс наследует дескрипторы.

· 6-й параметр. Может менять свойства порождаемого процесса. Если параметр равен нулю, то свойства задаются по умолчанию. В силу большого количества значений этого параметра, мы отсылаем желающих к соответствующим справочным руководствам.

· 7-й параметр. Является указателем на буфер, содержащий параметры среды. Если параметр равен 0, то порождаемый процесс наследует параметры среды порождающего процесса.

· 8-й параметр. Задает текущее устройство и каталог для порождаемого процесса. Если параметр равен NULL, порождаемый процесс наследует текущее устройство и каталог порождающего процесса.

· 9-й параметр. Представляет указатель на структуру, которая содержит информацию об окне создаваемого процесса. Ниже будут рассмотрены поля этой структуры.

· 10-й параметр. Указывает на структуру, заполняемую при выполнении запуск приложения. Вот эта структура:

· PROCINF STRUC

· hProcess DD ? ; дескриптор созданного процесса.

· hThread DD ? ; дескриптор главного потока нового процесса.

· Idproc DD ? ; идентификатор созданного процесса.

· idThr DD ? ; идентификатор главного потока нового процесса.

PROCINF ENDS

Основное отличие дескриптора от идентификатора заключается в том, что дескриптор уникален лишь в пределах данного процесса, идентификатор же является глобальной величиной. Посредством идентификатора может быть найдена база данных текущего процесса. У читателя, я думаю, сразу возникнет вопрос: а чем дескриптор приложения, который мы получаем при помощи функции GetModuleHandle, от только что упомянутых величин? Дескриптор приложения, или дескриптор модуля есть величина локальная, т.е. действующая в пределах данного процесса и, как правило, равная адресу загрузки модуля в виртуальное адресное пространство. Дескриптор модуля имеется у любого модуля, загруженного в память, в том числе и у подчиненных DLL-библиотек.

Рассмотрим теперь структуру, на которую указывает 9-й параметр функции CreateProcess. Вотэтаструктура:

STARTUP STRUC

cb DD 0

lpReserved DD 0

lpDesktop DD 0

lpTitle DD 0

dwX DD 0

dwY DD 0

dwXSize DD 0

dwYSize DD 0

dwXCountChars DD 0

dwYCountChars DD 0

dwFillAttribute DD 0

dwFlags DD 0

wShowWindow DW 0

cbReserved2 DW 0

lpReserved2 DD 0

hStdInput DD 0

hStdOutput DD 0

hStdError DD 0

STARTUP ENDS

Итак, разберем смысл полей этой структуры. cb - размер данной структуры в байтах. Заполняется обязательно. lpReserved - резерв, должно быть равно нулю. lpDesktop - имя рабочего стола (и рабочей станции). Имеет смысл только для Windows NT. lpTitle - название окна для консольных приложений, создающих свое окно. Для остальных приложений должно быть равно 0. dwX - координата X левого верхнего угла окна. dwY - координата Y левого верхнего угла окна. dwXSize - размер окна по X. dwYSize - размер окна по Y. dwXCountChars - размер буфера консоли по X. dwYCountChars - размер буфера консоли по Y. dwFillAttribute - начальный цвет текста. Имеет значение только для консольных приложений. dwFlags - флаг значения полей. Вот значение этого флага.

Таблица 1.

Макро-значение флага

Значение константы

Смысл значения

STARTF_USESHOWWINDOW

1h

Разрешить поле dwShowWindow

STARTF_USESIZE

2h

Разрешить dwXSize и dwYSize

STARTF_USEPOSITI0N

4h

Разрешить dwX и dwY

STARTF_USECOUNTCHARS

8h

Разрешить dwXCountChars и dwYCountChars

STARTF_USEFILLATTR1BUTE

10h

Разрешить dwFillAttribute

STARTF_FORCEONFEEDBACK

40h

Включить возврат курсора

STARTF_FORCEOFFFEEDBACK

80h

Выключить возврат курсора

STARTF_USESTDHANDLES

100h

Разрешить hStdInput

wShowWindow - определяет способ отображения окна. cbReserved2 - резерв, должно быть равно 0. hStdInput - дескриптор ввода (для консоли). hStdOutput - дескриптор вывода (для консоли). hStdError - дескриптор вывода сообщения об ошибке (для консоли).

Поток может быть создан при помощи функции CreateThread. Рассмотрим параметры этой функции.

· 1-й параметр. Указатель на структуру атрибутов доступа. Имеет значение только для Windows NT. Обычно полагается NULL.

· 2-й параметр. Размер стека потока. Если параметр равен нулю, то берется размер стека по умолчанию, равный размеру стека родительского потока.

· 3-й параметр. Указатель на потоковую функцию, с вызова которой начинается исполнение потока.

· 4-й параметр. Параметр для потоковой функции.

· 5-й параметр. Флаг, определяющий состояние потока. Если флаг равен 0, то выполнение потока начинается немедленно. Если значение флага потока равно CREATE_SUSPENDED (4H), то поток находится в состояние ожидания и запускается по выполнению функции ResumeThread.

· 6-й параметр. Указатель на переменную, куда будет помещен дескриптор потока.

Как уже было сказано, выполнение потока начинается с потоковой функции. Окончание работы этой функции приводит к естественному окончанию работы потока. Поток также может закончить свою работу, выполнив функцию ExitThread с указанием кода выхода. Наконец, порождающий поток может закончить работу порожденного потока при помощи функции TerminateThread

Вообще идеальной мне кажется ситуация, когда функция окна берет на себя только реакцию на события, происходящие с элементами, а всю трудоемкую работу (сложные вычисления, файловая обработка) должны взять на себя потоки. Кстати, поток может создавать новые потоки, так что в результате может возникнуть целое дерево.

Для взаимодействия между потоками могут использоваться:

1. Семафоры

2. События

3. Критические секции

4. Глобальные переменные

5. Сообщения

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

Сначала при помощи функции CreateSemaphore создается семафор и его дескриптор присваивается глобальной переменной. Перед попыткой обращения к ресурсам, доступ к которым необходимо ограничить, поток должен вызвать функцию WaitForSingleObject. При открытии доступа функция возвращает 0. По окончании работы с ресурсом следует вызвать функцию ReleaseSemaphore. Тем самым увеличивается счетчик доступа на 1. С помощью семафора можно регулировать количество потоков, которые одновременно могут иметь доступ к ресурсу. Максимальное значение счетчика как раз и определяет, сколько потоков могут получить доступ к ресурсу одновременно.

События. Событие является объектом, очень похожим на семафор, но в несколько видоизмененном виде.

CreateEvent - создает объект-событие. Параметры функции. 1-й параметр. Имеет тот же смысл, что и первый параметр функции CreateSemaphore. Обычно полагается равным NULL. 2-параметр. Если параметр не равен нулю, то событие может быть сброшено при помощи функции ResetEvent. Иначе событие сбрасывается при доступе к нему какого либо процесса. 3-й параметр. Если параметр равен 0, то событие инициализируется как сброшенное, в противном случае сразу же подается сигнал о наступлении соответствующей ситуации. 4-й параметр. Указатель на строку, которая содержит имя события.

Ожидание события осуществляется, как и в случае с семафором, функцией WaitForSingleObject.

Критические секции. Понятие критической секции позволяет уберечь определенные области программы так, чтобы в этой области программы в данный момент времени исполнялся бы только один поток. Рассмотрим функции для работы с критической секцией.

InitializeCriticalSection - данная функция создает объект под названием критическая секция. Параметры функции.

· 1-й параметр. Указатель на структуру, указанную ниже. Поля данной структуры используются только внутренними процедурами, и смысл их безразличен.

· CRITICAL_SECTION STRUCT

· DebugInfo DWORD ?

· LockCount LONG ?

· RecursionCount LONG ?

· OwningThread HANDLE ?

· LockSemaphore HANDLE ?

· SpinCount DWORD ?

CRITICAL_SECTION ENDS

EnterCriticalSection - войти в критическую секцию. После выполнения этой функции данный поток становится владельцем данной секции. Следующий поток, вызвав данную функцию, будет находиться в состоянии ожидания. Параметр функции такой же, что и в предыдущей функции.

LeaveCriticalSection - покинуть критическую секцию. После этого второй поток, который был остановлен функцией EnterCriticalSection, станет владельцем критической секции. Параметр функции LeaveCriticalSection такой же, как и у предыдущих функций.

DeleteCriticalSection - удалить объект "критическая секция". Параметр аналогичен предыдущим.

Программно можно определить несколько объектов критической секции, с которыми будут работать несколько потоков. Два потока обращаются время от времени к процедуре, выводящей очередной символ из строки в окно. В результате такой конкурентной деятельности должна быть напечатана строка.

Часть процедуры, выводящей очередной символ, сделана критической, поэтому доступ к выводу в окно в данный момент времени имеет только один поток.

windows программа ассемблер

2. Демонстрационная программа

2.1 Листинг

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««

.486 ;

.model flat, stdcall ;

optioncasemap :none ;

; Подключаемфайлы

; ~~~~~~~~~~~~~

include ..\include\windows.inc

include ..\include\user32.inc

include ..\include\kernel32.inc

include ..\macros\macros.asm

include ..\include\masm32.inc

; Библиотеки

; ~~~~~~~~~

includelib ..\lib\user32.lib

includelib ..\lib\kernel32.lib

includelib ..\lib\masm32.lib

include ..\include\dialogs.inc

; Описаниепрототипов

DlgProcPROTO :DWORD,:DWORD,:DWORD,:DWORD

rotate_caption PROTO :DWORD

; Датасегмент

.data

textBufferOSdb "Потоков запущенно",0

progdb "c:\windows\regedit.exe",0

processInfo PROCESS_INFORMATION <>

.data?

hWnddd ?

hhwn dd ?

hInstancedd ?

ThreadIDDWORD ?

threadSwitchdd ?

threadCountdd ?

textBufferdb 20 dup(?)

startInfodd ?

; Константы

.const

IDSTOP equ 102

IDPROC equ 103

WM_STOP_THREAD equ WM_USER+1

; «««««««««««««««««««««««««««КОД«««««««««««««««««««««««««««««

.code

start:

movhInstance, FUNC(GetModuleHandle,NULL)

;Описываемдиалог

Dialog "Scrolling text multithreading ", \ ;Заголовок

"MSSansSerif",10, \ ; Шрифт и его размер

WS_OVERLAPPED or \ ; Стиль

WS_SYSMENU or DS_CENTER, \ ; диалоговогоокна

4, \ ; Число элементов управляения

50,50,200,100, \ ;xy координаты

1024 ; Размер буффера

;Описываем кнопки

DlgButton "Runthread",WS_TABSTOP,150,5,40,13,IDOK

DlgButton "Shut off", WS_TABSTOP, 150,20,40,13,IDSTOP

DlgButton "Start regedit", WS_TABSTOP, 150,35,40,13,IDPROC

DlgButton "Exit", WS_TABSTOP,150,50,40,13,IDCANCEL

;Текствнутри

DlgStatic "Multithreading ",SS_LEFT,5,5,60,9,100

;Вызовокна

CallModalDialog hInstance,0,DlgProc,NULL

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;Процедураобработчикадиалоговогоокна

DlgProcprochWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

;Разборсообщения

Switch uMsg

Case WM_INITDIALOG ;насоздании

m2mhWnd, hWin ; копируемдескриптор

movthreadCount, 0 ;счетчикпотоков = 0

CaseWM_COMMAND ; разбор сообщений кнопок

SwitchwParam

CaseIDOK

movthreadSwitch,0 ; маска для работы потоков

;Если = 0 то работа разрешена

moveax,OFFSETthread_proc1 ; в регистр адрес процедуры потока

invokeCreateThread,NULL,NULL,eax,NULL,NULL,ADDRThreadID ; вызываемпоток

Case IDCANCEL ;

jmpquit_dialog ; закрытьдиалог

Case IDSTOP ;остановкапотоков

moveax,OFFSET thread_proc2 ; вызоввтороговидапотока

invokeCreateThread,NULL,NULL,eax,NULL,NULL,ADDRThreadID

Case IDPROC ;созданиепроцесса

invokeGetStartupInfo,ADDRstartInfo ; получаем информацию

;вызываем процесс

invoke CreateProcess,NULL,offsetprog,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,ADDRstartInfo,ADDRprocessInfo

EndSw

CaseWM_STOP_THREAD

movthreadSwitch,1 ; по данному сообщению маска для потоков = 1

Case WM_CLOSE

quit_dialog:

invoke EndDialog,hWin,0 ; закрываемдиалог

EndSw

return 0

DlgProcendp

; процедура первого вида потока

; она будет крутить (скроллить) заголовок

thread_proc1proc

;локальные переменные

LOCAL tlen :DWORD

LOCAL buffer[128]:BYTE

Local pbuf :DWORD

Local charCount :DWORD

mov charCount,0

movpbuf, ptr$(buffer)

addthreadCount, 1

@loop:

invoke GetWindowText,hWnd,pbuf,128 ; беремтекст

invokerotate_caption,pbuf;крутимна 1 символ

invokeSetWindowText,hWnd,pbuf;обновляемтекст

invoke Sleep, 50;заддержка

.if threadSwitch == 1;еслизапрет

jmp @stopThread;выход из цикла

.endif

jmp @loop

@stopThread:

ret

thread_proc1endp

; процедура второго вида потока

thread_proc2proc

invokedwtoa,threadCount,ADDRtextBuffer ; число в строку

invokeMessageBox,hWnd,ADDRtextBuffer,ADDRtextBufferOS,MB_OK ; выводим сколько потоков запущенно

invokeSendMessage,hWnd,WM_STOP_THREAD,NULL,NULL ; отсылаем сообщение

mov threadCount,0 ; сбрасываем счетчик

ret

thread_proc2endp

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

OPTION PROLOGUE:NONE

OPTIONEPILOGUE:NONE

; процедура прокрутки на 1 символ

rotate_captionprocpbuf:DWORD

movedx, [esp+4] ; грузим строку

movcl, [edx] ; первый байт

addedx, 1 ; переходим к следующему

@rewrite:

moval, [edx] ; читаем символ

addedx, 1 ; увеличиваем адрес

testal, al ; проверяем на 0

jz @last_rewrite ; если конец строки то на выход

mov [edx-2], al ; запись символа

jmp @rewrite

@last_rewrite:

mov [edx-2], cl ; запись последнего символа

movBYTEPTR [edx-1], 0 ; нуль терминатор

ret 4 ; балансстека

rotate_captionendp

OPTION PROLOGUE:PrologueDef

OPTION EPILOGUE:EpilogueDef

; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

end start

2.2 Демонстрация работы

Вывод

В ходе данной курсовой работы были освещены основы программирования для WINDOWS. Также были изучены методы и средства многозадачного программирования вWINDOWS. Для реализации программы, иллюстрирующей теоретическую информацию был использован 32-битный ассемблер.

Размещено на Allbest.ru


Подобные документы

  • Основы программирования в операционной системе Windows. Создание процессов в 32-битных операционных системах. Основное отличие дескриптора от идентификатора. Понятие критической секции. Основы вызова API-функций. Методы многозадачного программирования.

    курсовая работа [501,1 K], добавлен 18.05.2014

  • Введение в API-программирование. Транслирование клавиатурных сообщений в ASCII-коды. Текст программы на 32-битном ассемблере с применением API-функций. Функция для создания диалогового окна. Определение открываемого диска, каталога и имени файла.

    курсовая работа [40,6 K], добавлен 18.05.2014

  • Основы работы операционной системы Windows XP. Работа в текстовом процессоре Microsoft Word: ввода, редактирования и форматирования текста, автоматизации разработки документа, создания графических объектов, создания комплексного текстового документа.

    курсовая работа [3,6 M], добавлен 25.04.2009

  • Сущность основных аспектов эффективного функционирования в операционной системе Windows. Способ создания локальных сетей в операционной системе Windows XP, изучение их возможностей. Глобальная сеть Интернет в ОС Windows, структура и основные программы.

    курсовая работа [352,8 K], добавлен 15.02.2009

  • Программа операционной системы. Перемещение и копирование объектов. Окна Windows, операционное меню, настройка свойств папки, вызов справки Windows. Работа с дисками, папками и файлами, с приложениями и документами. Стандартные программы Windows.

    контрольная работа [21,9 K], добавлен 29.01.2011

  • Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.

    курсовая работа [165,6 K], добавлен 18.05.2014

  • Основные понятия об операционных системах. Виды современных операционных систем. История развития операционных систем семейства Windows. Характеристики операционных систем семейства Windows. Новые функциональные возможности операционной системы Windows 7.

    курсовая работа [60,1 K], добавлен 18.02.2012

  • Назначение команды "diskcomp". Текст и запуск командного файла. Сравнение команды в Windows 7 и Windows XP. Разработка файла-сценария в ОС Linux. Создание файла в подкаталоге. Создание файла "oglavlenie.txt" с отсортированным по времени списком файлов.

    курсовая работа [1,6 M], добавлен 22.08.2012

  • Использование операционных систем Microsoft Windows. Разработка операционной системы Windows 1.0. Возможности и характеристика последующих версий. Выпуск пользовательских операционных систем компании, доработки и нововведения, версии Windows XP и Vista.

    реферат [23,3 K], добавлен 10.01.2012

  • Принципы программирования файловой структуры в операционной системе Windows. Свойства и методы класса Tstream. Пример создания, чтения и записи потока. Чтение, запись и внутренняя структура файла. Пример чтения из файла, начиная с заданной позиции.

    курсовая работа [251,6 K], добавлен 18.05.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.