汇编可以开发WINDOWS程序?答案是肯定的,用WIN32汇编语言开发出来的WINDOWS程序具有执行效率高、占用空间小等特点。
一、开发工具下载与安装
在众多WIN32汇编开发工具中,MASM32笔者比较偏爱,它具有很多代码示例和丰富的开发资源,在下列下载地址中选择一个地址下载MASM32。
二、知识预备
1、寄存器
为了提高运算速度和数据的存取速度,在计算机的CPU内,有一组硬件装置,第一个装置内存放CPU运算需要的数,这些数值可供CPU直接存取,这组装置叫寄存器。寄存器分为通用寄存器、段寄存器、程序指针寄存器、标志寄存器。
编程最常用就是通用寄存器,常用的通用寄存器有eax,ebx,ecx,edx,esi,edi等等,现代计算机的CPU一般是以32位为单位进行运算,因此一个寄存器最大能存放32位的二进制数。每个寄存器通常都有它默认的用法,所谓默认只是一种编程的习惯,你可以不遵守这些用法,但是有些情况下必须遵守,因为我们开发的是WINDOWS程序,要遵守WINDOWS操作系统的规定和汇编语法本身的约束,比如调用一个WINDOWSAPI函数,返回值放在EAX,堆栈的栈顶地址在esp,在汇编语言的循环中,ECX内存放循环的次数。具体寄存器的使用会在以后介绍。
2、堆栈
堆栈是个非常古老的概念,在DOS时代就有了,也是个非常重要的东西,程序没了它就活不了,堆栈就是在内存里分配一个区域,使用这个区域必须遵守一个规定:后进先出,后进来的先出去,可以把它想像成一个空木箱,首先往里面放棉衣,然后往里面放书,最后放上运动服。如果要取出书,必须得把最后放上的运动服取出,放的顺序是棉衣->书->运动服,取的顺序是运动服->书->棉衣,堆栈也是如此。
先解释一下什么是地址,内存价格的便宜和内存容量的扩大,WINDOWS虚拟内存早已出现,内存中放着众多的数据,必须要有方法表示内存某个地点,这个地点就用地址来表示。把内存以字节为单位划分,某个地址表示某个字节的地址,如左下图是一个内有4个成员的堆栈,堆栈里的成员以一个字节为单位(数的右边标明了以十六进制表示的地址,如1001)
+--+
|AF| 地址:AF21
+--+
|03| 地址:AF20
+--+
|30| 地址:AF19
+--+
|F1| 地址:AF18
+--+
堆栈是向下增长的,每增加一个成员,栈顶(堆栈顶部的地址)的地址减1,对于这个堆栈,栈顶地址是AF18,如果再往这个堆栈里增加一个成员的话,它的地址是:AF18-1=AF17。如果往这个堆栈里增加一个32位的数,栈顶的地址是多少呢,32位的数占4个成员的位置,栈顶的地址为:AF18-4=AF14。
在这个堆栈中增加一个32位数DAB0CD90,新的堆栈如下:
+--+
|AF| 地址:AF21
+--+
|03| 地址:AF20
+--+
|30| 地址:AF19
+--+
|F1| 地址:AF18
+--+
|DA| 地址:AF17
+--+
|B0| 地址:AF16
+--+
|CD| 地址:AF15
+--+
|90| 地址:AF14
+--+
如果从堆栈里拿走一个32位数,则栈顶的地址为:AF14+4=AF18
三、WIN32汇编语言的语法
为了方便大家理解和入门,下面尽量使用宏汇编和伪指令地方进行描述,也正因为有了宏汇编和伪指令的帮助,WIN32汇编才具有很多高级语言的特性,很多语法和C差不多。
1、WIN32汇编程序基本结构
.386
.MODEL Flat,STDCALL
.DATA
初始化值的全局变量定义
.DATA?
未初始化值的全局变量定义
.CONST
常量定义
.CODE
..............
...............
程序入口LABEL
............
............
end程序入口LABEL
2、变量定义
(1)定义全局变量
全局变量定义在.data和.data?内,
初始化变量的定义方式如下:
.data
变量名 类型 初始值1,初始值2,.......
变量名 类型 重复次数dup(初始值1,初始值2,....)
注意:如果用?表示初始值的话,则表示0
未初始化变量的定义方式是
.data?
变量名 类型 ?
(2)条件测试语句
(A)基本结构
.IF条件
程序代码
[.ELSEIF]条件比较
程序代码
.......
[.ELSE]
程序代码
.ENDIF
(3)操作符
(A)比较操作符
== 相等
!= 不等于
> 大于
>= 大于或等于
< 小于
<= 小于或等于
& 位测试
! 逻辑非
&& 逻辑与
|| 逻辑或
(B)位操作符
AND按位与
OR 按位或
XOR 异或
SHL逻辑左移
SHR逻辑右移
(C)标志寄存器操作符
CARRY?是否进位
OVERFLOW? 是否溢出
PARITY? 奇偶位是否置位
SIGN? 符号位标志位是否被置位
ZERO? 零位标志位是否置位
(4)循环语句
(A)while语句
while 条件
..........
..........
[.break[.if 退出条件]]
[.contine[.if 退出条件]]]
.end
(B)repeat语句
.repeat
...........
..........
[.break[.if 退出条件]]
[.contine[.if 退出条件]]]
.until 条件(或.untilcxz [条件])
(5)子程序定义
1、定义
子程序名 proc [距离][语言类型][可视区域][USERS 寄存器列表][,参数:类型]...[VARARG]local 局部变量列表
..............
...............
...............
子程序名 endp
2、如果在未定义前使用,要声明、
函数名 proto [距离][语言][参数1]:数据类型,[参数2]:数据类型,...............
(6)数据结构
(A)声明
wndclass struct
....
.....
......
wndclass ends
(B)定义
mystruct wndclass<1,1,...,1>
mystruct wndclass <>
(C)使用
mov eax,mystruct.lpfnwndproc
mov esi,offset mystruct
assume esi: ptr WNDCLASS
mov eax,[esi].lpfnwndproc
.......
assume esi:nothing
四、在WIN32汇编中的使用WINDOWS API
WIN32汇编如果没有API的帮助无法实现很多功能,笔者没见过在WIN32汇编程序不调用API的。
调用API实际上是靠堆栈来完成参数传递的,既然是堆栈,那就要遵守后进先出的原则,这意味API的第一个参数是最后一个放入堆栈的,最后一个参数是第一个放入堆栈的。
调用方式如下:
push 参数n
..........
push 参数2
push 参数1
call API函数名
为了简化代码,也可以使用以下这种方式调用API
invoke API函数名,参数1,参数2,.....,参数n
分享到:
相关推荐
### Win32汇编语言入门知识点详解 #### 一、为何学习汇编语言? 学习汇编语言对于深入了解计算机系统的工作原理至关重要。它被视为计算机科学领域的一门基础学科,被比喻为计算机软件技术的“原子学说”。理解汇编...
【Win32汇编语言教程】是一篇针对深入学习Win32平台汇编语言编程的指导性文章。在计算机编程领域,尽管C语言是开发Win32应用程序的常见选择,但在特定情况下,如系统底层操作、性能优化或病毒分析等,汇编语言显得...
Win32汇编教程,入门的
Win32应用程序虽然和其他32位应用程序(例如32位保护模式DOS程序)一样可以使用386汇编语言和保护模式编程,但是Win32应用程序的执行机制与其他32位应用程序有一定的差别,例如消息循环、动态链接等,Win32汇编语言...
本资源包是针对"Win32汇编"的汇编语言编程学习资料,特别适合初学者入门和进阶。汇编语言虽然不如高级语言那样直观易读,但其直接控制硬件的能力使其在特定领域如系统编程、嵌入式开发等有着不可替代的地位。 汇编...
Iczelion Hutch T$ ...这本教程是dREAMtHEATER结合自己多年的汇编经验整理而成,内容设计win32汇编编程的多个方面!如果你是入门级别,那么我绝对推荐你看!如果你是高手,我还是建议看一下,一定会有你关注的东西!
不错的Win32汇编教程, 适合初学者, 里面带有了相应的工具, 无需再另外下载了. 补充: 工具都集成在那个 chm 里面了,是在里面的连接下载的. 对于部分评论的网友请注意你的言语, 不要让人觉得你没有一点教养.
本书作者有十多年的汇编编程经验,很清楚初学者在哪些地方会遇到问题,所以本书在系统全面地介绍Win32汇编编程的同时,也穿插了很多作者的经验之谈,使读者能够快速入门并最终熟练地写出各种Windows应用程序。...
学了16位汇编的都来看一下这个把。对于掌握dos汇编转到windows下面来基本上都是API的调用了。。。该书是反汇编入门书籍。
win32汇编语言程序设计 入门必备 清华大学罗云彬chm
通过翻译和讲解Iczelion的MASM Win32汇编教程到FASM,本专题旨在为FASM爱好者提供一个入门级的学习资源,并计划将内容整理成电子书格式,方便大家学习Win32汇编编程。参考书籍《Iczelion的Win32汇编教程》被特别感谢...
《汇编语言》(Assembly Language)是计算机专业中一门重要的基础课程,是一种面向机器的低级语言。它依赖于硬件,能通过巧妙的程序设计充分发挥硬件的潜力。汇编语言程序产生的代码运行效率高。因此,到目前为止,...
本书作者有十多年的汇编编程经验,很清楚初学者在哪些地方会遇到问题,所以本书在系统全面地介绍Win32汇编编程的同时,也穿插了很多作者的经验之谈,使读者能够快速入门并最终熟练地写出各种Windows应用程序。...
学习Win32汇编语言的一本好书,入门者的好书,建议感兴趣的同学学一下
需要注意的是,虽然Win32 API主要使用C语言进行编程,但其API也可被其他支持C调用约定的编程语言所调用,如C++、Java和汇编语言。尽管如此,本教程不会专门教授C语言或特定编译器的使用,而是假定读者已有一定的编程...
本书作者有十多年的汇编编程经验,很清楚初学者在哪些地方会遇到问题,所以本书在系统全面地介绍Win32汇编编程的同时,也穿插了很多作者的经验之谈,使读者能够快速入门并最终熟练地写出各种Windows应用程序。...
汇编语法大全,汇编从入门到精通。参考在手一切ok
正是因为如此,笔者决心把本书的目标定为:能让读者入门并在最后能熟练掌握Win32汇编编程,而不是那种深入系统奥秘一类的书籍。 从这个目标出发,本书的选材中尽量去掉已经有其他书籍详细讨论的部分,因为要一本书...
现在使用汇编的场合确实越来越少,但是汇编的重要性大家都稍微了解一点,这个是个人学习过程当中,认为比较好的资料,所以分享一下。