📄
字号:
这是在快结束阶段要做的事情.
后期
MOV ECX,[EBP+文长] C7A8
MOV EAX,[EBP+总领末] 30
MOV EDX,[EBP+绣界] A560,4470
SUB EDX,[EBP+绣首]
MOV EAX,[EBP+绣尾]
SUB EAX,[EBP+绣首] 这里只是观察一下空间使用情况而矣.
NOP
MOV EDX,[EBP+册界] 没有其它的真实意思.
SUB EDX,[EBP+册首] 14AE0,9620
MOV EAX,[EBP+册尾]
SUB EAX,[EBP+册首]
NOP
MOV EDX,[EBP+产界] A560,3000
SUB EDX,[EBP+产首] 上述代码目前只用于调试.可以删除.
CMP DW [EBP+PE领],0
JZ +4 如果是0,则为手工头部和手工段.不进行对齐.
PUSH EDI
CALL 补齐段 确定最后段的段长
POP EDI 返回的EDX本来指向下一个新段.
MOV [EBX+50],EDX 总的内存长度写入头部
MOV [EBP+产尾],EDI 产尾与产界好象也可以合并的.
SUB EDI,[EBP+产首]
JZ DW 异常退出 没有文件可以生成的.
MOV [EBP+产长],EDI
清理签名:
MOV ESI,[EBP+册首]
后期环
CMP ESI,[EBP+册尾] 最后一个准备着的,但并没有写数据.
JAE DW 存盘退出
MOV EAX,[ESI+签性]
TEST AH,20 标志位5=1,使用签.
JZ 继扫描签 不是用签
MOV ECX,[ESI+签长] 这里可以压缩CL?
MOV EDI,[ESI+签址]
CALL 准备找签
继扫描签
LEA ESI,[ESI+签枕]
JMP 后期环
准备找签 找将.
位1定签02, 位3行差数08,位4行号偏10,位5用签20.
TEST AH,8 行差数 行数并,行号偏作为用签,且先行.
JZ 找用签
行差 现在规定签数是当前位置签壤+N.
签长才是差值.
CMP [ESI+签前符],'-'
JNZ +1 +0正数为下一个.
SUB ECX,2 而-0则要-2.
SHL ECX,3 4+4字节. 对于行差签来说,EDI为其绣址
MOV EDX,[EDI+ECX] EDI为当前注册它时绣到达的位置
XCHG ECX,EDX
行号偏
SUB ECX,[ESI] 减去当前位置的差.EDX为兵壤.
MOV [ESI],ECX
JMP 用签入壤
找用签
CALL 查找签名 成功后返回对方EBX下的签数ECX,签壤EDX?
JB 找签败回
TEST AH,10 位4行号偏
JNZ 行号偏
CALL 特殊用签 一般的为另一处的壤在当前处的情况.
用签入壤
MOV EDI,[ESI+签壤]
数值入壤 如果没有必要,一定要让2P,7S为0!
PUSH ESI
CALL 写值入壤
POP ESI
找签败回
RET
叮缓数入壤
PUSH ESI
MOV ESI,[EBP+缓数值址]
CALL 写值入壤 压栈和还原了ESI.
POP ESI
RET
写值入壤
SAHF 6ZF,0CF. 7SF,2PF.
JP 其它扩展方式
XXX JS 目前没定义
JA +7 单字节 7=0,6=0,0=0
JNZ +4 双字节 1
JNB +1 四字节 40
MOVSD 41
MOVSD
RET
MOVSW
RET
MOVSB
RET
其它扩展方式
JA +0 空操作.
RET
特殊用签 各种符号可以自己定义.
MOV AL,[ESI+签前符]
CMP AL,"&"
JNZ +3
SUB ECX,400000 加1000-200 .rdata中的基本位置
MOV [ESI],ECX
RET
CMP AL,"!"
JNZ +2
MOV [ESI],ECX 加402000-800 实际.code位置
RET
MOV [ESI],ECX
RET
查找签名 找兵
分两次: 倒回找签和向下找签.
MOV EBX,ESI 从当前倒回到册首找签
SUB EBX,签枕值
CMP EBX,[EBP+册首]
JB +3 向下找签
CALL 签名比较
JB -3
JMP +6 成功找到一个.
MOV EBX,ESI 向下找签
LEA EBX,[EBX+签枕]
CMP EBX,[EBP+册尾]
JAE +4 册尾???有效吗??
CALL 签名比较
JB -3
这里的成功可以直接写数据!!!
MOV ECX,[EBX+签数] 签数放在这里吗?
MOV EDX,[EBX+签壤]
RET
STC
RET
正下尾找签:
签宏比较
TEST [EBX+签性顶],10
JMP +1
串比较.... 输入的EDI,ECX与当前的[EBX]中.
签名比较 这是一个子程序
TEST [EBX+签咛],2 位1=1,都为定义签.
JZ 签不相同
CMP ECX,[EBX+签长]
JNZ 签不相同
PUSHAD
MOV ESI,[EBX+签址] 串在壤中位置
F3A6 REPZ CMPSB 搜索用和再还原的是SI,DI.
POPAD
JZ +1 相等则找到了
签不相同
STC 有借位,JB为不同.
RET
登绣 这里可以使用比较交换指令.
CMP EDI,[EBP+绣正] 注意,这里的绣正是指绣尾中正在使用的值.
JZ 登绣回 如果没有变化则不注册.
PUSH ESI 可以简化,但差不多.即用[SI]代替[绣正]
PUSH EDI
MOV ESI,[EBP+绣尾] 取绣段 可以用BX吗?
CMP ESI,[EBP+绣界]
JA DW 异常退出
MOV [EBP+绣正],EDI 放入伪壤.
MOV [ESI+4],EDI
ADD EDI,[EBP+段差] 前址中算入真壤.
MOV [ESI],EDI
ADD DW [EBP+绣尾],8
POP EDI
POP ESI
登绣回
RET
我怎么总是舍不得改变EDI?
交串集串 源ESI成串尾,ECX没有变化.但EDI也变化了.
XCHG ESI,EDI
PUSH -1
POP EBX 起码应有一个.使得其以0开始.
CALL 串集串环
XCHG ESI,EDI
RET
内增的串 大次数在EBX,小次数在EDX上.
INC EDX
串比较AL 此处也有两个人想进入.
CBW:CWDE AL的高位已经置为0了.
CMP EAX,ECX
JNZ 串集继续 串长不相同
PUSHAD:REPZ:CMPSB:POPAD
JZ 串集串成 成功 =0且没有进借位.
串集继续 串不相同
ADD ESI,EAX 在此点上,IA64和非64还是不一样.
串集串环
LODSB
SUB AL,80
JZ 串集败回
JA 内增的串
INC EBX 最高位为0是EBX增加的串 累计.
SUB EDX,EDX
ADD AL,80
JNZ 串比较AL
JMP 串集串环 空增的串 回串集串
串集串成
LEA EDI,[EDI+ECX]
RET
串集败回
MOV AH,1
SAHF 有借位,且不为零,没有找到串. 若AL=80
RET
串类子程序显得非常得多.
基本的为界类,和基本串普通串.
数引后取串 待16制串和引号串都取完后才取串.
CALL 取串 无余串返回JB,和有余串返回JNB.
JB 数引返回
重新数引 EBX作为其尾首是否连接的判断.
JZ 连写引号串
连写16制串
CALL 判写16制 有前后空符的要求.
JB 有余串返回 都仅在此处作还有余串.
16制查连引 16制数后面是否有引号数.
MOV EBX,ESI
INC EBX
CALL 取串
JB 取引无余串 无余串返回 其后取不到串了.
JNZ 取引无余串 如果不是引号错误.
CMP EBX,ESI EBX比ESI小. 使不等时有借位.
JZ 连写引号串
取引无余串
DEC EBX 不减好象也可以.
取16制无余串
MOV ESI,EBX
无余串返回
STC
数引返回
RET
连写引号串 都是JZ的才转到这里来.
REP:MOVSB
这里是引号后检查是否可以连16制.
INC ESI
MOV EBX,ESI
CALL 取串 多个引号也不行! 要用可在前加冒号.
JB 取16制无余串
JZ 取16制无余串 不许还有引号串,也不可作余串!
CMP EBX,ESI
JNZ 取16制无余串
CALL 判写16制
JNB 16制查连引 成功后继续检查是否可以连续引号
RET 无余串结束.
判写16制
CALL 判16制偶串
JAE -2 返回,数引败
CALL 前空符4种
JNZ 无余串返回
CALL 后断符6种
JNZ 无余串返回 与写败16制共用.
SHR CL,1
CALL 直译16制
STOSB
LOOP -1
有余串返回 与写成16制共用.
CLC
RET
读可延符 如果在没取到冒号前,是这些符号,不可取.
CALL 读一字节
JBE +7
CMP AL,20
JB +5
CMP AL,'`'
JZ +3
CMP AL,"'"
JZ +1
CMP AL,'"'
RET
前断符6种
CMP AL,D
JZ -1
CMP AL,A
JZ -3
前空符4种
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -