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

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

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

;thread1.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 Sleep: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

;Структура для передання параметрів у процедуру

THREAD_PARAM struc

fnam db "outputfile.dat",16 dup(0) ;ім’я файла для запису

str db "string for writing",13,11 dup(0) ;рядок для запису

nums dd 19

numrep dd 50000 ;число повторень запису рядку

THREAD_PARAM ends

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

COORD struc

xx dw 0

yy dw 0

COORD ends

.data

t_param THREAD_PARAM <>

con COORD <>

pThreadID dd 0

hThread dd 0

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

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

NumWri dd 0

string1 db "Thread creation",13,0

len1= $-string1

string2 db "Press <Enter> to terminate parent thread",13,0

len2= $-string2

string3 db "Child thread begins operation",13,0

len3= $-string3

string4 db "Child thread terminates operation",13,0

len4= $-string4

title_text db "Multythread application",0

numrow dw 1

time_sleep dd 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 ;якщо невдача

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

Set_cursor con,1,numrow,dOut,exit

inc numrow

push 0

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

;символів

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

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

push dOut

call WriteConsoleA

cmp eax,0

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

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

push offset pThreadID

push NULL

push offset t_param

push offset ThreadProc

push NULL

push NULL

call CreateThread

cmp eax,NULL

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

mov hThread,eax

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

push hThread

call CloseHandle

;------------Затримка у виконанні потоку---------------------------------------

push time_sleep

call Sleep

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

Set_cursor con,1,numrow,dOut,exit

inc numrow

push 0

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

;символів

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

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

push dOut

call WriteConsoleA

cmp eax,0

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

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

push 0

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

push len1 ;розмір буферу вводу

push offset string1

push dIn

call ReadConsoleA  

cmp eax, 0

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

exit:

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

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

push 0

call ExitProcess

start endp

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

ThreadProc proc

arg pt_param:DWORD

uses ebx,edi,esi

local @hFile:DWORD

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

Set_cursor con,1,numrow,dOut,exit_proc

inc numrow

push 0

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

;символів

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

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

push dOut

call WriteConsoleA

;Відчиняємо файл (CreateFileA)

push 0

push NULL ;атрибути (вони ігноруються)

push OPEN_ALWAYS ;відчинити або створити файл

push 0 ;захист файлу не потрібний

push FILE_SHARE_WRITE ;дозволено сумісне

;використання файлу (за записом)

push GENERIC_WRITE ;дозволено записувати у файл

push pt_param

call CreateFileA

cmp eax,0ffffffffh

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

mov @hFile,eax ;дескриптор файла

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

mov ebx,pt_param

mov edx,ebx

add edx,30

mov ecx,dword ptr[ebx+64]

jecxz exit_proc

cycl:

push ecx

push edx

;-----------Запись строки в файл (WriteFile)------------------------

push NULL ;синхронне введення

push offset NumWri ;покажчик на буфер з кількістю

;записаних байтів

push dword ptr [ebx+60] ;число байтів для виводу

push edx ;покажчик на рядок для запису

push @hFile ;дескриптор відчиненого файлу

call WriteFile

cmp eax,NULL

je exit_proc ;якщо неуспіх

pop edx

pop ecx

loop cycl

exit_proc:

;------------Закриття файла (CloseHandle)-------------------------------

push @hFile

call CloseHandle

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

Set_cursor con,1,numrow,dOut,exit_proc

inc numrow

push 0

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

;символів

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

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

push dOut

call WriteConsoleA

ret

ThreadProc endp

end start