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),否则,程序会在最后一条指令后继续执行下面的‘指令’,即使后面的地址是数据段。
分享到:
相关推荐
基于汇编语言小项目,同济大学软院大一学生汇编结课项目
第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 练习题
第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退出程序。另外,本程序是完全采用汇编编写,小巧绿色,请您务必收藏,以备不时之需。...
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 生成传统的控制台应用...
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 生成传统的控制台应用...
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 生成传统的控制台应用...
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 生成传统的控制台应用...
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 生成传统的控制台应用...
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 生成传统的控制台应用...
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 生成传统的控制台应用...
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 ...
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 ...
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章 如何让壳与程序...
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++调用汇编子程序 ...
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 ...
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 ...