Windows可执行文件简述(二)

原创 2007年09月17日 12:38:00
如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL为00h,否则为0FFh。MS-DOS还置AH为00h或0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符。
 
建造PSP后,MS-DOS在PSP后立即开始(偏移100h)加载com文件,它置SS、DS和ES为PSP的段地址,接着创建一个堆栈。为了创建这个堆栈,MS-DOS置SP为0000h。如果没有分配64K内存,则要置寄存器为比所分配的字节总数大2的值。最后,它把0000h推进栈,这是为了保证与在早期MS-DOS版本上设计的程序的兼容性。
 
MS-DOS通过把控制传递偏移100h处的指令而启动程序。程序设计者必须保证com文件的第一条指令是程序的入口点。
 
注意,因为程序是在偏移100h处加载,因此所有代码和数据偏移也必须相对于100h.汇编语言程序设计者可通过置程序的初值为100h而保证这一点(例如通过在原程序的开始使用语句org 100h)。
 
下面是一个简单的com文件Win32 ASM的例子:
 
MAN STRUCT                           ;定义一个结构
       W  dw 1234h                ;dw 也可用 word
       B  db 9 dup(?)               ;db 也可用 byte
MAN ENDS
 
.model tiny                          ;com格式文件
.data                                   ;对于com格式文件,数据段的内容会自动放到代码段后
zz  MAN <>,<1,"abcd">,<3,"Ldf">
.code                                  ;代码段
.startup                               ;可使下面的指令从0100H 开始(com格式文件要求)
mov ax,3031h
mov zz.W,ax                ;对结构赋值
mov zz.B,'1'
mov ax,type(MAN)       ;取结构所占字节数
.exit                                  ;可设置返回码
end
  
2.MZ格式
com发展下去就是MZ格式的可执行文件,这是DOS所能了解的具有重定位功能的可执行文件格式。MZ可执行文件内含16位代码,在这些代码之前加了一个文件头,文件头中包括各种说明数据,如第一句可执行代码执行指令时所需要的文件入口点、堆栈的位置、重定位表等,操作系统根据文件头重的信息将代码部分装入内存,让后根据重定位表修正代码,最后在设置好堆栈后从文件头中指定的入口开始执行。所以DOS可以把程序放在任何它想要的地方。下图是MZ格式的可执行文件的简单结构示意图:
 
MZ标志
MZ文件头
其它信息
重定位表的字节偏移量
重定位表
重定位表
可重定位程序映像
二进制代码
3.NE格式
为了保持对DOS的兼容性和保证Windows的需要,在Win 3.x中出现的NE格式的可执行文件中保留了MZ格式的头(具体原因后面会说,这里就不赘述了),同时NE文件又加了一个自己的头,之后才是可执行文件的可执行代码。Win 3.x中的16位Windows程序或OS/2程序都有可能是NE格式的。NE类型包括了.exe、.dll、.drv和.fon四种类型的文件。NE格式的关键特性是:它把程序代码、数据、资源隔离在不同的可加载区块中。它也藉由符号输入和输出,实现所谓的执行时期动态链接。16位的NE格式文件装载程序(NE Loader)读取部分磁盘文件,并生成一个完全不同的数据结构,在内存中建立模块。当代码或数据需要装入时,装载程序必须从全局内存中分配出一块,查找原始数据在文件的什么地方,找到位置后再读取原始的数据,最后再进行一些修整。还有,每一个16位的Module要负责记住现在使用的所有段选择符,该选择符表示该段是否已经被抛弃等等。下图是NE格式的可执行文件的结构示意图:
 

MS-DOS头
DOS文件头
保留区域
Windows头偏移
DOS Stub程序
信息块
NE文件头
段表
资源表
驻留名表
模块引用表
引入名字表
入口表
非驻留名表
代码段和数据段
程序区
重定位表

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Windows可执行文件简述

  • 2013-02-23 20:24
  • 64KB
  • 下载

Numpy Windows可执行文件

  • 2016-04-15 21:44
  • 9.30MB
  • 下载

Windows下开源打包框架NSIS学习(java打包可执行文件, java打包exe)

酒香也怕巷子深 ——Windows下开源打包框架NSIS学习 1. background NSIS全名Nullsoft Scriptable Install System. 在大名鼎鼎的代码托管发布平...

《windows核心编程》学习笔记——在同一个可执行文件或dll的多个实例间共享静态数据

默认情况下,同一个exe文件或dll的多个实例之间不会共享全局或静态数据。 windows没有提供一种简便的方法来检查用户是否在运行同一个应用程序的多个实例。如果应用程序的多个实例能够共享同一个全局变...

QEMU 0.9.0 Windows 可执行文件

  • 2016-02-05 04:26
  • 5.96MB
  • 下载

为 Windows NT 4.0 而编译的 Python 3.1 可执行文件

为 Windows NT 4.0 而编译的 Python 3.1 可执行文件 这里是给 Windows NT 4.0 而编译的 Python 3.1 可执行文件。使用方法:先下载压缩包,然后做下面的步...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)