`
deepfuture
  • 浏览: 4443025 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80550
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:71186
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:104493
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:288322
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15250
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:68850
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32777
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46482
社区版块
存档分类
最新评论

win32汇编快速入门

阅读更多

汇编可以开发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
9
1
分享到:
评论

相关推荐

    win32汇编语言入门

    ### Win32汇编语言入门知识点详解 #### 一、为何学习汇编语言? 学习汇编语言对于深入了解计算机系统的工作原理至关重要。它被视为计算机科学领域的一门基础学科,被比喻为计算机软件技术的“原子学说”。理解汇编...

    Win32汇编语言教程

    【Win32汇编语言教程】是一篇针对深入学习Win32平台汇编语言编程的指导性文章。在计算机编程领域,尽管C语言是开发Win32应用程序的常见选择,但在特定情况下,如系统底层操作、性能优化或病毒分析等,汇编语言显得...

    RadASM环境,win32汇编入门教程之十四

    在win32汇编入门教程之十四中,我们将探讨如何使用RadASM环境进行win32汇编的开发。RadASM提供了一个直观的用户界面和丰富的编辑功能,使得开发人员能够更加方便地编写、调试和编译汇编代码。本教程旨在帮助初学者...

    Win32汇编教程

    Win32汇编教程,入门的

    学习win32汇编-初级入门

    Win32应用程序虽然和其他32位应用程序(例如32位保护模式DOS程序)一样可以使用386汇编语言和保护模式编程,但是Win32应用程序的执行机制与其他32位应用程序有一定的差别,例如消息循环、动态链接等,Win32汇编语言...

    RadASM环境,win32汇编入门教程之九

    在《RadASM环境,win32汇编入门教程之九》中,教程将引导初学者深入理解如何使用RadASM环境来编写和调试win32汇编语言程序。win32汇编语言是一种低级语言,它允许程序员直接与计算机硬件进行交互,能够精确控制...

    RadASM环境,win32汇编入门教程之十三

    在深入探讨RadASM环境及其在win32汇编入门教程之十三中的应用之前,我们首先要对RadASM环境有一个基本的了解。RadASM是一个集成开发环境,主要用于Windows平台,它支持多种编程语言,特别是汇编语言。RadASM之所以受...

    RadASM环境,win32汇编入门教程之七

    在win32汇编入门教程之七中,将会继续深入探讨RadASM环境的使用,帮助初学者掌握win32汇编语言的更多高级特性。教程可能会从基础的win32 API调用开始讲起,比如如何创建窗口、如何响应用户输入、如何绘制图形界面等...

    RadASM环境,win32汇编入门教程之六

    RadASM环境和win32汇编入门教程之六不仅为初学者提供了一个全面、系统的编程环境和学习材料,而且通过实例和练习,引导用户逐步掌握win32汇编编程的核心技术和开发流程。只要认真学习和实践,用户最终将能够独立开发...

    RadASM环境,win32汇编入门教程之十

    本教程之十是RadASM环境下的win32汇编入门系列的一部分,它可能包括了从基础的环境搭建到编写简单的win32程序的实践指导。在这个阶段的学习中,读者可能已经熟悉了基本的汇编语法和程序结构,开始探索更高级的编程...

    win32汇编环境,RadAsm入门教程之三

    本教程作为“Win32汇编环境,RadAsm入门教程”系列的第三部分,旨在帮助初学者进一步熟悉RadASM环境的使用,并深入学习win32汇编编程。在本教程中,学习者将接触到RadASM的基本操作,如项目创建、源码编写、编译、...

    RadASM环境,win32汇编入门教程之四

    本教程,即RadASM环境下的win32汇编入门教程之四,将会继续深化读者对于win32汇编编程的理解。在前三部分的基础之上,本教程可能会涉及更多的编程细节和高级概念。比如,在本教程中,开发者可能会学习到如何定义和...

    Win32汇编下载汇编汇编汇编汇编汇编

    本资源包是针对"Win32汇编"的汇编语言编程学习资料,特别适合初学者入门和进阶。汇编语言虽然不如高级语言那样直观易读,但其直接控制硬件的能力使其在特定领域如系统编程、嵌入式开发等有着不可替代的地位。 汇编...

    RadASM环境,win32汇编入门教程之八

    本教程为RadASM环境下的Win32汇编入门系列教程的第八篇,旨在为初学者提供一个系统的入门指导。在这部分教程中,可能会涉及到RadASM的基本操作、界面布局、项目管理等基础知识。此外,为了帮助学习者更好地理解Win32...

    RadASM环境,win32汇编入门教程之十二

    《RadASM环境,win32汇编入门教程之十二》是这个系列教程中的一课,这一课可能专注于教授使用RadASM环境进行Win32汇编语言编程的进阶知识。在上一课的基础上,可能继续深入讲解如何使用RadASM环境进行项目管理、编译...

    RadASM环境,win32汇编入门教程之十一

    RadASM是一款集成开发环境,主要用于编译Win32汇编语言代码。Win32汇编语言是一种低级编程语言,它能够直接与计算机硬件交互,因此它的执行效率非常高,但是相对的编写和理解难度也较大。学习Win32汇编语言,对于...

    win32汇编环境,RadASM入门教程之一

    win32汇编环境与RadASM入门教程的核心在于帮助初学者快速熟悉win32汇编语言编程的基本概念和实践操作。通过本教程的学习,读者应该能够建立起一个基本的编程环境,并能够编写和调试简单的win32汇编程序。这不仅是...

    win32汇编环境,网络编程入门之三

    该教程内容通常包括win32汇编语言的基本语法、如何设置和配置win32汇编环境、网络编程的基本概念、以及如何在win32汇编环境下进行网络编程的入门级示例和操作。通过学习这方面的内容,读者可以逐步掌握如何用汇编...

    win32汇编环境,网络编程入门之二

    本篇教程的标题为“win32汇编环境,网络编程入门之二”,意味着它是入门级教程的延续,旨在帮助读者在掌握了基础知识后,进一步深入学习如何在win32环境下进行网络编程。读者应该已经具备一定的win32汇编知识以及对...

Global site tag (gtag.js) - Google Analytics