fasm 控制台多线程示例

这是一个使用fasm编写的控制台应用程序,演示如何创建和管理多线程来并行计算数值。程序将计算0到N的和分成两部分,由两个独立的线程分别处理,然后将结果合并。线程通过调用`CreateThread`创建,并使用`WaitForMultipleObjects`同步。计算过程包含一个简单的加法循环,并提供了暂停功能。
摘要由CSDN通过智能技术生成
 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;*--==--* 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'
 

原作者网站http://www.xuyibo.org ,感谢徐艺波辛苦整理写出的该技术手册,为我等FASM学习者提供了良好的参考资料。目前FASM学习资料实在是无比匮乏,网上也鲜见。这个技术手册无疑是雪中送炭,再洗感谢原作者。 1. 简介 1.1 编译器概述 1.1.1 系统需求 1.1.2 编译器使用 1.1.3 编译器选项 1.1.4 在命令行下执行编译器 1.1.5 命令行编译器消息 1.1.6 输出格式 1.2 汇编语法 1.2.1 指令语法 1.2.2 数据定义 1.2.3 常数和标号 1.2.4 数值表达式 1.2.5 跳转和调用 1.2.6 操作数尺寸设置 2. 指令集 2.1 x86 体系指令 2.1.1 数据传送指令 2.1.2 类型转换指令 2.1.3 二进制算术指令 2.1.4 十进制算术指令 2.1.5 逻辑指令 2.1.6 控制转移指令 2.1.7 I/O 指令 2.1.8 字符串操作指令 2.1.9 标志控制指令 2.1.10 条件操作指令 2.1.11 其他指令 2.1.12 系统指令 2.1.13 FPU 指令 2.1.14 MMX 指令 2.1.15 SSE 指令 2.1.16 SSE2 指令 2.1.17 SSE3 指令 2.1.18 AMD 3DNOW!指令 2.1.19 x86-64长模式指令 2.2 控制伪指令 2.2.1 数值常量 2.2.2 条件汇编 2.2.3 重复块指令 2.2.4 地址空间 2.2.5 其他伪指令 2.2.6 多遍扫描 2.3 预处理伪指令 2.3.1 包含源文件 2.3.2 符号常量 2.3.3 宏指令 2.3.4 结构 2.3.5 重复宏指令 2.3.6 条件宏指令 2.3.7 处理顺序 2.4 格式伪指令 2.4.1 MZ 格式 2.4.2 PE 格式 2.4.3 COFF 格式 2.4.4 ELF 格式 3. Windows 编程 3.1 基本头文件 3.1.1 结构 3.1.2 导入表 3.1.3 过程 3.1.4 导出表 3.1.5 COM(组件) 3.1.6 资源 3.1.7 字符编码 3.2 扩展头文件 3.2.1 过程参数 3.2.2 结构化源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值