- 浏览: 4332147 次
- 性别:
- 来自: 湛江
博客专栏
-
SQLite源码剖析
浏览量:79402
-
WIN32汇编语言学习应用...
浏览量:68349
-
神奇的perl
浏览量:101473
-
lucene等搜索引擎解析...
浏览量:281118
-
深入lucene3.5源码...
浏览量:14595
-
VB.NET并行与分布式编...
浏览量:65542
-
silverlight 5...
浏览量:31309
-
算法下午茶系列
浏览量:45189
文章分类
最新评论
-
yoyo837:
counters15 写道目前只支持IE吗?插件的东西是跨浏览 ...
Silverlight 5 轻松开启绚丽的网页3D世界 -
shuiyunbing:
直接在前台导出方式:excel中的单元格样式怎么处理,比如某行 ...
Flex导出Excel -
di1984HIT:
写的很好~
lucene入门-索引网页 -
rjguanwen:
在win7 64位操作系统下,pygtk的Entry无法输入怎 ...
pygtk-entry -
ldl_xz:
http://www.9958.pw/post/php_exc ...
PHPExcel常用方法汇总(转载)
在WINDOWS系统能用到汇编的机会不多,基本都可以用C或C++代劳,更何况现在MICROSOFT的Visual Studio 系列工具非常强大,WINDOWS下的开发已经在向.NET方面发展,实际调用WINDOWS SDK的机会也不多。 WIN32汇编编写窗口程序需要调用大量的WINDOWS 的API,而且提供了高级语言才有的条件语句和循环语句,难度相对于LINUX下的AT&T汇编要小很多。
因此,在此只简单介绍一下,首先来看一段简单的窗口程序。注意";"表示注释
;加上注释和个人理解 .386 .model flat,stdcall option casemap:none ;以下定义INCLUDE文件 include winows.inc include gdi32.inc includelib gdi32.lib include user32.inc includelib user32.lib include kernel32.inc include kernel32.lib ;以下定义数据段 .data ? ;定义变量 hinstance dd ? hwinmain dd ? .const ;定义常量,字符串全部要以0结尾,因为在内存中0是字符串的结束符 szclassname db 'billclass',0 szcaptionmain db 'bill's firt program',0 sztext db 'WIN32汇编,BILL!!!!',0 ;以下是代码段 .code ;定义窗口过程 _procwinmain proc uses ebx edi esi,hwnd,umsg,wparam,lparam ;定义局部变量用关键字local local @stps:PAINTSTRUCT local @strect:PAINTSTRUCT local @hdc mov eax,umsg ;取得传入过程的消息变量值 ;-----------下面开始根据消息类型的不同作出不同的处理 .if eax == WM_PAINT ;如果消息是窗口绘制 invoke BeginPaint,hwnd,addr@stRect;WIN32汇编调用API程序后,API程序将返回值放在EAX中, ;客户区准备 mov @hdc,eax;取得设备句柄 invoke GetclientRect,hwnd,addr @stRect;addr是取变量的地址但只能用在INVOKE语句中且 ;不能同时使用 ;EAX寄存器传参数,因为ADDR会用到EAX。 ;此API的含义是取得描述客户区的结构放在@stRect invoke drawText,@hdc,addr sztext,-1,addr @stRect,\ DT_SINGLELINE or DT_CENTER or DT_VCENTER ;语句换行符是\,显示'WIN32汇编,BIL ;L!!!!',并设置其为单行DT_SINGLE ;等等LINE invoke EndPaint,hwnd,addr @stPs .elseifmeax==WM_CLOSE invoke DestroyWindow,hwinmain ;销毁窗口 invoke PostQuitMessage,Null ;向消息循环中发出退出消息 .else invoke DefWindowProc,hwnd,uMsg,wPara,lParam;如果不是上述消息,则执行WINDOWS标准的默认消息处 ;理,如键盘等消息 ret;返回 .endif xor eax,eax ;eax清0 ret _ProcWinMain endp ;以上这个子程序处理窗口消息的,是窗口的回调函数,该项函数不是我们调用,是由WINDOWS调用用来处理 ;窗口消息的,我们调用的是DispatchMessage,DispatchMessage再回过头来调用窗口过程。 _WinMain Proc ;主程序 local @stWndClass:WNDCLASSEX local @stmsg:MSG invoke GetModuleHandle,Null ;得到应用程序句柄 mov hInstance,eax ;将应用程序的句柄放入hInstance变量 invoke RtlZeroMemory,addr @stWndClass,sizeof WndClassEX ;msdn的解释TheRtlZeroMemory routine ;fills a block of memory with zeros,即 ;0填充stWndClass结构变量所占的内存,也就是初始化 ;-----下面注册窗口类 invoke loadcursor,0,IDC_ARROW ;加载箭头形指针句柄 mov @stWndClass.hCursor,eax ;鼠标指针赋值 push hInstance pop @stWndClass.hInstance ;窗口句柄赋值 mov @stWndClass.cbsize,sizeof WNDCLASSEX ;结构大小 mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW ;设置窗口样式 mov @stWndClass.lpfnwndproc,offset _procwinmain;设置回调函数,也就是窗口消息处理过程 mov @stwndclass.hbrbackground,COLOR_WINDOW+1 mov @stwndclass.lpszclassname,offset szclassname ;设置窗口类的名称 invoke RegisterClassEx,addr @stwndclass ;传上述设置好的结构以注册窗口类 ;建立显示窗口 invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ offset szclassname,offsetszcaptionmain,\ WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,\ NULL,hinstance,NULL ;建立窗口并返回句柄在EAX中 mov hwinMain,eax ;刚创建的窗口句柄赋值 invoke showwindow,hwinmain,SW_SHOWNORMAL ;显示窗口 invoke updatewindow,hwinmain ;刷新窗口客户区,导致客户区窗口paint ;消息循环,win32汇编得自行建立WINDOWS消息循环,不过这样更自由,可以彻底地控制程序 .while true invoke GetMessage,addr @stMsg,null,0,0 ;WINDOWS在系统内部有个系统消息队列, ;并为每个应用程序还维护了一个消息队列,将这些属于这些程序窗口范围内的 ;系统消息发到该应用程序消息队伍中,这个API的作用就是从自己的应用程序 ;消息队伍中接收消息。 .break .if eax==0 ;If the function retrieves the WM_QUIT message, the return value is zero. ;invoke Translate(msdn),也就是说,当程序退出里,消息队伍里会有WM_QUIT消息, ;就退出循环,意味着退出程序。 invoke translatemessage,addr @stmsg;由应用程序对消息进行预处理,如把基于键盘扫描码的按键消息黑心 ;换成ASCII码的键盘消息等 invoke dispatchmessage,addr@stmsg ;将预处理好的消息发给WINDOWS,WINDOWS将其分派给该程序的相应窗;口处理过程处理,那么WINDOWS怎么知道窗口处理过程在哪呢,刚才不是已经注册过窗口类了,这就是为什么窗口;类要注册的原因了,那么为什么不能由程序自己处理消息,非得发给WINDOWS呢,其一、一个应有程序的窗口很多,如果自己处理的话,得建立一个窗口列表,上面记录每个窗口的窗口处理过程。其二、WINDOWS对于一些实时性很;强的信息采用直接调用窗口处理过程的方法。 .endw ret _winmain endp ;没有下面的代码程序无法执行,因为START语句指定程序启动的入口点 start: call _winmain invoke ExitProcess,NULL;退出 end start
可以看到上面代码和用C编写的WIN SDK程序很相似。我们接着继续看2个例子:
例1:用WIN32汇编构建第一个WINODWS程序,这个程序完成显示一个带问号的对话框,对话框的内容是现在系统时间。
首先,打开MASM32Editor(在桌面上可以找到图标),在里面输入以下代码:
.386 .model flat, stdcall option casemap :none ;################################################################# include windows.inc include user32.inc include kernel32.inc include gdi32.inc include masm32.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib includelib masm32.lib ;################################################################# .data? szbuffer db 100 dup(?) .data szcaptionName db "我的HELLO,WORLD!",0 szbegin db "现在时间:" sztext db 100 dup(?) ;################################################################# .code start: ;程序的入口 call _callgetnow invoke MessageBox,NULL,offset szbegin,offsetszcaptionName,MB_ICONQUESTION or MB_OK invoke ExitProcess,eax ;################################################################# _callgetnow proc pushad invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100 invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100 invokeszCatStr,addr sztext,addr szbuffer popad ret _callgetnow endp ;################################################################# end start
将上述代码保存为HELLOWORLD.ASM后,对程序进行编译。
在编译前参照下图设置好系统的环境变量,path变量加上x:\masm32\bin,lib变量加上x:\masm32\lib,include变量加上x:\masm32\include。
确环境变量设置好后,进入DOS窗口开始编译。
首先运行ml,编译成coff文件格式
然后运行LINK,进行链接,生成EXE文件,
大功造成,运行一下试试效果吧!
例2:系统时间直接显示在桌面上。程序源代码如下:
.386 .model flat, stdcall option casemap :none ;######################################################################### include windows.inc include user32.inc include kernel32.inc include gdi32.inc include masm32.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib includelib masm32.lib ;######################################################################### .data? szbuffer db 100 dup(?) .data szmssucesscap db "HELLO,WORLD!深入",0 szmssucesstext db "在桌面的(300,300)处显示了当前时间",0 szmscap db "错误",0 szmstext1 db "无法在桌面上显示!",0 szmstext2 db "无法得到全屏DC!",0 szbegin db "现在时间:" sztext db 100 dup(?) ;######################################################################### .code start: ;程序的入口 _showtext proto :DWORD call _callgetnow invoke _showtext,offset szbegin invoke ExitProcess,eax ;######################################################################### _callgetnow proc pushad invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100 invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100 invokeszCatStr,addr sztext,addr szbuffer popad ret _callgetnow endp ;######################################################################### _showtext proc lpsztext:DWORD LOCAL@Desktopdc:HDC LOCAL@dwcolor:DWORD pushad mov@dwcolor,00FF0000h invokeGetWindowDC,NULL cmpeax,0 jne @f invokeMessageBox,NULL,offset szmstext2,offset szmscap,MB_ICONERROR @@: mov@Desktopdc,eax invokelstrlen,lpsztext movebx,eax invokeSetBkMode,@Desktopdc,TRANSPARENT invokeSetTextColor,@Desktopdc,@dwcolor invokeTextOut,@Desktopdc,300,300,lpsztext,ebx invokeMessageBox,NULL,offset szmssucesstext,offsetszmssucesscap,MB_ICONINFORMATION cmpeax,0 jne @f invokeMessageBox,NULL,offset szmstext1,offset szmscap,MB_ICONERROR @@: popad ret _showtext endp ;######################################################################### end start
以上程序中有几个重要的GDI相关的API,下面简要介绍一下
(1)
invoke SetBkMode,@Desktopdc,TRANSPARENT
设置背景方式为透明
(2)
invoke SetTextColor,@Desktopdc,@dwcolor
设置字体颜色为蓝色
(3)
invoke TextOut,@Desktopdc,300,300,lpsztext,ebx
在300,300处显示文本
(4)
invoke GetWindowDC,NULL
取得桌面DC
(5)
mov @dwcolor,00FF0000h
设置颜色为蓝色。@dwcolor是一个DWORD型的变量,
可以在相关头文件中找到这样的定义:
typedef DWORD COLORREF;
因此COLORREF类型的变量就是DWORD型变量。
因此COLORREF类型的变量就是DWORD型变量。
COLORREF变量如何表示颜色呢,只有一个双字大小,它的表示格式是(16进制):
0x00bbggrr
bb表示蓝色,gg表示绿色,rr表示红色
00FF0000h:蓝
0000ff00h:绿
000000FFh:红
扩展阅读 :
《Windows环境下32位汇编语言程序设计》 罗云彬
如果转载请注明来源,如有错误之处,请及时指出
发表评论
-
R语言与数据分析
2015-05-15 20:58 2064当今计算机系统要处理的数据类型变得多种多样,并且为了深入理 ... -
机器学习实践指南:案例应用解析
2014-04-17 19:53 1005试读及购买链接 《机器 ... -
matlab-矩阵合并
2013-06-10 13:56 3125a = 1 2 3 2 -
人工智能与数据分析所需要的知识
2013-04-30 18:27 292想较好得在数据分析和人工智能相关领域发展,最好具备以下基础: ... -
麦哈普的AI乐园【myhaspl@qq.com】我的另一个博客(机器学习、数据分析、智能计算的原创)
2013-04-28 10:52 11http://blog.csdn.net/u0102556 ... -
R-并行计算
2013-04-28 10:50 6061啊。。。找了一下,R 居然真的有办法可以多cpu平行运算!! ... -
谱聚类
2013-04-11 10:44 26641. 谱聚类 给你博客园上若干个博客,让你将它 ... -
对变化建模-用差分方程-动力系统及常数解
2013-04-09 15:24 1385差分表示在一个时间周期里考察对象的变化量。 差分表示在一个时 ... -
逻辑斯蒂映射-伪随机数
2013-04-04 15:28 3310逻辑斯蒂映射的形式为 x_(n+1)=ax_n( ... -
matlab-多项式乘除法及式子和导数
2013-03-21 15:06 4580>> a=[22 12 4 54] ... -
matlab-数组-元胞数据与结构数组
2013-03-20 17:45 3224y、z是元胞数组,num2cell完成由数值数组到元胞数组的 ... -
矩阵-范数
2013-03-13 17:30 1846>> a a = 12 33 ... -
向量-范数
2013-03-13 16:06 2264>> b=a(3,:) b = 22 ... -
矩阵-求逆
2013-02-27 15:51 2459设R是一个交换环,A是 ... -
lisp-猜数字算法与全局函数、变量
2013-01-30 17:55 1608* (defvar *big* 100) *BIG* ... -
开源 Lisp 相关项目
2013-01-19 22:38 3849IOLib 项目 (http://common-lisp.n ... -
四分位数求法
2012-11-22 20:18 2793四分位数间距:是上四分位数与下四分位数之差,用四分位数间距可反 ... -
matlab-神经网络-自定义多层感知器解决异或(2)
2012-10-10 22:33 2448继续定义单元神经元 net.inputs{i}.ran ... -
matlab-神经网络-自定义多层感知器解决异或(1)
2012-10-09 22:41 5133>> net=network net = ... -
matlab-模态对话框
2012-10-05 16:59 3481modal dialog box with the comm ...
相关推荐
(依照实验内容,逐条撰写实验过程与实验所得结果:包括程序总体设计,核心数据结构及算法流程,调试过程。请附上核心代码,及注意格式排版的美观。实验提交时,以上为评分依据,请不删除本行) 程序总体设计 核心...
可能是最快的算法alpha-blend汇编源代码,排序算法数据结构.doc
sound-of-sorting-0.6-win32,可以查看各种排序算法具体过程,排序的视觉盛宴,适合研究数据结构算法等的学生观看。
win32汇编语言实现冒泡排序,全部的代码插入在文档的最下面。
MATLAB-遗传算法-多车场-开放式-带时间窗-多商品-VRP问题,解压后直接运行。MATLAB-遗传算法-多车场-开放式-带时间窗-多商品-VRP问题,解压后直接运行。
试验三 LC-3汇编语言试验1 求成绩等级 实验内容: (1)分析和理解试验指定的需解决问题。 (2)利用LC-3的汇编语言代码设计实现相关程序。 (3)通过LC-3仿真器调试和运行相关程序并得到正确的结果 实验要求 (1...
tasm32 Win32汇编 编译器下载 tasm32是Borland公司开发的Win32汇编编译器,被广泛用于各种等编译器,用作中间过渡编译。它也能独立的编译纯汇编或是Win32Asm的代码。具有编译快速,高效的特点,至今依然是汇编开发...
资源来自网络,经过我的配置,可完整运行,实现DPM算法对行人的检测,是一个一个完整的实现,含有注释和完整的工程文件,环境为win7+vs2013+matlab2016b,其他版本MATLAB也可
eclipse IDE 的最新安装包,官网下载比较慢
数据结构,算法与应用 ---C++语言描述(代码与习题答案)数据结构,算法与应用 ---C++语言描述(代码与习题答案)
用win32汇编实现hmac_md5算法 代码+程序+参考资料 原载与编程中国http://www.bccn.net/
CRC-16 和 CRC-32 算法的汇编源代码
粒子群算法及其工业应用-钱锋著,是本电子书,讲解的比较详细
对于STM32F1这样的无浮点运算单元的单片机来说采用浮点计算对数非常的耗时,本代码采用汇编程序在STM32F1上实现定点64bit的高精度cordic算法计算对数,加快了运算时间
DES算法的汇编语言程序,包括算法描述及功能实现!
易语言adler32算法汇编源码,adler32算法汇编,adler32
本资源采用标准粒子群算法对3-5-3多项式进行轨迹优化,目标函数为时间最优,程序为matlab代码,仅供学习参考
国科大-算法设计与分析-卜东波-2017-2018期末考试试卷国科大-算法设计与分析-卜东波-2017-2018期末考试试卷
第四章 MCS-51汇编语言程序设计第四章 MCS-51汇编语言程序设计4.1 汇编语言程序设计概述单片机原理及系统设计单片机原理及系统设计汇编语言和高级语言的