Win32汇编.docx

上传人:b****3 文档编号:3746214 上传时间:2022-11-25 格式:DOCX 页数:18 大小:25.45KB
下载 相关 举报
Win32汇编.docx_第1页
第1页 / 共18页
Win32汇编.docx_第2页
第2页 / 共18页
Win32汇编.docx_第3页
第3页 / 共18页
Win32汇编.docx_第4页
第4页 / 共18页
Win32汇编.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Win32汇编.docx

《Win32汇编.docx》由会员分享,可在线阅读,更多相关《Win32汇编.docx(18页珍藏版)》请在冰豆网上搜索。

Win32汇编.docx

Win32汇编

Win32汇编学习笔记

一.Win32汇编中的程序结构

1>程序模式和源程序格式的定义

.386:

定义程序中使用的指令集

.model:

定义程序工作的模式

使用方法为.model内存模式[,语言模式][,其它模式]

内存模式:

定义最后生成可执行文件的大小

语言模式:

指定子程序的调用方式(Win32下是stdcall)

option语句:

选项定义

optioncasemap:

none定义程序中变量名与子程序名是否对大小写敏感

2.段的定义

1>数据段

.data.data?

.const定义的是数据段

.data:

定义可读可写的已定义变量,.data段一般存放在可执行文件的_DATA节区内

.data?

:

定义可读可写的未定义变量,.data?

段一般存放在可执行文件的_BBS节区内

.const:

定义一些常量,它是可读但不可写的

2>代码段

.code:

所有的指令必须存放在代码段,代码段一般是存放有可执行文件的_TEXT节区中,它是可读但不可写的

3>堆栈段

Win32程序中不必定义堆栈段,系统会自动分配堆栈空间,它的内存属性是可读可写并且是或执行的

(缓冲区溢出技术用到了这个特征)

3.程序的入口

C语言中程序从main函数开始执行,而在汇编程序中,程序员可以指定任一一个地方开始执行,

这个地方同由程序最后一句以end语句来来指定

4.注释与换行

汇编中注释以(;)分号开始

汇编中换行以(\)号做换行符

总结:

一个汇编程序的结构

;程序指令集与模式的定义

.386

.modelflat,stdcall;内存模式定义为'平滑',语言模式定义为stdcall

optioncasemap:

none;定义程序中变量名与子程序名是否对大小写敏感

……

;数据段

.data

<一些初始化过的变量的定义>

.data

<一些未初始化过的变量的定义>

.const

<一些常量的定义>

:

代码段

.code

<代码>

<开始标号>

<其它语句>

end开始标号

1.WindowsAPI

Win32API的核心由3个DLL提供不同的系统功能

.Kernel32.dll--系统服务功能。

包括内存管理,任务管理,动态链接库

.User32.dll--用户接口服务。

建立窗口和传送消息等

.Gdi32.dll--图形设备接口。

2.汇编中调用Win32API

1>include语句

对于所有要用到的API函数,在程序的开始部分都要必须预先声明,为的简化操作汇编中引入的include伪指令引入所要调用API函数据头文件

2>includelib语句

告诉链接器在链接时到指定的库文件中找API函数的位置信息

3>invoke伪指令

为了简化API函数大量参数入栈操作,提供了invoke伪指令,用于调用执行Win32API函数

3.标号,变量和数据结构

1>标号:

汇编程序中用来表示跳转的目的地,相同的标号只能在同一个子程序内,MSAM中可以用@@做标号,

在程序后面可以用@F和@B来引用它,@F表示本条指令后的第一个@@标号,@B表示本条指令前的第一个

@@标号

2>变量:

变量的类型

变量名称表达方式缩写长度(长度)

字节Bytedb1

字WordDw2

双字DwordDd4

三字Fworddf6

四字QwordDq8

十字节TbyteDt10

有符号字节Sbyte1

有符号字Sword2

有符号双字Sdword4

单精度浮点数Real44

双精度浮点数Real88

10字节浮点数Real1010

全局变量:

其作用域是整个程序,定义在.data或者.data?

段中

局部变量:

其作用域是子程序,用local伪指令来定义,一般定义在子程序伪指令proc后,因为

局部变量的起始值是随机的,所以建议局部变量初始化。

