Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod_lab_ps_2_SPO_ch2_lab_rab (1).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
341.5 Кб
Скачать

Дотаток г Текст програми synchr3.Asm

;------------------------------------------------------------------------------

;synch3.asm - Win32 консольна программа

;для вивчення засобів синхронізації потоків в режимі ядра.

;------------------------------------------------------------------------------

.486

.model flat,STDCALL ;модель пам'яти flat,

;STDCALL - передача параметрів в стилі С (справа наліво),

;процедура, що викликається чистить за собою стек

%NOINCL ;заборонити виведення тексту файлів включення

include WindowConA.inc

;Об’явлення зовнішніми функцій Win32 (ASCII), що використовуються у програмі:

extrn AllocConsole:PROC

extrn SetConsoleTitleA:PROC

extrn SetConsoleCursorPosition:PROC

extrn ReadFile:PROC

extrn CloseHandle:PROC

extrn ExitProcess:PROC

extrn MoveFileA:PROC

extrn CreateFileA:PROC

extrn GetStdHandle:PROC

extrn WriteConsoleA:PROC

extrn ReadConsoleA:PROC

extrn WriteFile:PROC

extrn GetLastError:PROC

extrn CreateThread:PROC

extrn ExitProcess:PROC

extrn SwitchToThread:PROC

extrn Sleep:PROC

extrn InitializeCriticalSection:PROC

extrn WaitForSingleObject:PROC

extrnCreateEventA:PROC

extrn SetEvent:PROC

;Макрокос установки курсора у задану позицію

Set_cursor macro cursor,posx,posy,descr,lbl

mov cursor.xx,posx

push eax

mov ax,posy

mov cursor.yy,ax

pop eax

push cursor

push descr

call SetConsoleCursorPosition

cmp eax, 0

jz lbl ;якщо невдача

endm

;структура для установки положення курсору в консолі:

COORD struc

xx dw 0

yy dw 0

COORD ends

.data

con COORD <>

dummy dd 0 ;фіктивний аргумент функції потоку

pThreadID dd 0

hThread dd 0 ;дескриптор потоку 0

pThreadID1 dd 0

hThread1 dd 0 ;дескриптор потоку 1

hEvent dd 0 ;дескриптор події

dOut dd 0 ;дескриптор виводу консолі

dIn dd 0 ;дескриптор вводу консолі

str_out0 db "Client 0: ",0

len_out0=$-str_out0

str_out1 db "Client 1:",0

len_out1=$-str_out1

NumWri dd 0

buffer db 20 dup(0)

nbuff dd 20

title_text db "Synchronisation test",0

.code

start proc

;точка входу до програми:

;запит консоли

call AllocConsole

;перевіріти успіх запиту консолі

test ax,ax

jz exit ;якщо невдача

;Виведення заголовку консолі

push offset title_text

call SetConsoleTitleA

;-------отримати стандартний дескриптор виводу-----------------

push STD_OUTPUT_HANDLE

call GetStdHandle

mov dOut,eax ;у dOut-дескриптор виводу ;консолі

cmp eax, 0

jz exit ;якщо невдача

;-------отримати стандартний дескриптор введення--------------

push STD_INPUT_HANDLE

call GetStdHandle

mov dIn,eax ;у dIn-дескриптор введення консолі

cmp eax, 0

jz exit ;якщо невдача

;-----------Створення події-----------------------------------------------

push NULL

push TRUE

push FALSE

push NULL

call CreateEventA

cmp eax,NULL

je exit ;якщо невдача

mov hEvent,eax

;-----------Створення дочірніх потоків-------------------------------

push offset pThreadID

push NULL

push offset dummy

push offset ThreadProc

push NULL

push NULL

call CreateThread

cmp eax,NULL

je exit ;якщо невдача

mov hThread,eax

push offset pThreadID1

push NULL

push offset dummy

push offset ThreadProc1

push NULL

push NULL

call CreateThread

cmp eax,NULL

je exit ;якщо невдача

mov hThread1,eax

;--------очикування закінчення роботи потоків----------------------

push 0ffffffffh

push hThread

call WaitForSingleObject

push 0ffffffffh

push hThread1

call WaitForSingleObject

;-------вивести зміст буферу--------------------------------------------

Set_cursor con,1,5,dOut,exit

push 0

push offset NumWri ;кількість виведених на екран

; символів

push nbuff ;длина рядку для виводу на екран

push offset buffer ;адреса рядку для виводу на екран

push dOut

call WriteConsoleA

cmp eax,0

jz exit ;якщо невдача

;-------Перевести подію у вільний стан-------------------------------

push hEvent

call SetEvent

;-------очикування переводу каретки для виходу-------------------

push 0

push offset NumWri ;кількість виведених символів

push len_out0 ;розмір буферу введення

push offset str_out0

push dIn

call ReadConsoleA  

cmp eax, 0

jz exit ;якщо невдача

exit:

;-----------Закриття описувача дочірнього потоку-----------------

push hThread

call CloseHandle

push hThread1

call CloseHandle

;------------Вихід з програми-------------------------------------------

;підготовка виклику VOID ExitProcess(UINT uExitCode)

push 0

call ExitProcess

start endp

;--------------Процедура потоку 0 -------------------------------------

ThreadProc proc

arg param:DWORD

uses ebx,edi,esi

;-------Чекання події----------------------------------------------------

push 0ffffffffh

push hEvent

call WaitForSingleObject

;-------вивести повідомлення----------------------------------------

Set_cursor con,1,1,dOut,exit_proc

push 0

push offset NumWri ;кількість виведених

; на екран символів

push len_out0 ;довжина рядку для виводу на екран

push offset str_out0 ;адреса рядку для виводу на екран

push dOut

call WriteConsoleA

;-------ввести рядок-------------------------------------------------

push 0

push offset NumWri ;кількість введених символів

push nbuff ;довжина рядку для виводу на екран

push offset buffer ;адреса буферу для введеного рядку

push dIn

call ReadConsoleA

cmp eax,0

jz exit ;якщо невдача

exit_proc:

push hEvent

call SetEvent

ret

ThreadProc endp

;--------------Процедура потоку 1-------------------------------------------

ThreadProc1 proc

arg param:DWORD

uses ebx,edi,esi

;-------Чекання події---------------------------------------------------------------

push 0ffffffffh

push hEvent

call WaitForSingleObject

;-------вивести повідомлення----------------------------------------------------

Set_cursor con,1,3,dOut,exit_proc1

push 0

push offset NumWri ;кількість виведених

; на екран символів

push len_out1 ;довжина рядку для виводу на екран

push offset str_out1 ;адреса рядку для виводу на екран

push dOut

call WriteConsoleA

;------ввести рядок-----------------------------------------------------------------

push 0

push offset NumWri ;кількість введених символів

push nbuff ;довжина рядку для виводу на екран

push offset buffer ;адреса буферу для введеного рядку

push dIn

call ReadConsoleA

cmp eax,0

jz exit ;якщо невдача

exit_proc1:

push hEvent

call SetEvent

ret

ThreadProc1 endp

end start

61

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