Win32汇编(MASM32)技术笔记
2009-5-16
最近无意间开始学习汇编语言了以前涉猎过一些汇编书籍,但是当时功力不够,看得晕头转向的。现在开始学习,还是相对容易的。但因为没人知道,也是一步一步的摸索的很艰辛。
汇编作为一种低级语言,语法的运用固然不能像高级语言极富逻辑语义性,但他有他自己独特的特点
I、为什么要学汇编?
首先,汇编语言是低级语言,其实就是机器语言以一种别名的形式存在,其运行速度是不言而喻的。所以在对效率要求很高的程序中汇编能做到很好的优化
其实,现在找工作看的还是高级语言,是不是汇编就很少有用武之地啦?答案是否定的。现在的高级语言很注重封装性,如C++等提供了功能强大的类库,你不必知道这些功能是如何实现的只需要组织运用就行。而学习汇编就要了解比如一个程序具体是怎样在内存中运行的等等。了解这些更深层面的细节,能让你对高级语言的运用更加驾轻就熟。
而且,学习WIN32汇编能让你了解WINDOWS系统的运行细节,且能更深入的掌握WINDOWS下的编程思想。
废话不多说,切入正题。完成对汇编基础知识的学习,首先明白了函数调用细节与程序调用时的内存细节,这次笔记就这些做些总结:
II、程序运行的内存分配&函数调用&局部变量的申请释放&堆栈平衡
(技术报告可以当教程啦O(∩_∩)O哈哈~)
先用C语言代码举出简单的例子
Int var1;
Static int var2;
Int proc(int a)
{int c,d;
d=a;
return d;
}
Void main()
{int a,b;
Int *ptr,*str=”hello world”;
Ptr=malloc(4*sizeof(int));
a=2;
b=proc(a);
}
这就是一个简单的变量定义、内存申请、函数调用的简单例子。
一、程序运行时的内存管理
程序编译运行后在内存中的存储情况
栈区:定义的变量放在栈里面,如a,b是由编译器在栈上申请的空间(具体是怎么弄得,以后有待于研究编译原理)程序运行后会被系统自动释放
堆区:由用户自己申请分配的空间,如Ptr=malloc(4*sizeof(int)); 这一句是申请了4个整型变量空间。空间是在堆上的(虽然习惯说堆栈,但堆和栈其实是两个概念)而且需要用户自己释放。如果忘记释放便可能会造成内存泄露
全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。如例子中的 var1 var2
文字常量区:这里存放着程序所用到的字符串如例子中的”hello world\0”
代码区:程序编译后的指令会存到这里。EIP寄存器会逐条指向这里的指令地址。
二、函数调用、局部变量与堆栈的平衡
例子中b=proc(a);
汇编中的调用方式是
Push a
Call proc
Mov b,eax
其流程如下
1、Push a :参数a被压入堆栈(指的是栈)中
2、Push 0003A0F2H :call语句紧把调用proc过程(函数)处的地址压入堆栈(即返回地址假定为0003A0F2H 这就是代码区的一个地址)
3、Mov eip,0004A0FFH :程序跳转到proc过程的地址去运行
4、Push ebp :保存ebp 后面会解释为什么要保存
5、Mov ebp,esp :用ebp保存堆栈指针即esp
注:ebp解释为基址指针,其实我感觉应该理解为数据指针,他用来访问堆栈中的数据,但他是不变的,操作用ebp+或-x来访问,因此他可以用来保存esp原来的值用于最后恢复esp从而释放局部变量
Esp是堆栈指针,他一直指向栈顶会随着堆栈数据的增多而变化push 和pop指令操作的就是esp所指向的地址
6、sub,esp,8 :esp减少8 增加堆栈指针,因为堆栈数据在内存是从高地址向低地址排列的所以逻辑上可以看做增加堆栈指针,或抬高指针,相当于留出了8个字节的空位即两个int局部变量(C语言中的int结构其实就是DWORD 而DWORD是CPU有关的,他等于CPU的位宽,所以TC是DOS下的C所以他的DWORD(int)所占的位数和当时16位CPU一样是16 而VC是WIN32下的C因此他的DWORD(int)所占的位数和32位CPU一样是32 和操作系统的位数也有关系 )
7、mov DWORD ptr [ebp-4],ebp+8 :将参数a的数据给局部变量d,这里就是利用ebp来访问堆栈里面的数据
8、mov eax, DWORD ptr [ebp-4] :将局部变量d作为返回值汇编中的返回值都是放在寄存器中eax的
9、mov esp,ebp :恢复堆栈指针相当于释放了局部变量因为esp相当与堆栈的边界,现在那两个局部变量已经在边界外所以不再是堆栈数据,被系统回收了。
10、Pop ebp :恢复ebp指针对应前面的保存。因为函数proc是main主函数调用的,而主函数中也需要ebp访问堆栈数据,因此在调用proc要进行“现场保护”,便于返回到主函数时恢复,以免引起错误
11、pop eip :返回到调用proc过程的地方
以上就是一个函数调用的全部过程
其实WIN32汇编中不会这么麻烦这些编译器已经都帮你做好了你只管call就行局部变量用LOCAL宏返回用RET就OK了
但是这些是都是具体的细节,所以了解他们的意义不可小视,而这些正是我学习汇编语言的第一份收获
分享到:
相关推荐
Win10系统VS2022开发环境中X86Win32汇编MASM32环境配置和一些 在Win10系统中配置VS2022开发环境,以便使用MASM32进行X86 Win32汇编开发。以下是详细的配置过程和一些需要注意的知识点: 一、安装VS2022 首先,...
MASM32是面向WIN32程序开发的,MASM611是面向DOS的,MASM32不使用中断调用了,而是使用微软的应用程序开发接口API和其他高级开发语言差不多了。而MASM611才是使用中断。 解压后大约15M 而压缩后才3.4M 分享学习的...
vs2022中Win32汇编(MASM32)环境配置和测试源码的vs2022项目工程
"Masm32"可能指的是MASM(Microsoft Macro Assembler),这是微软提供的一个汇编器,用于将汇编代码转换为可执行的机器码。MASM支持宏指令,使得编写更复杂的代码变得容易。在VS2019中,你可以配置项目设置以使用...
本教程通过一系列逐步深入的教程文档,如tut3.html介绍基本概念,tut13.html探讨API调用,tut24.html涉及更复杂的编程技术,帮助读者逐步提升汇编语言编程能力,最终能够在Win32平台上熟练运用MASM进行程序开发。...
《32位汇编MASM5:初学者的友好选择》 在计算机科学的世界里,汇编语言是一种底层编程语言,它与机器语言密切相关,直接对应于计算机硬件的指令集。MASM(Microsoft Macro Assembler)是微软公司推出的一款汇编器,...
- **MASM汇编器**:Microsoft的MASM(Microsoft Assembler)是必备工具,至少需要6.11版以上以支持Win32汇编。MASM 6.11及更高版本的ML.EXE文件可用于汇编源代码。 - **Win32 SDK**:Software Development Kit提供了...
本笔记主要介绍了Masm32汇编程序设计在Win32环境下的学习笔记,参考罗去彬的书籍。下面是笔记的详细内容: 一、汇编语言基础 汇编语言是一种低级语言,它直接与计算机硬件交互,使用符号表示来代替机器语言的二...
MASM32V8win32汇编环境软件正是为Windows平台上的汇编编程量身定制的一款集成开发环境,它为程序员提供了一个高效、便捷的编写、编译和调试汇编程序的平台。 首先,MASM32V8win32这个名字中的“MASM”是Microsoft ...
《MASM32编程指南》是一份专注于Win32汇编语言编程的资源包,它包含了一套完整的MASM32开发环境,旨在帮助开发者深入理解和掌握汇编语言在Windows平台上的应用。MASM(Microsoft Macro Assembler)是微软公司提供的...
《Win32汇编教程》是由知名编程作者iczelion编写的一部深入解析Win32汇编语言的经典教程。汇编语言是计算机科学的基础,它直接对应于机器指令,是程序设计者与硬件进行沟通的桥梁。对于理解操作系统底层工作原理、...
"masm.rar"可能包含的资源如"www.pudn.com.txt"可能是汇编教程的一部分,可能详细介绍了MASM的语法、Win32 API的使用,以及示例代码。"新建文件夹"可能包含了实际的汇编源码文件,供学习者实践和调试。 总的来说,...
在Windows 32位环境下,汇编语言被称为Win32汇编,主要用于编写系统级程序、驱动程序或者对性能有严格要求的代码。本教程将深入探讨Win32汇编工具及其打包过程,通过示例来帮助理解如何在Windows平台上有效地使用...
### Win32汇编语言基础概念 #### 一、Win32编程简介 在深入了解Win32汇编视频教程之前,我们首先需要了解Win32编程的基本概念。Win32是一套由微软提供的应用程序编程接口(API),它主要用于编写Windows操作系统下...
### 罗云彬的Win32汇编...综上所述,罗云彬的Win32汇编教程不仅涵盖了32位环境的基础知识,还深入探讨了Win32汇编语言编程的关键技术和实践,对于希望掌握高级系统编程技术的开发者来说,无疑是一份宝贵的学习资料。
**Win10 MASM(16位+32位)汇编开发工具包** 这个工具包是针对Windows 10操作系统设计的,旨在为汇编语言开发者提供一个完整的环境,支持16位和32位的汇编程序开发。MASM(Microsoft Macro Assembler)是微软公司...
本文将详细介绍MASM汇编语言的相关知识点,包括寄存器、内存寻址、堆栈、常用关键字以及Win32汇编指令汇总。 首先,寄存器是CPU中用于存储数据和指令地址的高速存储单元。在32位汇编中,常见的通用寄存器有EAX、EBX...
Win32汇编源码是计算机编程领域中的一个重要分支,主要关注的是在Windows操作系统环境下,用汇编语言编写程序的方法。汇编语言是一种低级语言,它的指令与计算机硬件的机器语言非常接近,使得程序员可以直接控制...
今晚整理硬盘时发现几年前为了练习Win32汇编(这里推荐罗云彬老师的那本书),自己搭建了一套Win32汇编练习环境,主要组成部分为最新的RadASM和masm32v11,支持类似Visual Studio的解决方案对代码进行管理,以及对...
接着,会详细讲解如何在Win32环境下设置开发环境,如使用NASM或MASM等汇编器,以及链接器和调试工具的使用。同时,学习者需要理解PE(Portable Executable)文件格式,这是Windows系统中的可执行文件标准。 在API...