变量的尺寸和数量:

sizeof可以获取变量的长度,lengthof可以取得变量中数量的项数

获取变量的地址:

1>.对于全局变量mov寄存器,offset变量名

2>.对于局部变量leaeax,[ebp-4]该指令可以在运行时按时ebp的值实际计算出地址放到eax中

3>.当用invoke调用函数时获取变量的地址用addr伪指令,addr会根据变量是全局或局部自动调用offset或lea指令,此时它做参数时左边不能有eax做参数,否则提示eax寄存器内容被重写

3>数据结构:

(多个数据组成的数据"样板")

4>标号与变量的命名规范:

(1)可以用字母,数字,下划线及符号@,$和?

.

(2)第一个符号不能是数字

(3)长度不能超过240个字符

(4)不能使用指令名等关键字

(5)在作用域内必须惟一

4.汇编中子程序

1>.子程序的定义

子程序名proc[距离][语言类型][可视区域][USES寄存器列表][,参数:

类型]……[VARARG]

Local局部变量列表

指令

子程序名endp

距离:

可以是NEAR,FAR,NEAR16,NEAR32,FAR16,FAR32,在Win32平坦的段中,往往忽略对它的定义

语言类型:

表示参数的使用方式和堆栈平衡的方式

可视区域:

可以是PRIVATE,PUBLIC,和EXPORT。

PRIVATE和PUBLIC与C,C#的访问操作符作用类似

USES寄存器列表:

表示由寄存器在子程序指令开始前自动安排push这些寄存器的指令,并且在ret

前自动安排pop指令用于保存执行环境

参数和类型:

参数指参数的名称

2>参数传递与堆栈平衡

不同的语言类型下堆栈平衡方式

5.汇编中的高级语法

1>条件测试语句

寄存器或变量操作符操作数(ex:

x==3;x等于3eax!

=3;eax不等于3)

条件测试语句的限制:

表达式的左边只能是变量或寄存器,不能为常数,不能同时为变量,但可以同时为

寄存器

注:

它与C语言采用相同的语法

2>分支语句

语法:

.if条件表达式1

表达式1为"真"时执行的指令

[.elseif条件表达式2]

表达式2为"真"时执行的指令

[.elseif条件表达式3]

表达式3为"真"时执行的指令

……

[.else]

所有表达式为"否"时执行的指令

.endif

3>循环语句

语法:

.while条件测试表达式

指令

[.break[.if退出条件]]

[.continue]

.endw相当与C中的While语句

.repeat

指令

[.break[.if退出条件]]

[.continue]

.until条件测试表达式(或.untilcxz[条件测试表达式])相当于C中的do……while语句

6.汇编中代码的风格

1>变量和函数的命名

函数与变量的命名用匈牙利表示法,全局变量在参数的前面加下划线,在全局变量前加@符号,

在内部子程序的名称前面加下下划线以便和系统API区别

一.Win32汇编中的程序结构

1>程序模式和源程序格式的定义

.386:

定义程序中使用的指令集

.model:

定义程序工作的模式

使用方法为.model内存模式[,语言模式][,其它模式]

内存模式:

定义最后生成可执行文件的大小

语言模式:

指定子程序的调用方式(Win32下是stdcall)

option语句:

选项定义

optioncasemap:

none定义程序中变量名与子程序名是否对大小写敏感

2.段的定义

1>数据段

.data.data?

.const定义的是数据段

.data:

定义可读可写的已定义变量,.data段一般存放在可执行文件的_DATA节区内

.data?

:

定义可读可写的未定义变量,.data?

段一般存放在可执行文件的_BBS节区内

.const:

定义一些常量,它是可读但不可写的

2>代码段

.code:

所有的指令必须存放在代码段,代码段一般是存放有可执行文件的_TEXT节区中,它是可读但不可写的

3>堆栈段

Win32程序中不必定义堆栈段,系统会自动分配堆栈空间,它的内存属性是可读可写并且是或执行的

(缓冲区溢出技术用到了这个特征)

3.程序的入口

C语言中程序从main函数开始执行,而在汇编程序中,程序员可以指定任一一个地方开始执行,

这个地方同由程序最后一句以end语句来来指定

4.注释与换行

汇编中注释以(;)分号开始

汇编中换行以(\)号做换行符

总结:

一个汇编程序的结构

;程序指令集与模式的定义

.386

.modelflat,stdcall;内存模式定义为'平滑',语言模式定义为stdcall

optioncasemap:

none;定义程序中变量名与子程序名是否对大小写敏感

……

;数据段

.data

<一些初始化过的变量的定义>

.data

<一些未初始化过的变量的定义>

.const

<一些常量的定义>

:

代码段

.code

<代码>

<开始标号>

<其它语句>

end开始标号

1.WindowsAPI

Win32API的核心由3个DLL提供不同的系统功能

.Kernel32.dll--系统服务功能。

包括内存管理,任务管理,动态链接库

.User32.dll--用户接口服务。

建立窗口和传送消息等

.Gdi32.dll--图形设备接口。

2.汇编中调用Win32API

1>include语句

对于所有要用到的API函数,在程序的开始部分都要必须预先声明,为的简化操作汇编中引入的include伪指令引入所要调用API函数据头文件

2>includelib语句

告诉链接器在链接时到指定的库文件中找API函数的位置信息

3>invoke伪指令

为了简化API函数大量参数入栈操作,提供了invoke伪指令,用于调用执行Win32API函数

3.标号,变量和数据结构

1>标号:

汇编程序中用来表示跳转的目的地,相同的标号只能在同一个子程序内,MSAM中可以用@@做标号,

在程序后面可以用@F和@B来引用它,@F表示本条指令后的第一个@@标号,@B表示本条指令前的第一个

@@标号

2>变量:

变量的类型

变量名称表达方式缩写长度(长度)

字节Bytedb1

字WordDw2

双字DwordDd4

三字Fworddf6

四字QwordDq8

十字节TbyteDt10

有符号字节Sbyte1

有符号字Sword2

有符号双字Sdword4

单精度浮点数Real44

双精度浮点数Real88

10字节浮点数Real1010

全局变量:

其作用域是整个程序,定义在.data或者.data?

段中

局部变量:

其作用域是子程序,用local伪指令来定义,一般定义在子程序伪指令proc后,因为

局部变量的起始值是随机的,所以建议局部变量初始化。

变量的尺寸和数量:

sizeof可以获取变量的长度,lengthof可以取得变量中数量的项数

获取变量的地址:

1>.对于全局变量mov寄存器,offset变量名

2>.对于局部变量leaeax,[ebp-4]该指令可以在运行时按时ebp的值实际计算出地址放到eax中

3>.当用invoke调用函数时获取变量的地址用addr伪指令,addr会根据变量是全局或局部自动调用offset或lea指令,此时它做参数时左边不能有eax做参数,否则提示eax寄存器内容被重写

3>数据结构:

(多个数据组成的数据"样板")

4>标号与变量的命名规范:

(1)可以用字母,数字,下划线及符号@,$和?

.

(2)第一个符号不能是数字

(3)长度不能超过240个字符

(4)不能使用指令名等关键字

(5)在作用域内必须惟一

4.汇编中子程序

1>.子程序的定义

子程序名proc[距离][语言类型][可视区域][USES寄存器列表][,参数:

类型]……[VARARG]

Local局部变量列表

指令

子程序名endp

距离:

可以是NEAR,FAR,NEAR16,NEAR32,FAR16,FAR32,在Win32平坦的段中,往往忽略对它的定义

语言类型:

表示参数的使用方式和堆栈平衡的方式

可视区域:

可以是PRIVATE,PUBLIC,和EXPORT。

PRIVATE和PUBLIC与C,C#的访问操作符作用类似

USES寄存器列表:

表示由寄存器在子程序指令开始前自动安排push这些寄存器的指令,并且在ret

前自动安排pop指令用于保存执行环境

参数和类型:

参数指参数的名称

2>参数传递与堆栈平衡

不同的语言类型下堆栈平衡方式

5.汇编中的高级语法

1>条件测试语句

寄存器或变量操作符操作数(ex:

x==3;x等于3eax!

=3;eax不等于3)

条件测试语句的限制:

表达式的左边只能是变量或寄存器,不能为常数,不能同时为变量,但可以同时为

寄存器

注:

它与C语言采用相同的语法

2>分支语句

语法:

.if条件表达式1

表达式1为"真"时执行的指令

[.elseif条件表达式2]

表达式2为"真"时执行的指令

[.elseif条件表达式3]

表达式3为"真"时执行的指令

……

[.else]

所有表达式为"否"时执行的指令

.endif

3>循环语句

语法:

.while条件测试表达式

指令

[.break[.if退出条件]]

[.continue]

.endw相当与C中的While语句

.repeat

指令

[.break[.if退出条件]]

[.continue]

.until条件测试表达式(或.untilcxz[条件测试表达式])相当于C中的do……while语句

6.汇编中代码的风格

1>变量和函数的命名

函数与变量的命名用匈牙利表示法,全局变量在参数的前面加下划线,在全局变量前加@符号,

在内部子程序的名称前面加下下划线以便和系统API区别

一.Win32汇编中的程序结构

1>程序模式和源程序格式的定义

.386:

定义程序中使用的指令集

.model:

定义程序工作的模式

使用方法为.model内存模式[,语言模式][,其它模式]

内存模式:

定义最后生成可执行文件的大小

语言模式:

指定子程序的调用方式(Win32下是stdcall)

option语句:

选项定义

optioncasemap:

none定义程序中变量名与子程序名是否对大小写敏感

2.段的定义

1>数据段

.data.data?

.const定义的是数据段

.data:

定义可读可写的已定义变量,.data段一般存放在可执行文件的_DATA节区内

.data?

:

定义可读可写的未定义变量,.data?

段一般存放在可执行文件的_BBS节区内

.const:

定义一些常量,它是可读但不可写的

2>代码段

.code:

所有的指令必须存放在代码段,代码段一般是存放有可执行文件的_TEXT节区中,它是可读但不可写的

3>堆栈段

Win32程序中不必定义堆栈段,系统会自动分配堆栈空间,它的内存属性是可读可写并且是或执行的

(缓冲区溢出技术用到了这个特征)

3.程序的入口

C语言中程序从main函数开始执行,而在汇编程序中,程序员可以指定任一一个地方开始执行,

这个地方同由程序最后一句以end语句来来指定

4.注释与换行

汇编中注释以(;)分号开始

汇编中换行以(\)号做换行符

总结:

一个汇编程序的结构

;程序指令集与模式的定义

.386

.modelflat,stdcall;内存模式定义为'平滑',语言模式定义为stdcall

optioncasemap:

none;定义程序中变量名与子程序名是否对大小写敏感

……

;数据段

.data

<一些初始化过的变量的定义>

.data

<一些未初始化过的变量的定义>

.const

<一些常量的定义>

:

代码段

.code

<代码>

<开始标号>

<其它语句>

end开始标号

1.WindowsAPI

Win32API的核心由3个DLL提供不同的系统功能

.Kernel32.dll--系统服务功能。

包括内存管理,任务管理,动态链接库

.User32.dll--用户接口服务。

建立窗口和传送消息等

.Gdi32.dll--图形设备接口。

2.汇编中调用Win32API

1>include语句

对于所有要用到的API函数,在程序的开始部分都要必须预先声明,为的简化操作汇编中引入的include伪指令引入所要调用API函数据头文件

2>includelib语句

告诉链接器在链接时到指定的库文件中找API函数的位置信息

3>invoke伪指令

为了简化API函数大量参数入栈操作,提供了invoke伪指令,用于调用执行Win32API函数

3.标号,变量和数据结构

1>标号:

汇编程序中用来表示跳转的目的地,相同的标号只能在同一个子程序内,MSAM中可以用@@做标号,

在程序后面可以用@F和@B来引用它,@F表示本条指令后的第一个@@标号,@B表示本条指令前的第一个

@@标号

2>变量:

变量的类型

变量名称表达方式缩写长度(长度)

字节Bytedb1

字WordDw2

双字DwordDd4

三字Fworddf6

四字QwordDq8

十字节TbyteDt10

有符号字节Sbyte1

有符号字Sword2

有符号双字Sdword4

单精度浮点数Real44

双精度浮点数Real88

10字节浮点数Real1010

全局变量:

其作用域是整个程序,定义在.data或者.data?

段中

局部变量:

