📄 Φ+
字号:
址,I,代,有R,W.reg.
判CL 纯AL 注意仅有R是相反的,0表示有R,1表示无R.
CMP AL,1
RET
判AX 非AL的
CMP AL,8
RET
判AW 无代,无I,无址,有R,且reg=000
TEST AL,F7 0000X000
RET
判EAX 只在IN/OUT中用. 为纯的AL,AX,EAX三种
判DX 只在IN/OUT中用. 只为纯DX
判R 只W=1且有R.
AND AL,F8 00000XXX=00001XXX
CMP AL,8
RET
判WR 只要有R.
TEST AL,F0 0000XXXX
RET
判1I 为0100且DAT=1
CMP AL,50
JNZ +3 分败
CMP [EBX+签长],1
JNZ +1
CMP [EBX],1
RET
判改16I RETN和ENTER中强行RM1的.
OR [EBX+签咛],1 此类一般为单字节.改默认双字节,
JMP +2 但不要强行为带叮双字节!!
判8I 8J 无[,有dat.或为 0100或1100
AND AH,41 要为单字节.
JNZ +2
判I
AND AL,DF 除去位5的20代.
CMP AL,50
RET
判M 有[,无R 要为1XX10000 !!
AND AL,D0 或者90
CMP AL,D0
RET
判8RM
AND AH,41
JNZ -1
判WRM 不可为IMM, 即:无[时无MOD.
判RM
TEST AL,80
JNZ 判成零 有址,是的.
TEST AL,F0 无址要有R.
RET 分成
判MR 只要有[
AND AL,80
CMP AL,80
RET
判RM加址I INVOKE专用.如果是I将加上址.
AND AL,DF 除去位5的20代.
CMP AL,50
JNZ 判成零
OR BY [EBX+签咛],80
判成零
CMP AL,AL
RET
第3s型
PUSH ESI
LEA ESI,[ESI+签枕]
JMP +1
第2s型
PUSH ESI
LEA ESI,[ESI+签枕]
TEST BH,41 PUSH的不在此类.
JZ 主s型回 主体是单字节,就不用了.
JMP +1
第1s型
PUSH ESI
TEST [ESI+签咛],41
JNZ 主s型回 该数或代不是单字节,也不用加s.
TEST [ESI+签咛],20
JNZ +7 有代号,直接置s吧.
CMP [ESI+签前符],"-"
JZ +3
CMP [ESI],80 正号要为0-7F 才加s
JB +3
JMP 主s型回
CMP [ESI],80 负号要为80-FF 才加s
JB +1 上面译成了827E0080 ?也是吗?
OR AL,2
POP ESI
RET
主s型回
PUSH EBX
AND BH,41
AND [ESI+签咛],BE
OR [ESI+签咛],BH 主咛不一定跟着第一个CH的.
POP EBX
POP ESI
RET
码序尾W
OR AL,[EBP+领码序]
加尾W
TEST CH,41
JZ +1
OR AL,1
RET
R型 只有PUSH/POP中有. 很简单.
MOV DL,CL
AX_R型 即尾R型 在XCHG中.也可在INC中
OR AL,[EBP+领码序]
AND DL,7
OR AL,DL
STOSB
RET
sI型 只在PUSH中用. 如果不是单字节,一般默认置了32位了.
CMP CX,2070 没有叮且有代的
JNZ +2
MOV CH,60 改为四字节,此点不同于J类.
MOV [ESI+签咛],CH
CALL 第1s型
TEST AL,2
JNZ +5 已可以是单字节.出
MOV AH,CH 或BH也可.
TEST AH,BE
JNZ +1 默认单字节,但不可为单字节的.
OR AH,40
MOV [ESI+签咛],AH 强行改为32位.
MOV AH,[ESI+签咛]
JMP DW 写注册IMM
WR_I型 这里的WR 是合在一起的,不同于WR_RM中的WR.
XX OR AL,[EBP+领码序] 好象无.只MOV专用了一次.
TEST BH,41
JZ +1
OR AL,8
AND CL,7 第一个中的R写入.
OR AL,CL
STOSB
JMP +2 叮跟随RM1性.
W_I型 实为WA_I型 只在ADD类中有.
CALL 码序尾W 当是8I,且不是AL时,用WRM_sI省位置些.
STOSB 只有当不是8I时,这个适合.
AND CH,41 W8I
MOV AH,DH
AND AH,BE
OR AH,CH 这里有叮强制跟随RM1性.
LEA ESI,[ESI+签枕]
JMP DW 注册IMM
AW_M型
CALL 加尾W
MOV EBX,EDX 其用签情况使用第二个.
LEA ESI,[ESI+签枕]
JMP +1
M_AW型 跟随2一定要做好.
CALL 加尾W M型 好象只在与MOV的AW才有.
STOSB
MOV AH,BH 其用签跟1,叮应是跟2的.
AND AH,FE
OR AH,40 改必须32位的IMM写入址中.
JMP DW 注册IMM
I型
STOSB
MOV AH,CH
JMP DW 注册IMM
16I_8I型
CALL I型
JMP 注册第二IMM
WRM_sI型 这个的s和W要优先做.
CALL 第2s型 如果s没成功,则其咛要使用主体的!!
WRM_8I型 共用?
WRM_I型 在MOV和TEST中. 为咛共同型,其严格要求前后相同!
CALL 加尾W
STOSB
MOV AL,0 一般是在此处由序再充满,到中间三位的.
RM_8I型 这些类型的第二个I咛都是怎么被控制的?
OR AL,[EBP+领码序] 对于BT类. 已有AL的.
CALL RM型
注册第二IMM 第二个以后的
LEA ESI,[ESI+签枕]
MOV AH,[ESI+签咛]
JMP DW 注册IMM
RM_R_8I型 只在SHRD类中.
CALL RM_R型
注册第三IMM
LEA ESI,[ESI+签枕]
JMP 注册第二IMM
R_RM_sI型 只IMUL的
CALL 第3s型
STOSB
CALL R_RM型
JMP 注册第三IMM
R_WRM型 只在MOVSX类中用. W由RM2决定.
MOV CH,DH
WR_RM型
CALL 加尾W 尾W一般看CH的.
R_RM型
MOV EBX,EDX RM唱主角.在预写中,RM已跟了WR.
MOV DL,CL 交换, 第二个RM改在BX中, 而第一个R换到DL中.
LEA ESI,[ESI+签枕]
JMP RM_R型
RM_WR型
CALL 加尾W
RM_R型 BT类
OR AL,[EBP+领码序]
STOSB
MOV AL,DL
AND AL,7
SHL AL,3
JMP RM型 呵,就在下面.
RM0型 只在SET中,补0.
OR AL,[EBP+领码序]
STOSB
MOV AL,0
JMP RM型
WRM型 只在INC中.
CALL 加尾W
STOSB
MOV AL,[EBP+领码序]
RM型 RM原来的咛? 目前好象没有什么意义!!!
MOV AH,BL 或MOV AH,CL 如果第一个是RM的话.
AND AH,7
OR AL,AH RM中的R装入AL中. mod__rm
MOV AH,BH
MOV BH,BL 在RM中BH为原始主咛,没什么用.改为其帜.
AND BL,D0 观察7,6,4三个位.
JNZ +3
OR AL,C0
STOSB 纯R型
RET
CALL 合成MR
JNB -1
POP EBX
CLC
RET 合成MR失败
8J型
MOV AH,0 8位
JMP +1
J型
MOV AH,40 32位
OR AL,[EBP+领码序]
STOSB
TEST CL,20 是否有代号
JZ +2
OR AH,30 行号偏
JMP 注册IMM
MOV EDX,[ESI+签符] DL为串后符,DH为串前符.
CMP DH,'+'
JZ +2
CMP DH,'-'
JNZ DW 数值入壤 没有代号的,又不是行差,直接就是数值入壤
PUSH [ESI] 取出原缓数,写入缓RM长
POP [ESI+签长]
PUSH [EBP+绣尾]
POP [ESI+签址] 对于行差,签址为签绣
OR AH,28 行差数
JMP +1
写注册IMM
STOSB ESI保持不变
注册IMM 注册体中加一个先写单字节的.
MOV DW [ESI+签性],0
MOV [ESI+签咛],AH 新真正当前要写数据的咛.
注册MEM
MOV [ESI+签壤],EDI
CALL 数值入壤
TEST AH,20
JZ 注册IMM回 没有发生用签类.注册也结束.
PUSH EDI
PUSH ESI
MOV EDX,EDI 原壤
TEST AH,18 检查行偏10或行差8
JZ +1 位3行差数和位4的行号偏,将入壤后的EDI写入了签数中.
MOV EDX,EDI 非行偏行差的直接用签,不用算后值.
ADD EDX,[EBP+段差] 计算真壤, J类则为算后壤.
MOV [ESI+签数],EDX
MOV EDI,[EBP+册尾]
MOV ECX,签枕值
REP:MOVSB
CMP EDI,[EBP+册界]
JA DW 异常退出
MOV [EBP+册尾],EDI
POP ESI
POP EDI
注册IMM回
RET
合成MR
MOV CX,[ESI+1C] CL为REG1, CH为REG2
MOV DX,[ESI+1E] DL为小叮, DH为N倍数
CMP DL,40
JZ +8
PUSH EAX 更换主叮以址叮为标准.
MOV AL,DL
CALL 换叮值
MOV EBX,[ESI+签性]
AND BH,BE 41反=1011,1110
OR BH,AL
MOV [ESI+签咛],BH
POP EAX
MOV BL,DH 倍数放入BL中.
优化EBP
CMP DX,4040 如果没有倍数,且没有disp,
JNZ 优化ESP 有倍数的
CMP CH,40 即有单倍的其它REG2.
JZ 优化ESP 检查单址ESP.
CMP CL,5 且REG1为EBP时, 交换REG2与REG2
JNZ 优化ESP
XCHG CL,CH
优化ESP 如果ESP在REG2上.
CMP DH,40 如果是没有倍数,且idx为ESP.
JNZ 错址ESP
CMP CH,4 倍数为:0001, 或40.
JNZ 单址ESP
XCHG CL,CH 则REG1与REG2交换
单址ESP 仅仅只有REG1且为ESP的
CMP CX,4004
JNZ 错址ESP
OR AL,4
MOV AH,24 转disp.
CALL 处理DISP类
STOSW
JMP MEM处理
直接处理DISP 分址中的无REG2的转向了此处
CALL 处理DISP类
OR AL,CL 即使无REG2,也必强行有REG1
STOSB
JMP MEM处理
错址ESP REG2为ESP的. 没有倍数或倍数不为0都错.
CMP CH,4
JNZ 分址Nss
CMP DH,0
JNZ RM合成败
MOV DH,1 因为要处理DISP类. 只好再入.
分址Nss
CMP CH,40
JZ 直接处理DISP 无REG2,此时一般不会有SIB字段.
CMP CL,40 没有REG1,只有REG2
JNZ 换址Nss REG1,REG2都有的
CMP DH,2 为2倍且disp32的除外
JNZ +2
TEST DL,2 DW型和DQ型: 10与11.
JZ 换址Nss
CALL 单单分N
JB +2 合成SIB 分址Nss成功后.
MOV DH,BL
MOV CL,CH
换址Nss
CALL 处理DISP类 将disp弄正确.
CMP CH,40
JZ 没有REG2
CALL 单单换N 此时REG1是铁定有的.
JB RM合成败
合成SIB
MOV AH,CH 必须有REG2才会进.
SHL AH,3 高移,变大
OR AH,BL 倍数的ss位段
OR AH,CL
AND AL,F8 底3位为假ESP
OR AL,4 假ESP
STOSW
JMP +1
没有REG2 为什么不OR AH,CL呢?
STOSB
MEM处理
TEST BH,40
JZ +2 无I 直接成功回
MOV AH,DL 有I的,进行注册MEM.
CALL 注册MEM
CLC
RET
RM合成败
STC
RET
处理DISP类
MOV EBX,[ESI+签性]
MOV DW [ESI+签性],0
MOV [ESI+签咛],BH
前址EBP
TEST BL,40
JNZ disp32处理 有I
CMP CL,5
JNZ disp32处理 无I,其它数据的.
OR BL,40 置有I,好象用于SIB之后用.
MOV DL,0
MOV DW [SI],0
JMP 壤叮8位 mod=01
disp32处理 没有REG1时.(不会REG2和I都没有吧?)
CMP CL,40
JNZ disp处理
MOV CL,5 假设使REG1又有为EBP,其后SIB会自动组装
OR BL,40 置有I,也可能原来就有I. mod=00!!!
JMP 置32位址
disp处理
TEST BL,40
JZ 处理DISP回 无I
CMP DL,40 有I但无叮? 置为单.
JNZ +1
MOV DL,0
CMP DL,0
JNZ 壤叮32位
TEST BL,20
JNZ 壤叮8位 若有代I的单字节会跳过检查下面的偏差.
CMP [ESI+签前符],'-'
JZ +4
CMP [ESI],80 或者不是单字节正号
JNB 壤叮32位
壤叮8位
OR AL,40 mod=01 单字节
JMP 全壤叮
CMP [ESI],80
JNB -2
壤叮32位
OR AL,80 mod=10 全尺寸
置32位址 有纯[disp32]的也转向此.其mod=00,DL=2
MOV DL,2 不是单字节负号,置四字节.
全壤叮
PUSH EAX
XCHG EAX,EDX
CALL 换叮值
XCHG EAX,EDX
POP EAX
AND BH,BE 叮的反位清0
OR DL,BH 写全壤用的叮放入DL中.
CMP [ESI+RM座叮],40 原本无叮的,新叮应当入册.
JNZ +1
MOV [ESI+签咛],DL
处理DISP回
MOV BH,BL 签性放入BH中.
MOV BL,DH BL中放着倍数
RET
单单分N
PUSH EDI
PUSH ECX
MOV EDI,分Nss址
XCHG EAX,EBX
CALL 单换单
XCHG EAX,EBX
POP ECX
POP EDI
RET
单单换N
PUSH EDI
PUSH ECX
MOV EDI,换Nss址
XCHG EAX,EBX
CALL 单换单
XCHG EAX,EBX
POP ECX
POP EDI
RET
单换单
MOV CL,[EDI]
INC EDI
MOVZX ECX,CL
SCASB
JZ +4
INC EDI
LOOP -2
STC
RET
MOV AL,[EDI]
RET
分Nss址
040201
0302 01
0504 10
0908 11
换Nss址
054000
0100
0240 01
0480 10
08C0 11
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -