fasm 控制台多线程示例

来源:互联网 发布:大义觉迷录 知乎 编辑:程序博客网 时间:2024/05/21 10:42
 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;*--==--* fasm console MultiThread example;*--==--* By G-Spider;*--==--* fasm mt.asm mt.exe;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>format PE consoleentry startinclude '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 = -1N = 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     retendpproc 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:     retendp;---------------------------------------------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'