其作用域是子程序,用local伪指令来定义,一般定义在子程序伪指令proc后,因为

局部变量的起始值是随机的,所以建议局部变量初始化。

变量的尺寸和数量:

sizeof可以获取变量的长度,lengthof可以取得变量中数量的项数

获取变量的地址:

1>.对于全局变量mov寄存器,offset变量名

2>.对于局部变量leaeax,[ebp-4]该指令可以在运行时按时ebp的值实际计算出地址放到eax中

3>.当用invoke调用函数时获取变量的地址用addr伪指令,addr会根据变量是全局或局部自动调用offset或lea指令,此时它做参数时左边不能有eax做参数,否则提示eax寄存器内容被重写

3>数据结构:

(多个数据组成的数据"样板")

4>标号与变量的命名规范:

(1)可以用字母,数字,下划线及符号@,$和?

.

(2)第一个符号不能是数字

(3)长度不能超过240个字符

(4)不能使用指令名等关键字

(5)在作用域内必须惟一

4.汇编中子程序

1>.子程序的定义

子程序名proc[距离][语言类型][可视区域][USES寄存器列表][,参数:

类型]……[VARARG]

Local局部变量列表

指令

子程序名endp

距离:

可以是NEAR,FAR,NEAR16,NEAR32,FAR16,FAR32,在Win32平坦的段中,往往忽略对它的定义

语言类型:

表示参数的使用方式和堆栈平衡的方式

可视区域:

可以是PRIVATE,PUBLIC,和EXPORT。

PRIVATE和PUBLIC与C,C#的访问操作符作用类似

USES寄存器列表:

表示由寄存器在子程序指令开始前自动安排push这些寄存器的指令,并且在ret

前自动安排pop指令用于保存执行环境

参数和类型:

参数指参数的名称

2>参数传递与堆栈平衡

不同的语言类型下堆栈平衡方式

5.汇编中的高级语法

1>条件测试语句

寄存器或变量操作符操作数(ex:

x==3;x等于3eax!

=3;eax不等于3)

条件测试语句的限制:

表达式的左边只能是变量或寄存器,不能为常数,不能同时为变量,但可以同时为

寄存器

注:

它与C语言采用相同的语法

2>分支语句

语法:

.if条件表达式1

表达式1为"真"时执行的指令

[.elseif条件表达式2]

表达式2为"真"时执行的指令

[.elseif条件表达式3]

表达式3为"真"时执行的指令

……

[.else]

所有表达式为"否"时执行的指令

.endif

3>循环语句

语法:

.while条件测试表达式

指令

[.break[.if退出条件]]

[.continue]

.endw相当与C中的While语句

.repeat

指令

[.break[.if退出条件]]

[.continue]

.until条件测试表达式(或.untilcxz[条件测试表达式])相当于C中的do……while语句

6.汇编中代码的风格

1>变量和函数的命名

函数与变量的命名用匈牙利表示法,全局变量在参数的前面加下划线,在全局变量前加@符号,

在内部子程序的名称前面加下下划线以便和系统API区别

1.窗口程序

1>窗口程序的运行过程

(1)得到应用程序的句柄(GetModuleHandle)

(2)注册窗口类(RegisterClassEx),在注册之前先填写RegisterClassEx的参数WNDCLASSEX结构

(3)建立窗口(CreateWindowEx)

(4)显示窗口(ShowWindow)

(5)刷新窗口客户区(UpdateWindow)

(6)进入无限的消息获取和处理的循环,首先获取消息GetMessage,用回调函数处理消息函数DispatchMessage

2.分析窗口程序

1>模块与句柄

模块:

一个模块是一个运行中的exe文件或dll文件,在Win32中,模块中的句柄在数值上等于程序在内存中装入的起始地址。

Win32程序中调用GetModuleHandle函数来获取应用程序的模块。

句柄:

Windows程序用来表示各种资源的编号

2>窗口

一个窗口建立过程:

注册窗口类-->建立窗口-->显示窗口-->更新窗口

注册窗口类:

实例化一个窗口类结构WNDCLASSEX加载窗口用到的资源,调用RegisterClassEx函数注册窗口类

建立窗口:

在以注册的窗口类的基础上建立窗口,调用Cr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1