📄 gs02.txt
字号:
新增了宏指令,链接汇编,以及较完备的32位寻址汇编.
INCLUDE 导入基本数据GS02.TXT
.code 代码段
CALL 初始化 这些几乎可以不管了.
JMP DW 内操
初始化
MOV EBP,总领
INC [EBP+总领末]
XXX MOV [EBP+基本ESP],ESP 这是以后要做的.
SUB EAX,EAX
CALL 铺空间 计算要用的铺大小.
ADD EDX,300 再加点.
PUSH -1:POP EAX
CALL 分配映象 放置句柄集的映象本身句柄不能在句柄集中!
MOV [EBP+自身句柄],EBX
CMP AL,0
JZ +2
ADD EAX,100
MOV AL,0 取整
CALL 铺空间
PUSH DW 开文对话结构区
CALL [开文对话函]
OR EAX,EAX AX好象为选中的文件数量.
JZ DW 退出
MOV ESI,缓冲文件名
MOV EDI,中央文件名
MOVSB
CMP [ESI-1],0 文件名存放.
JNZ -1
CALL 文件铺
MOV EDI,[EBP+书笺首]
MOV [EBP+文首],EAX
STOSD
MOV [EBP+文长],EBX
MOV [EBP+文尾],EDX
MOV [EDI],EDX
其它初始化数据.
MOV [EBP+总基址],400000
MOV EAX,[EBP+缓数值址]
MOV [EBP+原缓数值址],EAX
MOV EAX,[EBP+产首]
MOV EDI,EAX
NEG EDI
MOV [EBP+段基差],EDI
ADD EDI,[EBP+总基址]
MOV [EBP+段差],EDI
MOV [EBP+产正],EAX 没有册正
MOV [EBP+绣正],EAX
MOV EDI,EAX
MOV ESI,[EBP+文首] 源文件址 返回的句柄同时也是地址
RET
存盘退出
MOV EBP,函领
MOV EBX,总领
MOV ESI,中央文件名
PUSH ESI
LODSB
CMP AL,0
JNZ -1
CMP [ESI-5],"."
JNZ DW 异常退出 一般不会
MOV [ESI-5],".EXE"
POP ESI
PUSH ESI 中央文件名
CALL [EBP+删文件函]
PUSH 0
PUSH 80
PUSH 4 强制新建??
PUSH 0
PUSH 3
PUSH C0000000
PUSH ESI 中央文件名
CALL [EBP+开文函] 返回句柄EAX=8
PUSH EAX 这是产号
PUSH 0
PUSH 实际产长 返回用的实际产长址
PUSH [EBX+产长]
PUSH [EBX+产首]
PUSH EAX 目标文件句柄
CALL [EBP+写文件函]
已经压入了 PUSH [EBX+产号]
CALL [EBP+关句柄函]
关闭所有句柄
MOV ESI,[EBX+句柄首]
LODSD
PUSH EAX
CALL [EBP+关句柄函]
CMP ESI,[EBX+句柄尾]
JB -3
PUSH [EBX+自身句柄] 句柄集本身所在的句柄.
CALL [EBP+关句柄函]
空间异常
文件异常
异常退出
退出
PUSH 0
CALL [ExitProcess] 退出函
NOP
内操
CALL 等待内容 内容到齐
JMP DW 后期
NOP
NOP
取串,判16制,写16制.
X 总长乘以3/4+2000,再 产:1/4,绣1/4,册1/2
退至后期
POP EAX
RET
数引连续以及冒号连续.
不停地取串 连续取串
CALL 读可延符
JBE 废行
CMP AL,":" 一般,只要冒号后不为空格,就可延取.
JZ +2
CALL 英界符检查
JB 不停地取串
CALL 读1字节 并不增长
CMP AL,20
JBE 废行
CALL 英界符取串 是否还有串
JB 废行 无串
RET
消行回
POP EAX
PUSH 各内容
废行
CALL 登绣 注册绣
消行
CALL 读一字节 等于也不行.例如,2:5-6,显示5-7,7不可读.
JAE 继消行
减书笺 最初: 书笺首=书笺尾.
MOV EBX,[EBP+书笺尾]
CMP EBX,[EBP+书笺首]
JZ 退至后期 进入后期处理 读的子程序中已经调好.
SUB EBX,8
MOV [EBP+书笺尾],EBX
PUSH [EBX+4]:POP [EBP+文尾]
MOV ESI,[EBX] 原文正
MOV [EBP+文首],ESI 假文首,减测必须要的.
JMP 消行
继消行
CMP AL,A
JNZ 消行
CALL 英界符取串
JB 废行 无串
RET
等待内容
串识返回
CALL 不停地取串 以后加一个直接消行?
NOP
各内容
JNZ +2
CALL 连写引号串
JB 串识返回
CALL 特符串
JB 串识返回
CALL 写叮指令
JB 串识返回
CALL 写多指令
JB 串识返回
CALL 连写16制串 重新数引 数引后取串的内容型.
JB 串识返回 数引写成功了
CALL 写简指令
JB 串识返回
NOP
CALL 写特指令
JB 串识返回
NOP
CALL 查宏指令
JB 串识返回
NOP
CALL 废行 都不认识的内容. 登记绣
JMP 各内容 循环
无宏指令
POPAD 可供恢复继续其它的
CLC
RET
查宏指令
PUSHAD
MOV EDI,ESI 比较子程序中,以EDI为输入串.
MOV EBX,[EBP+册尾] 从当前倒回到册首找签
SUB EBX,签枕值
CMP EBX,[EBP+册首]
JB 无宏指令
CALL 签宏比较
JB -3
成功找到一个.
MOV ESI,EDI
ADD ESI,ECX
MOV EAX,[EBX+签数] 首
MOV EDX,[EBX+签壤] 尾
CALL 增书笺
POPAD
MOV ESI,[EBP+文首]
STC
RET 成功
增书笺 输入:EAX新首,EDX新尾.在include和宏macro中使用.
PUSH EDI 书笺尾是当前正在用的,而不同于其它尾.
MOV EDI,[EBP+书笺尾] 例如,册尾则是当前正没用到的.
CMP EDI,[EBP+书笺界]
JA DW 空间异常
MOV [EDI],ESI 原书正存放 返回一般消行了.
ADD EDI,8 新的书笺尾
MOV [EBP+书笺尾],EDI
STOSD EAX为新书首
MOV [EBP+文首],EAX
MOV [EDI],EDX 新书尾
MOV [EBP+文尾],EDX
XCHG EAX,ESI
POP EDI
RET
写特指令 码名成功后,内部不可重复.
PUSHAD
MOV EBX,特指令集
MOV [EBP+原产正],EDI
特指令环
MOVZX EAX,BY [EBX]
INC EBX
TEST EAX,EAX
JZ 特指令回 结束,正好是CLC
CMP ECX,EAX
JNZ 继找特指令
PUSHAD
MOV EDI,EBX
REP:CMPSB:POPAD
继找特指令
LEA EBX,[EAX+EBX]
JZ +2
ADD EBX,4
JMP 特指令环
XXX ADD ESI,ECX 名称成功
JMP [EBX] 压了一次大栈后进入的.
XXX JB 如果特指令回成功结束. 要求JB,ESI,EDI都已改好!!!!
特指令回
定义宏败
CLC
POPAD
RET
定义宏指令
ADD ESI,ECX
CALL 取串
JB 定义宏败
CMP DL,'{'
JNZ 定义宏败 特指令回
MOV EBX,[EBP+册尾] 准备注册宏签
MOV [EBX+签性],DW 0
MOV [EBX+签性顶],10
MOV [EBX+签址],ESI
MOV [EBX+签长],ECX
MOV [EBX+签符],EDX DL后符,DH前符.
ADD ESI,ECX
MOV [EBX+签数],ESI 首 正指向前大括号符.
CALL 读一字节
JB 定义宏败
CMP AL,'}'
JNZ -2
MOV [EBX+签壤],ESI 尾
LEA EBX,[EBX+签枕]
MOV [EBP+册尾],EBX
CMP EBX,[EBP+册界]
JA DW 异常退出
POP EDI:POP EAX:PUSH ESI:PUSH EDI 更换ESI
POPAD:STC:RET 成功返回
引入文件
ADD ESI,ECX
CALL 读一字节
JB 引入文件败
CMP AL,20
JB 引入文件败
JZ -3
MOV ECX,ESI 文件或路径名中的第1字节
DEC ECX
CALL 读一字节 第1个字节也可用于检查引号
JB 引入文件败
CMP [ESI-4],".TXT" 目前简单的为此.
JZ +5 加强的,引号.DLL或.INC等以后处理.
CMP AL,20
JAE -4
引入文件败
CLC
POPAD
RET
CMP [ESI],20 .ASM后的字符最好要小于等于20才可以.
JA 引入文件败
XCHG ECX,ESI
SUB ECX,ESI
PUSH EDI
MOV EDI,缓冲文件名
REP:MOVSB
MOV [EDI],0
POP EDI
CALL 文件铺
CALL 增书笺
POPAD
MOV ESI,[EBP+文首]
STC
RET 成功
导表指令败
POPAD:CLC:RET
导入表指令
CMP DL,"{"
JNZ 引入文件 或导表指令败 特指令回
CALL 检PE头部
MOV ECX,[EBP+PE段正]
TEST BY [ECX+24],40 当前段是否数据段.
JNZ +1
CALL 添数据段
ADD EBX,78 EBX由PE领改向了目录领.从0号目录开始.
CMP DW [EBP+导函总数],0
JNZ DW 异常退出 简单的进行数据的安全检查.
CALL 统计函串
CALL 算函串位置
CMP DW [EBP+导函总数],0
JZ DW 异常退出
CALL 写库函串
POP EAX:POP EAX:PUSH ESI:PUSH EDI
MOV EDI,[EBP+段基差] 库函收尾,征募和表尾写0.
NEG EDI
CALL 写征募函
MOV EDI,[EBP+导表正]
MOV ECX,14 EAX已是0. SUB EAX,EAX
REP:STOSB
POPAD:STC 表示成功返回
RET
检PE头部
MOV EBX,[EBP+PE领]
TEST EBX,EBX
JNZ PE头部回 说明已有头部数据取到.
MOV EBX,[EBP+产首]
CMP EDI,EBX
JNZ 取PE头数据 如果用户手工头部,将直接去取.
MOV ECX,E0
PUSH ESI
MOV ESI,400000 其实是复制编译器自己本身的头部.
REP:MOVSB:POP ESI
MOV [EDI-7A],000 段数目
SUB EAX,EAX
MOV ECX,48 100为80,4:40
REP:STOSD 目前写到200处. 最多只许四个段
取PE头数据
MOV EAX,[EBX+3C]
ADD EBX,EAX WIN头部
MOV [EBP+PE领],EBX
MOV EAX,[EBP+产首]
MOV [EBP+段文正差],EAX
NEG EAX
MOV [EBP+段基差],EAX
MOV ECX,[EBX+34]
MOV [EBP+总基址],ECX
ADD EAX,ECX
MOV [EBP+段差],EAX
MOV EAX,[EBX+74] 目录数量
LEA EAX,[EBX+8*EAX+78]
MOV [EBP+PE段领],EAX
MOV [EBP+PE段正],EAX 无效.
PE头部回
RET
统计函串
PUSH ESI
统计函串中
CALL 读一字节 也没有检查很多的额外符号.
JB 统计函串回 简单的废行取串
CMP AL,A
JNZ -2 消行
继统计函串
CALL 英界符取串
JB 统计函串中
CMP AL,A
JZ 统计函串中
INC DW [EBP+导函总数]
CMP DL,"."
JNZ +1
INC DW [EBP+导库数]
ADD ESI,ECX
CMP DL,","
JZ 继统计函串
CMP DL,"}" 登记结束.
JNZ 统计函串中
统计函串回
POP ESI
RET
算函串位置
MOV EAX,EDI
MOV [EBP+征函正],EAX
MOV ECX,[EBP+导函总数]
SHL ECX,2 *4
ADD EAX,ECX
MOV [EBP+募函正],EAX
ADD EAX,ECX
MOV [EBP+导表正],EAX
MOV EDX,[EBP+导库数]
INC EDX
6BD214 IMUL EDX,EDX,14 *4*5
ADD EAX,EDX
MOV [EBX+C],EDX 导入表的长度
MOV [EBP+库函串正],EAX
RET
写库函串
MOV EDI,[EBP+库函串正]
写库函串中
CALL 读一字节 也没有检查很多的额外符号.
JB 写库函串回 简单的废行取串
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -