.版本 2
.局部变量 段, 段, , "0"
.局部变量 表目录, 表目录, , "0"
.局部变量 现行位置
.局部变量 段数
.局部变量 段内存地址, , , "0"
.局部变量 段占用文件大小
.局部变量 代码入口地址
.局部变量 表的数量, 整数型
.局部变量 计次, 整数型
.局部变量 计次2, 整数型
.局部变量 代码段地址, 整数型
.局部变量 文件对齐度
.局部变量 DOS数据, 字节集
.局部变量 首选装载地址, 整数型
.局部变量 控制台程序, 逻辑型
现行位置 = 取字节集数据 (文件, #整数型, #MZ头长度 - 3) + 1
' DOS数据 = 取字节集中间 (文件, #MZ头长度 + 1, 现行位置 - #MZ头长度 - 1)
.如果真 (取字节集数据 (文件, #整数型, 现行位置) ≠ #PE署名)
返回 ()
.如果真结束
现行位置 = 现行位置 + 2
段数 = 取字节集数据 (文件, #短整数型, 现行位置)
重定义数组 (段, 假, 段数)
重定义数组 (段内存地址, 假, 段数)
现行位置 = 现行位置 + 32
代码入口地址 = 取字节集数据 (文件, #整数型, 现行位置)
代码段地址 = 取字节集数据 (文件, #整数型, 现行位置)
现行位置 = 现行位置 + 4
首选装载地址 = 取字节集数据 (文件, #整数型, 现行位置)
现行位置 = 现行位置 + 4
文件对齐度 = 取字节集数据 (文件, #整数型, 现行位置)
现行位置 = 现行位置 + 28
控制台程序 = 取字节集中间 (文件, 现行位置, 2) = { 3, 0 }
现行位置 = 现行位置 + 24
表的数量 = 取字节集数据 (文件, #整数型, 现行位置)
重定义数组 (表目录, 假, 表的数量)
.计次循环首 (表的数量, 计次)
表目录 [计次].地址 = 取字节集数据 (文件, #整数型, 现行位置)
表目录 [计次].大小 = 取字节集数据 (文件, #整数型, 现行位置)
.计次循环尾 ()
.计次循环首 (段数, 计次)
' 段 [计次].名称 = 取字节集中间 (文件, 现行位置, 8)
现行位置 = 现行位置 + 8
段 [计次].内存大小 = 取字节集数据 (文件, #整数型, 现行位置)
段内存地址 [计次] = 取字节集数据 (文件, #整数型, 现行位置)
段占用文件大小 = 取字节集数据 (文件, #整数型, 现行位置)
段 [计次].数据 = 字节集删尾空 (取字节集中间 (文件, 取字节集数据 (文件, #整数型, 现行位置) + 1, 段占用文件大小))
现行位置 = 现行位置 + 12
段 [计次].属性 = 取字节集数据 (文件, #整数型, 现行位置)
.计次循环尾 ()
.计次循环首 (表的数量, 计次)
.变量循环首 (段数, 1, -1, 计次2)
.如果真 (表目录 [计次].地址 ≥ 段内存地址 [计次2])
表目录 [计次].段号 = 计次2
表目录 [计次].地址 = 表目录 [计次].地址 - 段内存地址 [计次2]
跳出循环 ()
.如果真结束
.变量循环尾 ()
.计次循环尾 ()
.计次循环首 (段数, 计次)
.如果真 (段内存地址 [计次] = 代码段地址)
代码入口地址 = 代码入口地址 - 代码段地址
生成PE文件 (首选装载地址, 段, 计次, 代码入口地址, 文件对齐度, 表目录, DOS数据, 控制台程序)
跳出循环 ()
.如果真结束
.计次循环尾 ()