;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;*--==--* fasm console MultiThread example
;*--==--* By G-Spider
;*--==--* fasm mt.asm mt.exe
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
format PE console
entry start
include 'win32a.inc'
;sum=0;
;for (i=0;i<N;i++)
; sum=sum+i;
;sum1=0;
;for (i=0;i<=M;i++)
; sum1=sum1+i;
;sum2=0;
;for (i=M+1;i<=N;i++)
; sum2=sum2+i;
;sum=sum1+sum2;
INFINITE = -1
N = 10000 ;求sum=0+1+..+N ,注意N不能过大,否则溢出
;在主线程中,创建两个计算线程,将N分成两段,如上所示。
;---------------------------------------------
section '.text' code readable executable
start:
xor esi,esi
@@:
xor eax,eax
push esi
shl esi,3
add esi,dwParam
invoke CreateThread,eax,eax,ThreadProc,esi,eax,eax
pop esi
mov [hTrd+esi*4],eax
inc esi
test esi,1
jnz @B
invoke WaitForMultipleObjects,2,hTrd,TRUE,INFINITE
xor eax,eax
add eax,[dwParam+16]
add eax,[dwParam+24]
cinvoke printf,szFmt,eax
cinvoke system,szPause
ret
proc ThreadProc uses esi,lParam
mov esi,[lParam]
stdcall SumFunc,[esi],[esi+4]
mov [esi+16],eax
ret
endp
proc SumFunc n1,n2
;invoke Sleep,5000
xor eax,eax
mov ecx,[n1]
mov edx,[n2]
@@:
cmp ecx,edx
ja A1
add eax,ecx
inc ecx
jmp @B
A1:
ret
endp
;---------------------------------------------
section '.data' data readable writeable
hTrd rd 2
dwParam dd 0,N/2,N/2+1,N,0,0,0
szFmt db 'sum=%d',0ah,0
szPause db 'pause',0
;---------------------------------------------
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
msvcrt,'msvcrt.dll'
import msvcrt,\
printf,'printf',\
system,'system'
include 'api\kernel32.inc'
fasm 控制台多线程示例
最新推荐文章于 2024-04-17 10:09:48 发布
这是一个使用fasm编写的控制台应用程序,演示如何创建和管理多线程来并行计算数值。程序将计算0到N的和分成两部分,由两个独立的线程分别处理,然后将结果合并。线程通过调用`CreateThread`创建,并使用`WaitForMultipleObjects`同步。计算过程包含一个简单的加法循环,并提供了暂停功能。
摘要由CSDN通过智能技术生成