📄
字号:
匣中处理
进行invoke指令.函式呼叫,呼用,唤起
MOVSX EAX,WO [EDI+码匣距]
每个匣
MOVZX ECX,BY [EBP+领员数]
MOV EBX,[EBP+缓数值址]
ADD EDI,EAX EDI作为每个匣的匣首. ESI作为其内部.
LEA ESI,[EDI+1] 跳过小距,即RM匣距
每个员适
MOV EAX,[EBX+签性]
CALL [ESI]
JNZ 继匣
LODSD
LEA EBX,[EBX+缓枕]
LOOP 每个员适
DEC ESI
LODSW 将RM檩放到AH中
POP ECX call进来压的EIP
POP EDI 如果整个失败,好象还可重写似的.
PUSH EDI 真正的壤EDI
PUSH ECX
CALL RM入壤 这里进入了入壤阶段了. 入壤时,是否有檩??
STC
RET 写壤成功后,也是一个码中的一切都结束了.
继匣
MOVZX EAX,BY [EDI]
TEST EAX,EAX
JNZ 每个匣
CLC 柜大败,未知串.
RET
RM入壤 此时EBX为缓X? EDI匣首,ESI匣内.
TEST AH,1
JNZ 加长指令入壤
MOV EBX,[EBP+缓数值址]
LEA EDX,[EBX+缓RM帜] 为缓RM咛 + 缓枕 或者加两次也可以
MOV ECX,[EDX] 取出成员第一个为CX和第二个为DX.
MOV EDX,[EDX+签枕]
TEST AH,80 是否先写66. 数据前缀是跟随第一个还是共同.
CALL RM数据前缀
TEST AH,40 是否有前缀0F.
JZ +2
MOV AL,F
STOSB
TEST AH,20 是否先写一个到壤中.
JZ +1
MOVSB 所有在匣中的值必须全部取完.
LODSB 然后,将ESI变成了缓.
X OR AL,[EBP+领码序] 好象不能提前写领码序.
PUSH [ESI]
MOV ESI,EBX 缓放入ESI中.
MOV EBX,ECX 总叮 一般是RM1的叮.
RET 或 JMP EAX 各个子程序天地了.
檩中数据.10位4前缀随1/2. 20位5是否先写1字节.
40位6是否当前指令码强行四字节.
加长指令入壤 1/2前加,4后加. 8W叮.80写序 10RM1,20RM2.
LODSB
XCHG EAX,EDX
MOV DH,[EBP+领码序]
MOV AH,[EBP+又领码序] 咛
TEST DL,1
JZ +1
MOVSB
TEST DL,2
JZ +1
MOVSB
TEST DL,8
JZ +8
CMP AH,1 咛
JNZ +2
MOV AL,66
STOSB
LODSB
JB +1
OR AL,1
STOSB
TEST DL,80
JZ +1
OR [EDI-1],DH 原序.
MOV ECX,[EBP+缓数值址]
TEST DL,10
JNZ +3
TEST DL,20
JZ 加长尾字节
LEA ECX,[ECX+签枕]
LODSB
PUSH EDX
PUSH ESI
MOV ESI,ECX
MOV EBX,[ESI+签性]
PUSH EBX
CALL RM型
POP [ESI+签性]
POP ESI
POP EDX
加长尾字节
TEST DL,4
JZ +1
MOVSB
CMP BY [ESI],0
JNZ 加长指令入壤
RET
RM数据前缀
JZ 共同定叮 是0则转向共同的
TEST CH,80 跟随第一个的.
JNZ 写RM数据前缀
TEST CH,1
JZ +5
TEST AH,10
JZ +3 是否强行为4字节. 主要用于J类的非单字节偏移.
AND CH,FE PUSH的如果是默认双字节I,也在此改为四字节.
OR CH,40 其它的RETN,ENTER,等,目前不计.判s!!! ??
MOV [EBX+签咛],CH
RET
共同定叮
TEST CH,80
JZ 第二个叮 如果第一个无叮,转第二个
CMP BY [SI],80 只有WRM_sI型,第二个不被第一个改.
JZ 写RM数据前缀
MOV AL,CH
AND AL,41
AND DH,BE 第一叮有,将第二个改为第一个叮.
OR DH,AL
ADD EBX,签枕
MOV [EBX+签咛],DH
SUB EBX,签枕
JMP 写RM数据前缀
第二个叮
MOV AL,DH
AND AL,41 不管第二个有无叮,都将第一个改为第二个叮.
AND CH,BE
OR CH,AL
MOV [EBX+签咛],CH
写RM数据前缀
TEST CH,1 00,01,40,41. 有叮就简单的,位6=1就当WO了.
JZ +2 不是WO情况,不写数据前缀.
MOV AL,66
STOSB 实际上只有带叮的和由第二个决定的,WO型才加上了66!!
RET
这里可以进行加强型处理.
环RM每班
BTR EBX,10 断句标志
JB 班次错 错误. 次数未满发生断句,错误.
BTR EBX,12 断词标志
JNB 班次错 必须有逗号来断词.
取RM每班
MOV EBX,10 什么也没有的意思.
TEST BY [EBP+领码集型],80
JZ +1
OR BL,80 位7有址.
CALL 缓取RM员 进入取一次RM员
JB 班次错
TEST BL,10 位4反有R
JZ +2 有R
TEST BL,40 位6I
JZ 班次错 错误,没有实际数据
MOV [EDI+缓RM帜],EBX 数据全部入EDI
LEA EDI,[EDI+缓枕]
TEST BL,20 是否有代号型串
JZ +1
ADD ESI,ECX 代号的进
BT EBX,12
JB +1 已经有断词
CALL RM查符 目前,并没有检查多余的班次.
DEC DW [EBP+领班次] 一个班中一般有1-3个由逗号分开的RM成员
JNZ 环RM每班 RM班次循环
CLC
RET 正确性取完数据
班次错
STC
RET
RM查符 检查断句符,址符等的情况.
PUSH ESI
MOV CL,5
RM查符环
CALL 读一字节
JB RM断句
CMP AL,D
JZ RM断句
CMP AL,A
JZ RM断句
CMP AL,'`'
JZ RM断句
CMP AL,","
JZ RM断词 返回
CMP AL,'['
JNZ +2 置址标志
OR BL,80
JMP 继RM查符
CMP AL,']'
JNZ +2
BTS EBX,11 位10是断句标志, 位11是后址符]的标志.
JMP 继RM查符 位12是断词标志.
CMP AL,"'"
JZ 无逗号
CMP AL,'"'
JZ 无逗号
CALL 英界符检查
JNB 无逗号 已经不再是符号时
继RM查符
DEC CL
JNZ RM查符环
JMP RM断句
无逗号 在下一个串之前是否发生逗号.
BTR EBX,11 测试后址符标志,并且清.
JNB 还可取 没有[符, 只有这里可以: 词语内后继取串
RM断句
BTS EBX,10
STC 断句
还可取
POP ESI
RET
RM断词 内部断词 外部断词.
POP EAX ESI继续
BTS EBX,12
STC 词内不可再取.
RET
匣中找码 下面为各种码集型,不等为无,相等则为有.
TEST AL,10 单一码
JZ +4
CMP ECX,EDX
JNZ +1 柜败回
REP:CMPSB
RET
TEST AL,20 叶集码
JZ +2
CALL 交串集串
RET
TEST AL,40 补叶集码
JZ 两补叶
TEST DL,DL
JZ 外补叶
SUB ECX,EDX 要起码要比补前名称长
JA +3 必须大
此柜败
MOV AH,1
SAHF 柜失败,不等回
RET
XCHG ECX,EDX 剩下的长度入EBX中.
REP:CMPSB 原来的长度在EAX中.
JNZ 此柜败
MOV ECX,EDX 剩下长度
外补叶
MOV EDI,[EDI] 串叶位置
CALL 交串集串
RET
两补叶
TEST AL,80
JZ 此柜败
SUB ECX,2
JBE 此柜败
LODSW
PUSH EDI
PUSH ECX
MOV EDI,[EDI] 双顺M 加长叮
MOVZX ECX,[EDI]
INC EDI
REPNZ:SCASW
MOV EDX,ECX
POP ECX
POP EDI
JNZ 此柜败
PUSH EDX 首叮序EDX和第二次序EBX.
SCASD 首叮的址去掉.
CALL 外补叶
POP EDX
RET
常用叮
PUSH EBX
MOV EBX,叮杆址
CALL 串换单
POP EBX
JB +3
AND BH,3E 让位760=0
OR BH,AH
CLC 成. 并且写入BH中了.
RET
常用REG 将REG转化到AL .
PUSH EDI
PUSH EBX
PUSH EDX
MOV EDI,REG叶址
CALL 交串集串
JB +1
MOV EAX,EBX
POP EDX
POP EBX
POP EDI
RET
串换单 EBX为杆址
PUSH EDI
PUSH ESI
PUSH EAX
MOV EDI,ESI EDI为源.
MOV ESI,EBX ESI为杆.
串换单环
LODSW
CMP AL,CL
JNZ 串单环增
PUSHAD
REPZ
CMPSB
POPAD
JZ 串单成 成功RET返回
串单环增
CBW
CWDE
ADD ESI,EAX
CMP AL,0
JNZ 串换单环 继续
POP EAX
POP ESI
POP EDI
STC 串单循环失败
RET
串单成
MOV AL,AH
POP ESI
POP ESI
ADD ESI,ECX
POP EDI
CLC
RET
留符注册签
PUSH EDX:PUSH EBX EDX中留着前后符.
CALL 注册签
POP EBX:POP EDX
RET
注册函定签
PUSHAD
MOV AH,12 行号性质的定签
CALL 注册签
POPAD
RET
注册签
MOV EBX,[EBP+册尾]
MOV [EBX+签性],DW 0
MOV [EBX+签咛],AH AL中暂时存放着前符.
MOV [EBX+签壤],EDI
MOV [EBX+签址],ESI
MOV [EBX+签长],ECX
MOV [EBX+签符],EDX DL后符,DH前符.
TEST AH,38
JZ 不写签数的签
MOV EDX,EDI 原壤
TEST AH,20 用签
JZ +1
CALL 数值入壤 虚拟写壤,ESI的假数据. 即ESI不变
TEST AH,18 检查行偏10或行差8
JZ +1
MOV EDX,EDI 用行的定签,没有经过入壤,在此仍不变.
ADD EDX,[EBP+段差] 计算真壤, 用行签为偏后的.
MOV [EBX+签数],EDX
不写签数的签 如赋值签类,事先已写好签数.
LEA EBX,[EBX+签枕]
MOV [EBP+册尾],EBX
CMP EBX,[EBP+册界]
JA DW 异常退出
ADD ESI,ECX
STC
RET
无址取R
CALL 常用REG 叮在AL的高位的方式.
JB 无址代I
AND BL,EF 置有R标记 0表示有,1表示无.
MOV AH,AL
AND AH,7
OR BL,AH REG合成到BL中去.
OR BH,80 如果无址则置有叮 6ZF,0CF:00=1,01=2,10=4
CMP AL,8
JB +4
OR BL,8 有W位.
CMP AL,10
JAE +3
OR BH,1 OR和AND类指定恒定无借位!
CLC
RET
OR BH,40
RET
缓取RM员
MOV [EDI+1C],40404040 表示空的标志.
CALL RM查符
JB 败RM缓
TEST BL,80
JNZ 有址取RM
如果无址的情况
CALL RM取串
JB 败RM缓
JZ 成RM缓 取到立即数时,叮已入BH.
CALL 取叮值
JB 无址取R 没有取到叮
OR BH,AL
CALL RM查符
JB 败RM缓
TEST BL,80
JNZ 有址取RM
CALL RM取串
JB 败RM缓
JZ 成RM缓
无址代I
有址代I
OR BL,60 置I代.
OR BH,20 置用签 回
成RM缓
回RM缓
MOV [EDI+签符],EDX
MOV [EDI+签址],ESI
MOV [EDI+签长],ECX
CLC
RET
败RM缓
STC
RET
环RM址 循环取
CALL RM查符
JB 回RM缓
有址取RM 如果有址
CALL RM取AL串
JZ 有址纯I 有点远
JB 回RM缓
取到叮值时
CALL 简叮值
JB 有址取R
MOV CL,RM座叮
CALL 入座
JB 败RM址
CALL RM查符
JB 回RM缓
CALL RM取AL串
JB 败RM址
JNZ 有址代I 同无址代I 75BA
纯I入座
CALL 换叮值
OR BL,40 置有I
PUSH ECX
MOV CL,RM座叮
CALL 入座
POP ECX 这一个叮入座不计失败
JMP 成RM缓
败RM址
STC
RET
有址取R
CALL 常用REG
JB 有址代I 对于有址的R目前不严,都作32位.以后再说.
AND AL,7 只取其低3位. 都当32位处理.
AND BL,EF 置有R标记 0表示有,1表示无.
OR BL,AL
CMP DL,'*'
JZ R2入座
CMP DH,'*'
JZ R2入座
MOV CL,RM座R1
CALL 入座
JNB 环RM址 继续循环取.
R2入座
MOV CL,RM座R2
CALL 入座
JB 败RM址
转环RM址
JMP 环RM址 继续循环取.
有址纯I
CMP DL,'*'
JZ 有址的N
CMP DH,'*'
JZ 有址的N
JMP 纯I入座
有址的N
MOV EAX,[DI]
CMP EAX,9
JA 败RM址
MOV CL,RM座N
CALL 入座
JNB 转环RM址 继续循环取.
STC
RET
RM取AL串
PUSH EBX
SUB EBX,EBX
CALL RM取串
MOV AL,BH
POP EBX
RET
简叮值
PUSH EBX
MOV EBX,简叮杆址
CALL 串换单
POP EBX
RET
取叮值 使用了串换单子程序, 将值取到了AL,AH中.
PUSH EBX CLC为成功.
MOV EBX,叮杆址
CALL 串换单
POP EBX
RET
换叮值
PUSH EBX
MOV EBX,换叮址
XLAT
POP EBX
RET
入座 有借,小于不等为座满.
MOVZX ECX,CL
CMP [EDI+ECX],20
JB +1 目前一般CF=1为失败.
MOV [EDI+ECX],AL 无借 大于或等于为入座
RET
RM座R1=1C
RM座R2=1D
RM座叮=1E
RM座N=1F
换叮址
00014041
简叮杆址
0200"BY"
0201"WO"
0202"DW"
0203"QW"
0000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -