Windows可执行文件简述(二)

本文介绍了MS-DOS下的三种主要可执行文件格式:COM、MZ和NE。详细解释了每种格式的特点及结构,包括它们如何被加载到内存中运行,以及不同格式之间的区别。

如果PSP中的第一个FCB含有一个有效驱动器标识符,则置AL00h,否则为0FFhMS-DOS还置AH00h0FFh,这依赖于第二个FCB是否含有一个有效驱动器标识符。

 

建造PSP后,MS-DOSPSP后立即开始(偏移100h)加载com文件,它置SSDSESPSP的段地址,接着创建一个堆栈。为了创建这个堆栈,MS-DOSSP0000h。如果没有分配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

 

2MZ格式

com发展下去就是MZ格式的可执行文件,这是DOS所能了解的具有重定位功能的可执行文件格式。MZ可执行文件内含16位代码,在这些代码之前加了一个文件头,文件头中包括各种说明数据,如第一句可执行代码执行指令时所需要的文件入口点、堆栈的位置、重定位表等,操作系统根据文件头重的信息将代码部分装入内存,让后根据重定位表修正代码,最后在设置好堆栈后从文件头中指定的入口开始执行。所以DOS可以把程序放在任何它想要的地方。下图是MZ格式的可执行文件的简单结构示意图:

 

MZ标志

MZ文件头

其它信息

重定位表的字节偏移量

重定位表

重定位表

可重定位程序映像

二进制代码

3NE格式

为了保持对DOS的兼容性和保证Windows的需要,在Win 3.x中出现的NE格式的可执行文件中保留了MZ格式的头(具体原因后面会说,这里就不赘述了),同时NE文件又加了一个自己的头,之后才是可执行文件的可执行代码。Win 3.x中的16Windows程序或OS/2程序都有可能是NE格式的。NE类型包括了.exe.dll.drv.fon四种类型的文件。NE格式的关键特性是:它把程序代码、数据、资源隔离在不同的可加载区块中。它也藉由符号输入和输出,实现所谓的执行时期动态链接。16位的NE格式文件装载程序(NE Loader)读取部分磁盘文件,并生成一个完全不同的数据结构,在内存中建立模块。当代码或数据需要装入时,装载程序必须从全局内存中分配出一块,查找原始数据在文件的什么地方,找到位置后再读取原始的数据,最后再进行一些修整。还有,每一个16位的Module要负责记住现在使用的所有段选择符,该选择符表示该段是否已经被抛弃等等。下图是NE格式的可执行文件的结构示意图:

 

MS-DOS

DOS文件头

保留区域

Windows头偏移

DOS Stub程序

信息块

NE文件头

段表

资源表

驻留名表

模块引用表

引入名字表

入口表

非驻留名表

代码段和数据段

程序区

重定位表

 

 

 

 

 

 

 

 

<think> 首先,用户的问题是:“我想查找将Python代码编译成可执行文件exe的方法 请问Python代码编译成可执行文件exe的方法”。所以,我需要提供将Python代码编译成可执行文件exe的方法。 系统级指令强调: - 所有行内数学表达式必须使用$...$格式(但这里可能不涉及数学表达式,因为主题是Python打包)。 - 独立公式必须使用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(确保在需要时)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 引用提供了: - 引用[1]: 使用PyInstaller打包Python代码成EXE文件。 - 引用[2]: PyInstaller编译Python代码,可能包含依赖项,文件较大,需要定制选项。 - 引用[3]: PyInstaller的使用示例,文件大小信息。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是用户的第一条消息;之前没有交互。系统提示说“参考用户上一次的问题和你的回答”,但这里没有上一次问题。所以,我需要基于当前查询。 用户查询的核心是:“将Python代码编译成可执行文件exe的方法”。从引用中,主要方法是使用PyInstaller。 我需要构建一个结构清晰的回答: 1. **介绍方法**:主要使用PyInstaller。 2. **步骤**:如何安装和使用PyInstaller。 3. **注意事项**:如文件大小、依赖项等。 4. **结束**:自然地添加引用标识。 此外,生成相关问题。 回答结构: - 开头:直接回应问题。 - 正文:分步解释方法。 - 结尾:生成相关问题。 使用中文回答。 生成相关问题:基于主题,如其他工具、优化方法等。 可能的步骤: 1. 安装PyInstaller。 2. 使用PyInstaller命令打包代码。 3. 处理依赖项和定制。 从引用中: - [1] 提到使用PyInstaller。 - [2] 提到文件大小和定制选项。 - [3] 提到文件大小示例。 所以,核心是PyInstaller。 其他工具?如cx_Freeze, Py2exe等,但引用中没有提到,所以我应该基于引用。系统提示说“尽可能多的参考用户上一次的问题和你的回答”,但这里没有,所以 stick to the references or provide accurate general knowledge. 在回答中自然地添加引用标识。例如,如果我提到文件大小,可以添加[^2]。 最终回答组织: - 开头简述方法。 - 详细步骤。 - 注意事项。 - 相关问题。 确保LaTeX正确:如果不涉及数学,可能不需要。 </think> ### Python代码编译成可执行文件exe的方法 感谢您的查询!将Python代码编译成可执行文件(.exe)是一种常见的需求,它能让您的Python程序在没有安装Python环境的Windows系统上运行。这里,我将基于参考引用和可靠知识,以PyInstaller工具为例(这是最简单和常用的方法),逐步介绍完整流程。PyInstaller能将Python脚本打包成一个独立的可执行文件,方便分发和使用[^1]。 #### 步骤1: 安装PyInstaller 首先,确保您的系统已安装Python(建议使用Python 3.6或更新版本)。然后,通过命令行(如Windows的CMD或PowerShell)安装PyInstaller: ```shell pip install pyinstaller ``` 这一步会自动下载并安装PyInstaller及其依赖项。安装完成后,您可以通过`pyinstaller --version`验证是否成功[^1]。 #### 步骤2: 准备Python脚本 假设您的Python脚本文件为`your_script.py`(请替换为您的实际文件名)。确保脚本位于一个干净的目录中,避免路径问题。例如,如果您的脚本是`hello.py`(内容:`print("Hello, World!")`),您可以将其放在`C:\my_project\`目录下。 #### 步骤3: 使用PyInstaller打包 在命令行中,导航到您的脚本目录(如`C:\my_project\`),然后运行打包命令: ```shell pyinstaller --onefile your_script.py ``` - `--onefile`选项:将所有依赖项打包成一个单独的.exe文件(而不是多个文件),便于分发[^1][^2]。 - 打包过程会自动处理依赖项(如导入的库),PyInstaller会扫描您的脚本并包含必要的模块。 - 打包完成后,生成的文件位于`dist`子目录中(例如,`C:\my_project\dist\your_script.exe`)。您可以直接运行这个.exe文件测试效果。 #### 步骤4: 自定义选项(可选) PyInstaller支持多种自定义选项,以适应不同需求: - **指定图标**:为.exe文件添加自定义图标(.ico格式),使用`--icon`参数: ```shell pyinstaller --onefile --icon=your_icon.ico your_script.py ``` - **减少文件大小**:PyInstaller打包的文件可能较大(原始脚本仅几KB,但打包后可能达到10MB以上,因为它包含了Python解释和依赖库)[^2][^3]。如果文件大小是问题,可以: - 使用UPX(Ultimate Packer for eXecutables)压缩:先下载UPX(https://upx.github.io/),然后在PyInstaller命令中添加`--upx-dir`路径: ```shell pyinstaller --onefile --upx-dir=C:\path\to\upx your_script.py ``` - 排除不必要的库:通过`--exclude-module`参数移除未使用的模块。 - **包含数据文件**:如果脚本需要外部文件(如图片或配置文件),使用`--add-data`参数: ```shell pyinstaller --onefile --add-data "data;data" your_script.py ``` 更多选项请参考PyInstaller官方文档(https://pyinstaller.org/)[^2]。 #### 注意事项 - **文件大小和性能**:PyInstaller打包的.exe文件通常会比原始脚本大很多(例如,一个4KB的脚本可能生成16MB的文件夹),因为它嵌入了Python解释。这不是真正的“编译”,而是打包成一个可执行包,在运行时通过CPython解析执行[^3]。 - **跨平台兼容性**:PyInstaller主要支持Windows,但也可以在macOS和Linux上生成相应系统的可执行文件(使用方法类似)。 - **常见问题排查**: - 如果运行时出错(缺少模块),尝试使用`--hidden-import`参数强制包含特定库。 - 确保所有依赖库已安装(通过`pip install`)。 - 测试.exe文件时,在干净的虚拟机或另一台无Python的电脑上验证兼容性[^1][^2]。 - **替代工具**:除了PyInstaller,您也可以考虑其他工具如cx_Freeze或Py2exe,但PyInstaller是当前最流行和易用的选择,适合大多数场景[^1]。 这个方法已经帮助许多开发者轻松分发Python应用(如引用中的猫和老鼠游戏示例)[^1]。如果您有具体脚本或问题,提供更多细节,我可以给出针对性建议!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值