📄 gs02.txt
字号:
CMP AL,A
JNZ -2 消行
继写库函串
CALL 英界符取串
JB 写库函串中
CMP DL,"."
JNZ +4
CALL 写导入表
ADD ECX,4
SUB EAX,EAX
JMP 写库函序名
CMP AL,A
JNZ +5
PUSH EDI
MOV EDI,[EBP+征函正]
CALL 注册函定签
POP EDI
JMP 写库函串中
CALL 写征募函
SUB EAX,EAX
STOSW
写库函序名
TEST CL,1
REP:MOVSB
JNZ +1
STOSB 是偶数写两个0,是奇数只写一个.
STOSB
CMP DL,","
JZ 继写库函串
CMP DL,"}" 登记结束.
JNZ 写库函串中
写库函串回
RET
写征募函
PUSH EDI
XCHG EAX,EDI
ADD EAX,[EBP+段基差]
MOV EDI,[EBP+征函正]
JZ +1 如果是写0,是一次结束标志,不用注册
CALL 注册函定签
STOSD
MOV [EBP+征函正],EDI
MOV EDI,[EBP+募函正]
STOSD
MOV [EBP+募函正],EDI
POP EDI
RET
写导入表
PUSH EDI
PUSH EDI
CMP DW [EBX+8],0 在PE头的目录中导入表位置.
JNZ +4
MOV EAX,[EBP+段基差]
ADD EAX,[EBP+导表正]
MOV [EBX+8],EAX
JMP +3 首次写导入表
MOV EDI,[EBP+段基差]
NEG EDI
CALL 写征募函
MOV EDI,[EBP+导表正]
MOV EAX,[EBP+募函正]
ADD EAX,[EBP+段基差]
STOSD
SUB EAX,EAX
STOSD:STOSD
POP EAX 这是库的址.
ADD EAX,[EBP+段基差]
STOSD
MOV EAX,[EBP+征函正]
ADD EAX,[EBP+段基差]
STOSD
MOV [EBP+导表正],EDI
POP EDI
RET
添PE段
CALL 检PE头部
添数据段
CALL 补齐段
CALL 添段内容
RET
数据段指令
CALL 添PE段
添段成回
POP EAX:POP EAX:PUSH ESI:PUSH EDI
POPAD:STC:RET
代码段指令
CALL 添PE段
MOV [ECX+24],60000020
添代码段回
MOV EBX,[EBP+PE领]
MOV EAX,EDI
ADD EAX,[EBP+段基差]
MOV [EBX+28],EAX
MOV [EBX+2C],EAX
MOV [EBX+30],EAX
JMP 添段成回
混合段指令
CALL 添PE段
MOV [ECX+24],E0000060
JMP 添代码段回
代码入口指令
MOV EBX,[EBP+PE领]
MOV EAX,EDI
ADD EAX,[EBP+段基差]
MOV [EBX+28],EAX
POPAD:STC:RET
补齐PE段
CALL 检PE头部
补齐段
MOV EBX,[EBP+PE领]
MOV EAX,EDI
SUB EAX,[EBP+产首] 或者另 SUB EAX,[EBP+段文正差]
PUSH EAX 这是每一个段中,文自己的绝对差.
SUB EDX,EDX
DIV DW [EBX+3C] 文齐
SUB EAX,EAX
NEG EDX 即使用户给的对齐值太小,也是不容易溢出的.
JZ +3
ADD EDX,[EBX+3C]
MOV ECX,EDX 只是计算需要补齐的长度.
REP:STOSB 此时的EDI已是对齐的文址了.
MOV ECX,[EBP+PE段领]
666B430628 IMUL AX,[EBX+6],28
ADD ECX,EAX 段数为0仍为段领,但不写数据.
TEST EAX,EAX 段数为1以上都写数.
POP EAX
JZ PE初始段
SUB ECX,28
SUB EAX,[ECX+14] 上一个段其源中位置
MOV [ECX+8],EAX 上一个段内存中长度
MOV [ECX+10],EAX 上一个段其源文中长度
ADD EAX,EDX
ADD EAX,[ECX+C] 用于计算下一个新段在的内存中的开始位置
ADD ECX,28 准备建新段
PE初始段
PUSH EAX
SUB EDX,EDX
DIV DW [EBX+38] 内存齐
NEG EDX
ADD EDX,[EBX+38]
POP EAX
ADD EDX,EAX 内存总的对齐,也是下一个新映段始址.
MOV EAX,EDI
SUB EAX,[EBP+产首] 这是下一个新的文段始.
RET
添段内容
INC WO [EBX+6] 段数目
CMP WO [EBX+6],4
JA DW 异常退出 目前只许4个段
MOV [EBP+PE段正],ECX
MOV [ECX+14],EAX 文
MOV [ECX+C],EDX 内存
CALL 登记段差
MOV [ECX+24],C0000040 默认为数据段.
SUB EAX,EAX
MOV [ECX+18],EAX
MOV [ECX+1C],EAX
MOV [ECX+20],EAX
PUSH EDI:PUSH ECX
MOV EDI,ECX
CALL 取串 指令码的名字. 还在吗? 对于INCLUDE?
MOV AL,"." 段的名字
STOSB:REP:MOVSB
POP ECX:POP EDI
RET
登记段差 本段基址为EDX,现段0址为EDI.
SUB EDX,EDI 本段基X=(现当前址x-现段0址)+本段基址
MOV [EBP+段基差],EDX 本段基差=本段基址-现段0址
ADD EDX,[EBP+总基址] 400000
MOV [EBP+段差],EDX 本段段差=本段基差+总基址
MOV [EBP+段文正差],EDI
RET
不是写叮指令
CLC
RET
写叮指令
CMP DX,2020 前后符都必须是空格
JNZ 不是写叮指令
CALL 常用叮
JB 不是写叮指令
叮领数环
MOV EBX,EAX
CALL 取串
JB 叮消行回
PUSH EDI
MOV EDI,[EBP+缓数值址]
CALL 取引数值 借为败,等为有数. 其它串为不等.
MOV AH,BH 由于有叮,BH没被变
POP EDI
JNZ +2
CALL 叮缓数入壤
JMP +2 可以改为允许混合数据.目前没有.略
OR AH,20 设成用签
CALL 留符注册签 EBX中保留着叮.EDX中留着前后符.
CMP DL,','
JZ 叮领数环
叮消行回
JMP DW 消行回
特符串 清0定位符,
MOV EBX,[EBP+册尾]
CMP AL,"$"
JNZ 查顶头串 61
CALL 判得16制数
JB 叮消行回 6C
MOV EAX,[EDI]
MOV EDX,EDI
SUB EDX,[EBP+产首]
SUB ECX,ECX
MOV CX,AX 这里关闭了对大于64K的清0跨段.
CMP ECX,EDX
JZ 符定原地
JA 符定差数
MOV CH,0
MOV DH,0
CMP CL,DL
JZ 符定原地 如果比当前址小,将为单字节对齐.
JA +1
MOV CH,1
符定差数
SUB CX,DX
MOV AL,0
REP:STOSB
符定原地
CMP [ESI],',' 其后为段或列签定义.
JNZ 查0符回
CALL 取串
JB 查0符回
CALL 判16制串
JB 符登段差 这里JB为是16制.
PUSH EDI
MOV EAX,EDI
SUB EAX,[EBP+产首] 计算最近的定位0点标签.
CBW:CWDE
SUB EDI,EAX 如果是串,则在此下定义了签.
MOV AH,12 行10 + 定义签2
CALL 注册签 伪壤注册签
POP EDI
JMP 查0符回 其后一般不取其它串.
符登段差
CALL 倒取16制数
MOV EDX,[EDI]
CALL 登记段差
JMP 查0符回
查顶头串
CMP AL,0A
JNZ 查赋值型串 其它符
CALL 后断符6种
JNZ 非法串
MOV AH,12 位1定02,行10. 顶头签是一种行号定义签.
CALL 留符注册签
CMP DL,20
JNZ 顶头串回
CALL 取串
JB 顶头串回
CALL 常用叮
JNB DW 叮领数环
查0符回
顶头串回
非法串
JMP DW 消行回 上两类的和串多余符的,一般应消行.
查赋值型串
CMP DL,"="
JNZ 其它临时符
CALL 前空符4种
JNZ 非法串 会增其它的特殊定义吗?
PUSHAD
CALL 判再取16制数 串已失去
POPAD
JB 非法串
PUSH [EDI]:POP [EBX] 低4字节
PUSH [EDI+4]:POP [EBX+4] 高4字节
MOV AH,2 纯定义签
CALL 注册签
JMP 非法串 这里目前还不是很好做.
其它临时符
MOV AH,20 特殊的用签.并且单字节.
CMP AL,"@"
JZ 即写符方式
MOV AH,60 用签,并且4字节
CMP AL,"%"
JZ +6
CMP AL,"!" 数据段
JZ +4
CMP AL,"|" 代码段
JZ +2
CMP AL,"&" 数据基本段
JNZ 其它串
即写符方式
CALL 后断符6种
JNZ 非法串 不合法
JMP DW 注册签
其它串
CLC
RET
写简指令 STC表示串已用完或无串. CLC则表示串还要继续其它.
MOV EBX,单指令
CALL 串换单 返回AL为
JB +3
STOSB
STC
RET
MOV EBX,单扩指令
CALL 串换单 返回AL为
JB +4
MOV AL,66
STOSW
STC
RET
CLC
RET
写多指令
PUSHAD
MOV EDI,多指令
柜循环
MOVSX EDX,WO [EDI] 起码应该是有一个柜的.
TEST EDX,EDX
JZ 无多指令 是否为0.
MOV EAX,[EDI+码集型]
SUB EDX,EDX
MOV DL,AH
AND DL,F 这是班次员数
MOV [EBP+领班次],EDX
MOV [EBP+领员数],EDX
MOV DL,AH
SHR DL,4 这是码名长度.只对1号3号类型有效.
MOV [EBP+码名长],EDX
MOV [EBP+领码集型],AX
MOV [EBP+又领码集型],AX
PUSHAD
LEA EDI,[EDI+码名集] 注意,此处码名集为单字节!
SUB EBX,EBX 这是码序
CALL 匣中找码 在码匣中
JZ 找到码了
POPAD
MOVSX EDX,WO [EDI] 起码应该是有一个柜的.
ADD EDI,EDX
JMP 柜循环 是否为0.
无多指令 柜大败
POPAD
CLC 未知串
RET
找到码了
MOV CL,[EBP+领码集型] 只使用了低3位.
AND CL,7
SHL EBX,CL
MOV [EBP+领码序],EBX 真正的位置.
MOV [EBP+又领码序],EDX 有时被作为叮
POPAD
从这里或下面开始,进行invoke指令.函式呼叫,呼用,唤起
ADD ESI,ECX
PUSHAD 班中成员到齐
MOV EDI,[EBP+缓数值址] 每个班员
CALL 取RM每班 现在的ESI和原来的ESI我也没怎么考虑.
MOV [EBP+文正],ESI
POPAD
JB 无多指令 未知串
CALL 匣中处理
JNB 无多指令
POP EBX
PUSH EDI
POPAD
MOV ESI,[EBP+文正]
STC
RET 写壤成功.
呼函指令
ADD ESI,ECX
SUB EAX,EAX
MOV [EBP+领码集型],EAX
MOV [EBP+领码序],EAX
MOV [EBP+又领码序],EAX 有时被作为叮
MDMOV [EBP+原缓数值址],[EBP+缓数值址]
MDMOV [EBP+领班次],[EBP+限取班次] 空间限制的数量.
MOV EDI,[EBP+缓数值址]
CALL 取RM每班 领班次被倒减
MOV EBX,[EBP+缓数值址]
MOV AL,[EBX+签性]
MOV AH,AL
AND AL,DF 除去位5的20代.
CMP AL,50 将无址立即数加址.
JNZ +2
OR AH,80
MOV [EBX+签性],AH
MOV [EBP+文正],ESI
MOV EBX,EDI 缓所到达的位置
MDSUBR [EBP+领班次],[EBP+限取班次] 回正值
MDCMP [EBP+领班次],[EBP+可用班次] 可靠性的数量
JAE 呼函败 大错误, 太多了.不可靠. 消行回
MOV BY [EBP+领员数],1
SUB EBX,签枕值
MOV [EBP+缓数值址],EBX
DEC DW [EBP+领班次]
JS 呼函败 负数,大错.消行回
JZ CALL参数 只取到一个参数时
PUSH参数环
MOV EDI,PUSH柜
CALL 匣中处理
JNB 呼函败
SUB DW [EBP+缓数值址],签枕值
POP ECX
PUSH EDI 新的生产进度
DEC DW [EBP+领班次]
JNZ PUSH参数环
CALL参数
MOV EDI,CALL柜
CALL 匣中处理
JNB 呼函败
MDMOV [EBP+缓数值址],[EBP+原缓数值址]
POP EBX
PUSH EDI
POPAD
MOV ESI,[EBP+文正] 新地进度成功.
STC
RET 写壤成功.
呼函败
MDMOV [EBP+缓数值址],[EBP+原缓数值址]
POPAD
MOV EDI,[EBP+原产正]
JMP DW 消行回
INCLUDE 匣柜处理GS02.TXT 形象地说:从装有数据的匣柜中取出数据
INCLUDE 后期检查GS02.TXT 生成程序后,写入用户预定义的一些值
INCLUDE 装配代码GS02.TXT 装配方面的子程序
INCLUDE 终汇编名称数据等GS02.TXT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -