`
zhangjia328
  • 浏览: 17969 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Win32汇编小结

阅读更多

1. dos 汇编 win32 汇编编译器与连接器的区别:

(1) 编译器

      Dos win16 环境下,编译器(masm)生成的obj文件的格式为 OMF(Intel Object Module Format) win32环境下,编译器(多为 ml)生成的obj 文件的格式为 COFF.

masm 6.11版开始支持 COFF.

(2) 连接器(link)

      Dos 环境下的连接器为 Segmented Executable Linker,该连接器不能连接COFF格式,只能连接OMF格式。

      Win32 环境下的连接器为 Incremental Linker,只能连接COFF格式,不能连接OMF格式。

 

2. masm stacall调用方式” 应注意的问题(ml: 6.14.8444):

(1) stdcall堆栈平衡的方式 :如果子程序参数不可变,那么由子程序平衡堆栈;如果子程序的参数是可变的(即子程序定义中,参数列表的最后有 VARARG,比如wsprintf),那么由调用者平衡堆栈。

      但如果调用子程序用的是 invoke 伪指令,那么masm 会自动为你去平衡堆栈,比如:

invoke wsprintf, offset str1, offset str2, arg1, agr2

masm 会编译为下列汇编代码:

            push offset arg2

            push offset arg2

            push str2

            push str1

            call wsprintf

            add esp, 10h    ; 平衡堆栈的指令已经由 invoke 伪指令自动加上了,所以在用 invoke 伪指令调用子程序时(前提是 stdcall),即使子程序时可变参数,也不需要自己加平衡堆栈的代码。

      但如果调用子程序用的是 call 指令,那么如果子程序是可变参数的话,那么在 call 指令之后,就应该自己去平衡堆栈了。

 

3. leave 指令

      本科教材的解释:高级过程退出,功能是:

           BP/EBP->SP/ESP, POP BP/EBP

 

4. 子程序声明局部变量后,退出时的清理问题:

      Proc1   proc

            local b1[6]:byte, w1    

            mov     b1[0], 'H'

            mov     b1[1], 'e'

            mov     b1[2], 'l'

            mov     b1[3], 'l'

            mov     b1[4], 'o'

            mov     b1[5], 0

            mov     w1, 12345678h

           。。。。。。 ;其他操作

           ret

Proc1   endp

通过反汇编可知,ml 会在 ret 之前自动加上 leave 指令,用来恢复堆栈。但是很奇怪,如果源文件中的返回指令为:retn 或者 retf, 那么 ml 不会在 ret 之前加上 leave 指令,由此导致子程序返回到无效的地址。

 

5. 关于Win32 API 的参数及返回值

      Win32 API 的参数均为 dword 类型(在调用 Win32 API 时,一定要保证每个参数在入栈时压入的是 2 个字节),如果有返回值的话,返回值也是 dword 类型,且永远放在 eax 中。

 

6. 程序退出

      8086 汇编中,需要自己调用中断退出。在 win32 汇编中同样需要自己调用相应 Windows API 退出(比如: ExitProcess),否则,程序会在最后一条指令后继续执行下面的‘指令’,即使后面的地址是数据段。

分享到:
评论

相关推荐

    汇编项目-迷宫

    基于汇编语言小项目,同济大学软院大一学生汇编结课项目

    windows API编程(冉林仓)第一章源代码

    第1章 Win32 API编程简介  1.1 Windows API概述  1.2 Windows API函数帮助的使用  1.3 Windows API的组成  1.4 Windows API调用的注意事项  1.5 程序的调试信息... 1.10 小结  1.11 思考题  1.12 练习题

    Windows应用程序捆绑核心编程光盘代码

    第1章 再谈计算机内存访问 1 1.1 引言 1 1.2 内存管理概述 1 1.2.1 虚拟内存 1 1.2.2 CPU工作模式 2 1.2.3 逻辑、线性和物理地址 3 1.2.4 存储器分页管理机制 3 1.2.5 线性地址到物理地址的...15.7 本章小结 358

    网吧超级防锁专家

    程序启动后没用任何界面,只会再创建一个桌面,运行本程序后将立即切换到新桌面,用WIN+1和WIN+2组合键在两个桌面间切换,WIN+0退出程序。另外,本程序是完全采用汇编编写,小巧绿色,请您务必收藏,以备不时之需。...

    Visual C++音频视频处理技术及工程实践(分卷0)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++音频/视频处理技术及工程实践 (分卷1)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++ 音频/视频 处理技术及工程实践(分卷3)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++音频视频处理技术及工程实践(分卷9)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++音频/视频处理技术及工程实践(分卷2)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++音频视频处理技术及工程实践(分卷7)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++音频视频处理技术及工程实践(分卷6)

    1.6 本章小结 23 第2章 Visual C++ 2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26 2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用...

    Visual C++音频视频处理技术及工程实践(含源码2/2)

    2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 ...

    Visual C++音频视频处理技术及工程实践地址

    2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结 89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 ...

    加密解密.技术内幕.chm

    6.1.10 小结6.2 加壳程序综合运用的实例 6.2.1 程序简介 6.2.2 加壳子程序(WJQ_ShellBegin()) 6.2.3 PE外壳程序 6.2.4 加进Anti技术 6.2.5 通过外壳修改被加壳PE 6.2.6 VC++调用汇编子程序 第7章 如何让壳与程序...

    软件加密技术内幕 chm

    6.1.10 小结 6.2 加壳程序综合运用的实例 6.2.1 程序简介 6.2.2 加壳子程序(WJQ_ShellBegin()) 6.2.3 PE外壳程序 6.2.4 加进Anti技术 6.2.5 通过外壳修改被加壳PE 6.2.6 VC++调用汇编子程序 ...

    软件加密技术内幕

    6.1.10 小结 6.2 加壳程序综合运用的实例 6.2.1 程序简介 6.2.2 加壳子程序(WJQ_ShellBegin()) 6.2.3 PE外壳程序 6.2.4 加进Anti技术 6.2.5 通过外壳修改被加壳PE 6.2.6 VC++调用汇编子程序 ...

    windows驱动开发技术详解-part2

     2.2.2 应用程序与Win32子系统  2.2.3 其他环境子系统  2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层  2.2.10 Windows与微内核  2.3 ...

    Windows驱动开发技术详解的光盘-part1

     2.2.2 应用程序与Win32子系统  2.2.3 其他环境子系统  2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层  2.2.10 Windows与微内核  2.3 ...

Global site tag (gtag.js) - Google Analytics