WIN32汇编程序的结构及模式定义,段的定义

WIN32汇编程序的结构

先放张图:

这是之前听小甲鱼的课的时候下下来的一个WIN32汇编源程序,就拿它做例子。

       和8086一样,也是分号后面的都是注释,所以分号后面的东西我们可以不用管。然后可以看到开头有三行,我们一行一行分析。首先第一行我们看到是 .386  。这就是WIN32中的模式定义,它的意思就是在后面的代码中可以使用80386汇编中的指令集,比如在8086汇编中只有16位的寄存器:AX,DX,CD.....,而在WIN32汇编中可以使用32寄存器:EAX,EDX,ECX......,并且WIN32环境工作在80386以上的处理器中,所以这句是不能少的。然后还有一些类似的例如:.486  .586  .186 .286  .486p  .586p等等。其中后面加P表示程序中可以使用特权指令,目前还不是很了解特权指令,所以就不详细写,但是在应用程序级别的WIN32编程中,使用.386已经够了。

       然后后面一条语句是:.model flat,stdcall   这条语句定义的是程序的工作模式,flat就是工作在平坦模式下,这个模式下的每一个程序都拥有4GB的地址空间,但是这里并不是说每个程序都有4GB的物理地址空间,这4GB内存其实是虚拟的,程序运行时,操作系统将会完成4GB虚拟地址和物理内存地址之间的转换。4GB只是说这个程序能够在4GB的范围内寻址。以前的8086汇编会将一个程序分成各种段:.data  .code  .stack,而32位的寄存器足够寻址4GB的内存了,所以我们不用再像以前8086那样分段,不需要用段地址和偏移地址来寻址,因为一个寄存器就可以找到所有内存了,但是在WIN32汇编中我们还会用到段,只是这个段不再是之前的那种意思了,它只是把这种代码写到这一块地方,相当于归类。现在WIN32使用的叫分页机制,就是将4GB的内存像书本一样分成一页一页的,每一页只有4KB,每一页都有自己的属性,可能这一页是数据可读可写,下一页就变成了代码或者不可写的数据。

.stdcall定义的是语言模式,就是子程序的调用方式。这条语句指出了调用子程序或WIN32API传递参数时应该用堆栈的方法传递,在WIN32汇编中我们只能选用这个模式,因为Windows的API调用使用就是stdcall模式。

    最后一条语句:option casemap:none  。它定义的就是程序里面变量和子程序名(win32API中API名称)是否区分大小写,这条语句定义的是区分大小写,因为win32API中API名称区分大小写。

    我们可以看到上面的代码中有两个段: .const   .code  。前者是数据段,后者是代码段。但其实还有:.data   .data?  .stack

其中数据段有:.const   .data  .data?  。这三者的区别是  .const 其中的数据是可读不可写的,里面定义的是常量。如果程序执行过程中要修改这里面的数据会引发错误:"该内存不能为written"。.data中的数据是可读可写的,里面定义的是变量,并且这些变量一开始就要定义初始值,并且里面的数据在程序装入时就会存在,会占据内存。而.data?里面的变量是没有赋初值的,就是可读可写的未定义变量,它里面的数据并不在程序中占据内存,就是说,里面的数据只有在程序运行时才会占据内存,程序装入时或者没有运行时并不占据内存。为什么没有占据内存呢?实际上.data?里面的数据只有在程序运行后才会用到,在程序装入内存时在程序中只有一个大小的信息而已,程序中并没有为他空出这段内存空间来存放它的数据,当程序执行时才会开辟一段内存来存放它里面的数据。比如我们在.data?段里面   db  100*1024 dup (?)    这里我们在段中定义了100KB的内容,假如我们程序其他部分有100KB的内容,然后我们的程序在最后的.exe文件也只会是100KB的内容,而如果这些数据定义在.data段中,我们的程序最后的.exe 文件就会有200KB的内容。在可执行文件中这两者的数据放在不同的节区中。

.code代码段。在WIN32汇编下一般代码段是不可写的,如果企图修改代码段的数据会出现和上面一样的错误,但是在优先级3以下的程序代码段的属性是由PE的头部中的属性决定的,如果修改PE头部的属性那么也能把代码段修改成可写的。并且其实我们可以联想到,当给一个程序加壳时,肯定会修改到代码段,但是代码段一般不可写,所以加壳的过程中就已经做了修改PE头部属性的事情了,还有压缩一个程序也是同样的道理。

 .stack堆栈。在WIN32汇编中其实不必定义堆栈段了,系统会自动分配堆栈空间,但有一点要注意的就是堆栈段中的数据是可读可写可执行的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值