⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 Φ+

📁   原来一些32位版发表在 http://www.x86asm.com   因暂停。更新的版本改上传于你处。    在原来的基础上。 增加了简单的宏指令. 增加了链接分散的汇编文本能力. 增加
💻
字号:



   址,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 + -