Win32汇编.docx
- 文档编号:3746214
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:18
- 大小:25.45KB
Win32汇编.docx
《Win32汇编.docx》由会员分享,可在线阅读,更多相关《Win32汇编.docx(18页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Win32 汇编